ash/test/reactor/load_test.exs

86 lines
1.8 KiB
Elixir

defmodule Ash.Test.ReactorLoadTest do
@moduledoc false
use ExUnit.Case, async: true
alias __MODULE__, as: Self
alias Ash.Test.Domain
defmodule Post do
@moduledoc false
use Ash.Resource, data_layer: Ash.DataLayer.Ets, domain: Domain
ets do
private? true
end
attributes do
uuid_primary_key :id
attribute :title, :string, allow_nil?: false, public?: true
end
relationships do
has_many :comments, Self.Comment, public?: true
end
actions do
default_accept :*
defaults [:read, create: :*]
end
code_interface do
define :create
end
end
defmodule Comment do
@moduledoc false
use Ash.Resource, data_layer: Ash.DataLayer.Ets, domain: Domain
ets do
private? true
end
attributes do
uuid_primary_key :id
attribute :comment, :string, allow_nil?: false, public?: true
end
relationships do
belongs_to :post, Self.Post, public?: true
end
actions do
default_accept :*
defaults [:read, create: :*]
end
code_interface do
define :create
end
end
defmodule SimpleLoadReactor do
@moduledoc false
use Reactor, extensions: [Ash.Reactor]
ash do
default_domain(Domain)
end
input :post
load(:post_with_comments, input(:post), value(comments: :comment))
end
test "it performs loading" do
post = Post.create!(%{title: "Marty"})
comments = ["This is heavy", "You made a time machine... out of a Delorean?"]
for comment <- comments do
Comment.create!(%{post_id: post.id, comment: comment})
end
assert {:ok, post} = Reactor.run(SimpleLoadReactor, %{post: post}, %{}, async?: false)
assert Enum.sort(Enum.map(post.comments, & &1.comment)) == comments
end
end