ash/test/actions/calculations_referencing_aggregates_test.exs

125 lines
2.3 KiB
Elixir

defmodule Ash.Test.Actions.CalculationsReferenceAggregatesTest do
@moduledoc false
use ExUnit.Case, async: true
defmodule One do
use Ash.Resource,
data_layer: Ash.DataLayer.Ets,
domain: Ash.Test.Actions.CalculationsReferenceAggregatesTest.Domain
ets do
private? true
end
actions do
defaults [:read]
end
relationships do
belongs_to :two, Ash.Test.Actions.CalculationsReferenceAggregatesTest.Two
end
attributes do
uuid_primary_key :id
attribute :quantity, :integer, allow_nil?: false, public?: true, constraints: [min: 0]
end
end
defmodule Two do
use Ash.Resource,
data_layer: Ash.DataLayer.Ets,
domain: Ash.Test.Actions.CalculationsReferenceAggregatesTest.Domain
ets do
private? true
end
attributes do
uuid_primary_key :id
end
actions do
defaults [:read]
end
relationships do
has_many :one, One
end
aggregates do
sum :total_quantity, :one, :quantity, default: 0
end
end
defmodule Three do
use Ash.Resource,
data_layer: Ash.DataLayer.Ets,
domain: Ash.Test.Actions.CalculationsReferenceAggregatesTest.Domain
ets do
private? true
end
actions do
defaults [:read]
end
attributes do
uuid_primary_key :id
end
relationships do
belongs_to :two, Two
belongs_to :four, Ash.Test.Actions.CalculationsReferenceAggregatesTest.Four
end
end
defmodule Four do
use Ash.Resource,
data_layer: Ash.DataLayer.Ets,
domain: Ash.Test.Actions.CalculationsReferenceAggregatesTest.Domain
ets do
private? true
end
actions do
defaults [:read, :create]
end
attributes do
uuid_primary_key :id
end
relationships do
has_many :three, Three
end
calculations do
# This throws
calculate :total_quantity,
:integer,
expr(sum(three.two, field: :total_quantity) || 0)
end
end
defmodule Domain do
use Ash.Domain
resources do
resource One
resource Two
resource Three
resource Four
end
end
test "loading calculations that reference aggregates" do
Four
|> Ash.create!(%{})
|> Ash.load!(:total_quantity)
|> Map.get(:total_quantity)
|> Kernel.==(0)
|> assert()
end
end