2023-12-14 10:47:11 +13:00
|
|
|
defmodule Ash.Test.Resource.Validation.EmbeddedResourceTest do
|
|
|
|
@moduledoc false
|
|
|
|
|
|
|
|
use ExUnit.Case, async: true
|
|
|
|
|
|
|
|
defmodule ActorAndAuthorizeMustBeInContext do
|
|
|
|
use Ash.Resource.Validation
|
|
|
|
|
|
|
|
def validate(changeset, _opts) do
|
2023-12-14 11:11:52 +13:00
|
|
|
case changeset.context do
|
|
|
|
%{private: %{actor: _, authorize?: _}} ->
|
|
|
|
:ok
|
|
|
|
|
|
|
|
_ ->
|
|
|
|
{:error, "not good"}
|
2023-12-14 10:47:11 +13:00
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
defmodule ActorAndAuthorizeMustBeInSourceContext do
|
|
|
|
use Ash.Resource.Validation
|
|
|
|
|
|
|
|
def validate(changeset, _opts) do
|
2023-12-14 11:11:52 +13:00
|
|
|
case changeset.context do
|
|
|
|
%{__source__: %{context: %{private: %{actor: _, authorize?: _}}}} ->
|
|
|
|
:ok
|
|
|
|
|
|
|
|
_ ->
|
|
|
|
{:error, "not good"}
|
2023-12-14 10:47:11 +13:00
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
defmodule EmbeddedResource do
|
|
|
|
use Ash.Resource, data_layer: :embedded
|
|
|
|
|
|
|
|
attributes do
|
|
|
|
uuid_primary_key :id
|
|
|
|
attribute :name, :string, allow_nil?: true
|
|
|
|
end
|
|
|
|
|
|
|
|
validations do
|
|
|
|
validate {ActorAndAuthorizeMustBeInSourceContext, []}
|
|
|
|
end
|
|
|
|
|
|
|
|
changes do
|
|
|
|
change fn changeset, _ ->
|
2023-12-14 11:11:52 +13:00
|
|
|
case changeset.context do
|
|
|
|
%{private: %{actor: _, authorize?: _}} ->
|
|
|
|
changeset
|
|
|
|
|
|
|
|
_ ->
|
|
|
|
Ash.Changeset.add_error(changeset, "uh oh!")
|
2023-12-14 10:47:11 +13:00
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
defmodule Resource do
|
|
|
|
use Ash.Resource, data_layer: Ash.DataLayer.Ets
|
|
|
|
|
|
|
|
attributes do
|
|
|
|
uuid_primary_key :id
|
|
|
|
|
|
|
|
attribute :embedded_resource, EmbeddedResource
|
|
|
|
end
|
|
|
|
|
|
|
|
actions do
|
|
|
|
defaults [:read, :create]
|
|
|
|
default_accept [:embedded_resource]
|
|
|
|
|
|
|
|
update :update do
|
|
|
|
argument :embedded_resource_arg, EmbeddedResource, allow_nil?: false
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
validations do
|
|
|
|
validate {ActorAndAuthorizeMustBeInContext, []}
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
defmodule Registry do
|
|
|
|
@moduledoc false
|
|
|
|
use Ash.Registry
|
|
|
|
|
|
|
|
entries do
|
|
|
|
entry Resource
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
defmodule Api do
|
|
|
|
use Ash.Api
|
|
|
|
|
|
|
|
resources do
|
|
|
|
registry Registry
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
test "changeset during validation and changes includes actor, authorize and tenant for an embedded resource" do
|
|
|
|
# The embedded resource's validation will raise an error if the context is missing the actor or authorize? keys
|
2023-12-14 11:11:52 +13:00
|
|
|
params = %{embedded_resource: %{name: "anything will trigger a validation"}}
|
|
|
|
|
|
|
|
assert {:ok, _} =
|
|
|
|
Resource
|
|
|
|
|> Ash.Changeset.for_create(:create, params,
|
|
|
|
actor: %{},
|
|
|
|
authorize?: true,
|
|
|
|
tenant: "one"
|
|
|
|
)
|
|
|
|
|> Api.create()
|
2023-12-14 10:47:11 +13:00
|
|
|
end
|
|
|
|
|
|
|
|
test "changeset during validation and changes includes actor, authorize and tenant for an embedded resource used as an argument" do
|
|
|
|
# The embedded resource's validation will raise an error if the context is missing the actor or authorize? keys
|
2023-12-14 11:11:52 +13:00
|
|
|
params = %{embedded_resource_arg: %{name: "anything will trigger a validation"}}
|
|
|
|
|
|
|
|
assert {:ok, _} =
|
|
|
|
%Resource{}
|
|
|
|
|> Ash.Changeset.for_update(:update, params,
|
|
|
|
actor: %{},
|
|
|
|
authorize?: true,
|
|
|
|
tenant: "one"
|
|
|
|
)
|
|
|
|
|> Api.update()
|
2023-12-14 10:47:11 +13:00
|
|
|
end
|
|
|
|
end
|