ash/test/actions/side_load_test.exs

77 lines
1.7 KiB
Elixir
Raw Normal View History

2019-12-12 11:45:59 +13:00
defmodule Ash.Test.Actions.SideLoadTest do
use ExUnit.Case, async: true
defmodule Author do
use Ash.Resource, name: "authors", type: "author"
use Ash.DataLayer.Ets, private?: true
actions do
read :default
create :default
end
attributes do
attribute :name, :string
end
relationships do
2019-12-16 13:20:44 +13:00
has_many :posts, Ash.Test.Actions.SideLoadTest.Post, reverse_relationship: :author
2019-12-12 11:45:59 +13:00
end
end
defmodule Post do
use Ash.Resource, name: "posts", type: "post"
use Ash.DataLayer.Ets, private?: true
actions do
read :default
create :default
end
attributes do
attribute :title, :string
attribute :contents, :string
end
relationships do
2019-12-16 13:20:44 +13:00
belongs_to :author, Author, reverse_relationship: :posts
2019-12-12 11:45:59 +13:00
end
end
defmodule Api do
use Ash.Api
resources [Author, Post]
end
describe "side_loads" do
setup do
author = Api.create!(Author, attributes: %{name: "zerg"})
2019-12-12 11:45:59 +13:00
post1 =
Api.create!(Post, attributes: %{title: "post1"}, relationships: %{author: author.id})
2019-12-12 11:45:59 +13:00
post2 =
Api.create!(Post, attributes: %{title: "post2"}, relationships: %{author: author.id})
2019-12-12 11:45:59 +13:00
%{post1: post1, post2: post2}
2019-12-12 11:45:59 +13:00
end
test "it allows sideloading related data", %{post1: post1, post2: post2} do
[author] =
Author
|> Api.query()
|> Ash.Query.side_load(posts: [:author])
|> Ash.Query.filter(posts: [id: post1.id])
|> Api.read!()
2019-12-12 11:45:59 +13:00
assert Enum.sort(Enum.map(author.posts, &Map.get(&1, :id))) ==
Enum.sort([post1.id, post2.id])
2019-12-20 17:19:34 +13:00
for post <- author.posts do
assert post.author.id == author.id
end
end
2019-12-12 11:45:59 +13:00
end
end