mirror of
https://github.com/ash-project/ash_postgres.git
synced 2024-09-19 13:03:14 +12:00
test: replicate error when using calculation over nested relationship (#351)
This commit is contained in:
parent
455106be7e
commit
64740bac18
9 changed files with 181 additions and 2 deletions
|
@ -54,7 +54,8 @@ if Mix.env() == :test do
|
||||||
AshPostgres.MultitenancyTest.Domain,
|
AshPostgres.MultitenancyTest.Domain,
|
||||||
AshPostgres.Test.ComplexCalculations.Domain,
|
AshPostgres.Test.ComplexCalculations.Domain,
|
||||||
AshPostgres.Test.MultiDomainCalculations.DomainOne,
|
AshPostgres.Test.MultiDomainCalculations.DomainOne,
|
||||||
AshPostgres.Test.MultiDomainCalculations.DomainTwo
|
AshPostgres.Test.MultiDomainCalculations.DomainTwo,
|
||||||
|
AshPostgres.Test.MultiDomainCalculations.DomainThree
|
||||||
]
|
]
|
||||||
|
|
||||||
config :ash, :compatible_foreign_key_types, [
|
config :ash, :compatible_foreign_key_types, [
|
||||||
|
|
69
priv/resource_snapshots/test_repo/items/20240717104854.json
Normal file
69
priv/resource_snapshots/test_repo/items/20240717104854.json
Normal file
|
@ -0,0 +1,69 @@
|
||||||
|
{
|
||||||
|
"attributes": [
|
||||||
|
{
|
||||||
|
"allow_nil?": false,
|
||||||
|
"default": "fragment(\"uuid_generate_v7()\")",
|
||||||
|
"generated?": false,
|
||||||
|
"primary_key?": true,
|
||||||
|
"references": null,
|
||||||
|
"size": null,
|
||||||
|
"source": "id",
|
||||||
|
"type": "uuid"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"allow_nil?": true,
|
||||||
|
"default": "nil",
|
||||||
|
"generated?": false,
|
||||||
|
"primary_key?": false,
|
||||||
|
"references": null,
|
||||||
|
"size": null,
|
||||||
|
"source": "key",
|
||||||
|
"type": "text"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"allow_nil?": false,
|
||||||
|
"default": "fragment(\"(now() AT TIME ZONE 'utc')\")",
|
||||||
|
"generated?": false,
|
||||||
|
"primary_key?": false,
|
||||||
|
"references": null,
|
||||||
|
"size": null,
|
||||||
|
"source": "inserted_at",
|
||||||
|
"type": "utc_datetime_usec"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"allow_nil?": false,
|
||||||
|
"default": "fragment(\"(now() AT TIME ZONE 'utc')\")",
|
||||||
|
"generated?": false,
|
||||||
|
"primary_key?": false,
|
||||||
|
"references": null,
|
||||||
|
"size": null,
|
||||||
|
"source": "updated_at",
|
||||||
|
"type": "utc_datetime_usec"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"allow_nil?": true,
|
||||||
|
"default": "nil",
|
||||||
|
"generated?": false,
|
||||||
|
"primary_key?": false,
|
||||||
|
"references": null,
|
||||||
|
"size": null,
|
||||||
|
"source": "value",
|
||||||
|
"type": "bigint"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"base_filter": null,
|
||||||
|
"check_constraints": [],
|
||||||
|
"custom_indexes": [],
|
||||||
|
"custom_statements": [],
|
||||||
|
"has_create_action": true,
|
||||||
|
"hash": "4C97C976528D44A7E55E873A1EF3539C3778EC7EFE3EC5AF644C0A736EF679FC",
|
||||||
|
"identities": [],
|
||||||
|
"multitenancy": {
|
||||||
|
"attribute": null,
|
||||||
|
"global": null,
|
||||||
|
"strategy": null
|
||||||
|
},
|
||||||
|
"repo": "Elixir.AshPostgres.TestRepo",
|
||||||
|
"schema": null,
|
||||||
|
"table": "items"
|
||||||
|
}
|
|
@ -0,0 +1,23 @@
|
||||||
|
defmodule AshPostgres.TestRepo.Migrations.NoAttributesCalculationTest do
|
||||||
|
@moduledoc """
|
||||||
|
Updates resources based on their most recent snapshots.
|
||||||
|
|
||||||
|
This file was autogenerated with `mix ash_postgres.generate_migrations`
|
||||||
|
"""
|
||||||
|
|
||||||
|
use Ecto.Migration
|
||||||
|
|
||||||
|
def up do
|
||||||
|
alter table(:items) do
|
||||||
|
add(:key, :text)
|
||||||
|
add(:value, :bigint)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def down do
|
||||||
|
alter table(:items) do
|
||||||
|
remove(:value)
|
||||||
|
remove(:key)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
|
@ -25,4 +25,32 @@ defmodule AshPostgres.Test.MultiDomainCalculationsTest do
|
||||||
load: [:total_amount]
|
load: [:total_amount]
|
||||||
)
|
)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
test "total using relationship is returned correctly" do
|
||||||
|
item =
|
||||||
|
AshPostgres.Test.MultiDomainCalculations.DomainOne.Item
|
||||||
|
|> Ash.Changeset.for_create(:create, %{key: "key"})
|
||||||
|
|> Ash.create!()
|
||||||
|
|
||||||
|
_relationship_item =
|
||||||
|
AshPostgres.Test.MultiDomainCalculations.DomainThree.RelationshipItem
|
||||||
|
|> Ash.Changeset.for_create(:create, %{key: "key", value: 1})
|
||||||
|
|> Ash.create!()
|
||||||
|
|
||||||
|
other_item =
|
||||||
|
AshPostgres.Test.MultiDomainCalculations.DomainTwo.OtherItem
|
||||||
|
|> Ash.Changeset.for_create(:create, %{item_id: item.id})
|
||||||
|
|> Ash.create!()
|
||||||
|
|
||||||
|
for i <- 0..2 do
|
||||||
|
AshPostgres.Test.MultiDomainCalculations.DomainTwo.SubItem
|
||||||
|
|> Ash.Changeset.for_create(:create, %{other_item_id: other_item.id, amount: i})
|
||||||
|
|> Ash.create!()
|
||||||
|
end
|
||||||
|
|
||||||
|
assert [%{total_amount: 3}] =
|
||||||
|
Ash.read!(AshPostgres.Test.MultiDomainCalculations.DomainOne.Item,
|
||||||
|
load: [:total_amount_relationship]
|
||||||
|
)
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -6,24 +6,32 @@ defmodule AshPostgres.Test.MultiDomainCalculations.DomainOne.Item do
|
||||||
authorizers: [Ash.Policy.Authorizer],
|
authorizers: [Ash.Policy.Authorizer],
|
||||||
domain: AshPostgres.Test.MultiDomainCalculations.DomainOne
|
domain: AshPostgres.Test.MultiDomainCalculations.DomainOne
|
||||||
|
|
||||||
|
alias AshPostgres.Test.MultiDomainCalculations.DomainThree.RelationshipItem
|
||||||
alias AshPostgres.Test.MultiDomainCalculations.DomainTwo.OtherItem
|
alias AshPostgres.Test.MultiDomainCalculations.DomainTwo.OtherItem
|
||||||
|
|
||||||
attributes do
|
attributes do
|
||||||
uuid_v7_primary_key(:id)
|
uuid_v7_primary_key(:id)
|
||||||
|
attribute(:key, :string)
|
||||||
create_timestamp(:inserted_at)
|
create_timestamp(:inserted_at)
|
||||||
update_timestamp(:updated_at)
|
update_timestamp(:updated_at)
|
||||||
end
|
end
|
||||||
|
|
||||||
relationships do
|
relationships do
|
||||||
has_one(:other_item, OtherItem)
|
has_one(:other_item, OtherItem)
|
||||||
|
|
||||||
|
has_one(:relationship_item, RelationshipItem) do
|
||||||
|
no_attributes?(true)
|
||||||
|
filter(expr(parent(key) == key))
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
actions do
|
actions do
|
||||||
defaults([:read, :destroy, update: :*, create: :*])
|
defaults([:read, :destroy, update: :*, create: [:*, :key]])
|
||||||
end
|
end
|
||||||
|
|
||||||
calculations do
|
calculations do
|
||||||
calculate(:total_amount, :integer, expr(other_item.total_amount))
|
calculate(:total_amount, :integer, expr(other_item.total_amount))
|
||||||
|
calculate(:total_amount_relationship, :integer, expr(other_item.total_amount_relationship))
|
||||||
end
|
end
|
||||||
|
|
||||||
policies do
|
policies do
|
||||||
|
|
8
test/support/multi_domain_calculations/domain_three.ex
Normal file
8
test/support/multi_domain_calculations/domain_three.ex
Normal file
|
@ -0,0 +1,8 @@
|
||||||
|
defmodule AshPostgres.Test.MultiDomainCalculations.DomainThree do
|
||||||
|
@moduledoc false
|
||||||
|
use Ash.Domain
|
||||||
|
|
||||||
|
resources do
|
||||||
|
resource(AshPostgres.Test.MultiDomainCalculations.DomainThree.RelationshipItem)
|
||||||
|
end
|
||||||
|
end
|
|
@ -0,0 +1,31 @@
|
||||||
|
defmodule AshPostgres.Test.MultiDomainCalculations.DomainThree.RelationshipItem do
|
||||||
|
@moduledoc false
|
||||||
|
|
||||||
|
use Ash.Resource,
|
||||||
|
data_layer: AshPostgres.DataLayer,
|
||||||
|
authorizers: [Ash.Policy.Authorizer],
|
||||||
|
domain: AshPostgres.Test.MultiDomainCalculations.DomainThree
|
||||||
|
|
||||||
|
attributes do
|
||||||
|
uuid_v7_primary_key(:id)
|
||||||
|
attribute(:key, :string, allow_nil?: false)
|
||||||
|
attribute(:value, :integer, allow_nil?: false)
|
||||||
|
create_timestamp(:inserted_at)
|
||||||
|
update_timestamp(:updated_at)
|
||||||
|
end
|
||||||
|
|
||||||
|
actions do
|
||||||
|
defaults([:read, :destroy, update: :*, create: [:*, :key, :value]])
|
||||||
|
end
|
||||||
|
|
||||||
|
policies do
|
||||||
|
policy always() do
|
||||||
|
authorize_if(always())
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
postgres do
|
||||||
|
table "items"
|
||||||
|
repo(AshPostgres.TestRepo)
|
||||||
|
end
|
||||||
|
end
|
|
@ -28,10 +28,15 @@ defmodule AshPostgres.Test.MultiDomainCalculations.DomainTwo.OtherItem do
|
||||||
sum :total_sub_items_amount, :sub_items, :total_amount do
|
sum :total_sub_items_amount, :sub_items, :total_amount do
|
||||||
default(0)
|
default(0)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
sum :total_sub_items_relationship_amount, :sub_items, :total_amount_relationship do
|
||||||
|
default(0)
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
calculations do
|
calculations do
|
||||||
calculate(:total_amount, :integer, expr(total_sub_items_amount))
|
calculate(:total_amount, :integer, expr(total_sub_items_amount))
|
||||||
|
calculate(:total_amount_relationship, :integer, expr(total_sub_items_relationship_amount))
|
||||||
end
|
end
|
||||||
|
|
||||||
policies do
|
policies do
|
||||||
|
|
|
@ -25,6 +25,12 @@ defmodule AshPostgres.Test.MultiDomainCalculations.DomainTwo.SubItem do
|
||||||
|
|
||||||
calculations do
|
calculations do
|
||||||
calculate(:total_amount, :integer, expr(amount))
|
calculate(:total_amount, :integer, expr(amount))
|
||||||
|
|
||||||
|
calculate(
|
||||||
|
:total_amount_relationship,
|
||||||
|
:integer,
|
||||||
|
expr(amount * other_item.item.relationship_item.value)
|
||||||
|
)
|
||||||
end
|
end
|
||||||
|
|
||||||
policies do
|
policies do
|
||||||
|
|
Loading…
Reference in a new issue