ash/test/resource/changes/lifecycle_hooks_test.exs

127 lines
2.8 KiB
Elixir

defmodule Ash.Test.Resource.Changes.LifecycleHooksTest do
@moduledoc false
use ExUnit.Case, async: true
defmodule TimeMachine do
@moduledoc false
use Ash.Resource, data_layer: Ash.DataLayer.Ets
attributes do
uuid_primary_key :id
attribute :name, :string
end
actions do
defaults [:read, :update, :destroy]
create :create_with_before_action do
argument :caller, :term
change before_action(fn changeset ->
send(changeset.arguments.caller, changeset.phase)
changeset
end)
end
create :create_with_before_transaction do
argument :caller, :term
change before_transaction(fn changeset ->
send(changeset.arguments.caller, changeset.phase)
changeset
end)
end
create :create_with_after_action do
argument :caller, :term
change after_action(fn changeset, record ->
send(changeset.arguments.caller, changeset.phase)
{:ok, record}
end)
end
create :create_with_after_transaction do
argument :caller, :term
change after_transaction(fn changeset, {:ok, record} ->
send(changeset.arguments.caller, changeset.phase)
{:ok, record}
end)
end
end
end
defmodule Registry do
@moduledoc false
use Ash.Registry
entries do
entry TimeMachine
end
end
defmodule Api do
@moduledoc false
use Ash.Api
resources do
registry Registry
end
end
describe "before_action/2" do
test "it is called before the action is run" do
TimeMachine
|> Ash.Changeset.for_create(:create_with_before_action,
name: "Delorean DMC-12",
caller: self()
)
|> Api.create!()
assert_received :before_action
end
end
describe "before_transaction/2" do
test "it is called before the transaction is run" do
TimeMachine
|> Ash.Changeset.for_create(:create_with_before_transaction,
name: "Delorean DMC-12",
caller: self()
)
|> Api.create!()
assert_received :before_transaction
end
end
describe "after_action/2" do
test "it is called after the action is run" do
TimeMachine
|> Ash.Changeset.for_create(:create_with_after_action,
name: "Delorean DMC-12",
caller: self()
)
|> Api.create!()
assert_received :after_action
end
end
describe "after_transaction/2" do
test "it is called after the transaction is run" do
TimeMachine
|> Ash.Changeset.for_create(:create_with_after_transaction,
name: "Delorean DMC-12",
caller: self()
)
|> Api.create!()
assert_received :after_transaction
end
end
end