ash_postgres/test/distinct_test.exs
Zach Daniel 37cc01957d
improvement!: 3.0 (#227)
* WIP

* chore: fix mix.lock merge issues

* improvement: upgrade to 3.0

* chore: remove `repo.to_tenant`

* chore: continue removal of unnecessary helper

* chore: use `Ash.ToTenant`
2024-03-27 16:52:28 -04:00

180 lines
4.4 KiB
Elixir

defmodule AshPostgres.DistinctTest do
@moduledoc false
use AshPostgres.RepoCase, async: false
alias AshPostgres.Test.Post
require Ash.Query
setup do
Post
|> Ash.Changeset.for_create(:create, %{title: "title", score: 1})
|> Ash.create!()
Post
|> Ash.Changeset.for_create(:create, %{title: "title", score: 1})
|> Ash.create!()
Post
|> Ash.Changeset.for_create(:create, %{title: "foo", score: 2})
|> Ash.create!()
Post
|> Ash.Changeset.for_create(:create, %{title: "foo", score: 2})
|> Ash.create!()
:ok
end
test "records returned are distinct on the provided field" do
results =
Post
|> Ash.Query.distinct(:title)
|> Ash.Query.sort(:title)
|> Ash.read!()
assert [%{title: "foo"}, %{title: "title"}] = results
end
test "distinct pairs well with sort" do
results =
Post
|> Ash.Query.distinct(:title)
|> Ash.Query.sort(title: :desc)
|> Ash.read!()
assert [%{title: "title"}, %{title: "foo"}] = results
end
test "distinct pairs well with sort that does not match the distinct" do
results =
Post
|> Ash.Query.distinct(:title)
|> Ash.Query.sort(id: :desc)
|> Ash.Query.limit(3)
|> Ash.read!()
assert [_, _] = results
end
test "distinct pairs well with sort that does not match the distinct using a limit" do
results =
Post
|> Ash.Query.distinct(:title)
|> Ash.Query.sort(id: :desc)
|> Ash.Query.limit(3)
|> Ash.read!()
assert [_, _] = results
end
test "distinct pairs well with sort that does not match the distinct using a limit #2" do
results =
Post
|> Ash.Query.distinct(:title)
|> Ash.Query.sort(id: :desc)
|> Ash.Query.limit(1)
|> Ash.read!()
assert [_] = results
end
test "distinct can use calculations sort that does not match the distinct using a limit #2" do
results =
Post
|> Ash.Query.distinct(:negative_score)
|> Ash.Query.sort(:negative_score)
|> Ash.Query.load(:negative_score)
|> Ash.read!()
assert [
%{title: "foo", negative_score: -2},
%{title: "title", negative_score: -1}
] = results
results =
Post
|> Ash.Query.distinct(:negative_score)
|> Ash.Query.sort(negative_score: :desc)
|> Ash.Query.load(:negative_score)
|> Ash.read!()
assert [
%{title: "title", negative_score: -1},
%{title: "foo", negative_score: -2}
] = results
results =
Post
|> Ash.Query.distinct(:negative_score)
|> Ash.Query.sort(:title)
|> Ash.Query.load(:negative_score)
|> Ash.read!()
assert [
%{title: "foo", negative_score: -2},
%{title: "title", negative_score: -1}
] = results
end
test "distinct, join filters and sort can be combined" do
Post
|> Ash.Changeset.for_create(:create, %{title: "a", score: 2})
|> Ash.create!()
Post
|> Ash.Changeset.for_create(:create, %{title: "a", score: 1})
|> Ash.create!()
assert [] =
Post
|> Ash.Query.distinct(:negative_score)
|> Ash.Query.filter(author.first_name == "a")
|> Ash.Query.sort(:negative_score)
|> Ash.read!()
end
test "distinct sort is applied" do
Post
|> Ash.Changeset.for_create(:create, %{title: "a", score: 2})
|> Ash.create!()
Post
|> Ash.Changeset.for_create(:create, %{title: "a", score: 1})
|> Ash.create!()
results =
Post
|> Ash.Query.distinct(:negative_score)
|> Ash.Query.distinct_sort(:title)
|> Ash.Query.sort(:negative_score)
|> Ash.Query.load(:negative_score)
|> Ash.read!()
assert [
%{title: "a", negative_score: -2},
%{title: "a", negative_score: -1}
] = results
results =
Post
|> Ash.Query.distinct(:negative_score)
|> Ash.Query.distinct_sort(title: :desc)
|> Ash.Query.sort(:negative_score)
|> Ash.Query.load(:negative_score)
|> Ash.read!()
assert [
%{title: "foo", negative_score: -2},
%{title: "title", negative_score: -1}
] = results
end
test "distinct used on it's own" do
results =
Post
|> Ash.Query.distinct(:title)
|> Ash.read!()
assert [_, _] = results
end
end