ash/test/notifier/pubsub_test.exs
Zach Daniel 8b10b892ef improvement: add :_pkey shortcut in pub_sub
improvement: validate `pre_check_with` is set for ets/mnesia identities
improvement: clearer and raised error message on changeset action mismatch
2022-05-28 11:12:08 -04:00

120 lines
2.6 KiB
Elixir

defmodule Ash.Test.Notifier.PubSubTest do
@moduledoc false
use ExUnit.Case, async: false
defmodule PubSub do
def broadcast(topic, event, notification) do
send(
Application.get_env(__MODULE__, :notifier_test_pid),
{:broadcast, topic, event, notification}
)
end
end
defmodule Post do
@moduledoc false
use Ash.Resource,
data_layer: Ash.DataLayer.Ets,
notifiers: [
Ash.Notifier.PubSub
]
pub_sub do
module PubSub
prefix "post"
publish :destroy, ["foo", :id]
publish :update, ["foo", :id]
publish :update, ["bar", :name], event: "name_change"
publish :update_pkey, ["foo", :_pkey]
end
ets do
private?(true)
end
actions do
defaults [:create, :read, :update, :destroy]
update :update_pkey
end
attributes do
uuid_primary_key :id, writable?: true
attribute :name, :string
end
end
defmodule Registry do
@moduledoc false
use Ash.Registry
entries do
entry Post
end
end
defmodule Api do
use Ash.Api
resources do
registry Registry
end
end
setup do
Application.put_env(PubSub, :notifier_test_pid, self())
:ok
end
test "publishing a message with a change value" do
post =
Post
|> Ash.Changeset.new(%{})
|> Api.create!()
Api.destroy!(post)
message = "post:foo:#{post.id}"
assert_receive {:broadcast, ^message, "destroy", %Ash.Notifier.Notification{}}
end
test "publishing a message with multiple matches/changes" do
post =
Post
|> Ash.Changeset.new(%{name: "ted"})
|> Api.create!()
post
|> Ash.Changeset.new(%{name: "joe"})
|> Api.update!()
message = "post:foo:#{post.id}"
assert_receive {:broadcast, ^message, "update", %Ash.Notifier.Notification{}}
message = "post:bar:joe"
assert_receive {:broadcast, ^message, "name_change", %Ash.Notifier.Notification{}}
message = "post:bar:ted"
assert_receive {:broadcast, ^message, "name_change", %Ash.Notifier.Notification{}}
end
test "publishing a message with a pkey matcher" do
post =
Post
|> Ash.Changeset.new(%{name: "ted"})
|> Api.create!()
new_id = Ash.UUID.generate()
post
|> Ash.Changeset.new(%{id: new_id})
|> Api.update!(action: :update_pkey)
message = "post:foo:#{post.id}"
assert_receive {:broadcast, ^message, "update_pkey", %Ash.Notifier.Notification{}}
message = "post:foo:#{new_id}"
assert_receive {:broadcast, ^message, "update_pkey", %Ash.Notifier.Notification{}}
end
end