live_beats/test/live_beats/presence/presence_client_test.exs

120 lines
4.3 KiB
Elixir
Raw Normal View History

2021-12-16 17:19:02 +00:00
defmodule Phoenix.Presence.ClientTest.Presence do
use Phoenix.Presence, otp_app: :live_beats,
pubsub_server: LiveBeats.PubSub
end
2021-12-13 18:33:13 +00:00
defmodule Phoenix.Presence.ClientTest do
2021-12-14 22:14:37 +00:00
use ExUnit.Case
2021-12-13 18:33:13 +00:00
alias Phoenix.Presence.Client.PresenceMock
2021-12-14 22:14:37 +00:00
alias Phoenix.Presence.Client
2021-12-13 18:33:13 +00:00
2021-12-14 22:14:37 +00:00
@pubsub LiveBeats.PubSub
@client Phoenix.Presence.Client.Mock
2021-12-16 17:19:02 +00:00
@presence Phoenix.Presence.ClientTest.Presence
2021-12-14 22:14:37 +00:00
@presence_client_opts [client: @client, pubsub: @pubsub, presence: @presence]
setup tags do
2021-12-16 17:19:02 +00:00
start_supervised!({@presence, []})
2021-12-14 22:14:37 +00:00
pid = Ecto.Adapters.SQL.Sandbox.start_owner!(LiveBeats.Repo, shared: not tags[:async])
on_exit(fn -> Ecto.Adapters.SQL.Sandbox.stop_owner(pid) end)
:ok
end
2021-12-15 18:44:10 +00:00
test "A topic key is added to the topics state when a new process is tracked" do
2021-12-13 18:33:13 +00:00
presence_key = 1
2021-12-14 22:14:37 +00:00
topic = topic(100)
2021-12-16 17:19:02 +00:00
{:ok, presence_client} = start_supervised({Client, @presence_client_opts})
{:ok, presence_process} = start_supervised({PresenceMock, id: presence_key})
2021-12-14 22:14:37 +00:00
Phoenix.PubSub.subscribe(@pubsub, topic)
Process.monitor(presence_process)
2021-12-13 18:33:13 +00:00
2021-12-14 22:14:37 +00:00
PresenceMock.track(presence_client, presence_process, topic, presence_key)
assert_receive %{event: "presence_diff"}
2021-12-13 18:33:13 +00:00
2021-12-14 22:14:37 +00:00
client_state = :sys.get_state(presence_client)
assert %{topics: %{^topic => %{"1" => [%{phx_ref: _ref}]}}} = client_state
2021-12-13 18:33:13 +00:00
end
test "topic is removed from the topics state when there is no more presences" do
presence_key = 1
2021-12-14 22:14:37 +00:00
topic = topic(100)
2021-12-16 17:19:02 +00:00
{:ok, presence_client} = start_supervised({Client, @presence_client_opts})
{:ok, presence_process} = start_supervised({PresenceMock, id: presence_key})
2021-12-14 22:14:37 +00:00
Phoenix.PubSub.subscribe(@pubsub, topic)
Process.monitor(presence_process)
PresenceMock.track(presence_client, presence_process, topic, presence_key)
assert Process.alive?(presence_process)
assert_receive %{event: "presence_diff"}
client_state = :sys.get_state(presence_client)
assert %{topics: %{^topic => %{"1" => [%{phx_ref: _ref}]}}} = client_state
2021-12-13 18:33:13 +00:00
2021-12-14 22:14:37 +00:00
send(presence_process, :quit)
assert_receive {:DOWN, _ref, :process, ^presence_process, _reason}
2021-12-13 18:33:13 +00:00
2021-12-14 22:14:37 +00:00
client_state = :sys.get_state(presence_client)
assert %{topics: %{}} = client_state
2021-12-13 18:33:13 +00:00
end
2021-12-15 18:44:10 +00:00
test "metas are accumulated when there are two presences for the same key" do
2021-12-15 18:40:37 +00:00
presence_key = 1
topic = topic(100)
2021-12-16 17:19:02 +00:00
{:ok, presence_client} = start_supervised({Client, @presence_client_opts})
{:ok, presence_process_1} = start_supervised({PresenceMock, id: presence_key}, id: :mock_1)
{:ok, presence_process_2} = start_supervised({PresenceMock, id: presence_key}, id: :mock_2)
2021-12-15 18:40:37 +00:00
Phoenix.PubSub.subscribe(@pubsub, topic)
PresenceMock.track(presence_client, presence_process_1, topic, presence_key, %{m1: :m1})
assert_receive %{event: "presence_diff"}
PresenceMock.track(presence_client, presence_process_2, topic, presence_key, %{m2: :m2})
assert_receive %{event: "presence_diff"}
client_state = :sys.get_state(presence_client)
assert %{topics: %{^topic => %{"1" => [%{m1: :m1}, %{m2: :m2}]}}} = client_state
end
2021-12-15 18:44:10 +00:00
test "Just one meta is deleted when there are two presences for the same key and one leaves" do
2021-12-15 18:40:37 +00:00
presence_key = 1
topic = topic(100)
2021-12-16 17:19:02 +00:00
{:ok, presence_client} = start_supervised({Client, @presence_client_opts})
{:ok, presence_process_1} = start_supervised({PresenceMock, id: presence_key}, id: :mock_1)
{:ok, presence_process_2} = start_supervised({PresenceMock, id: presence_key}, id: :mock_2)
2021-12-15 18:40:37 +00:00
Phoenix.PubSub.subscribe(@pubsub, topic)
Process.monitor(presence_process_1)
PresenceMock.track(presence_client, presence_process_1, topic, presence_key, %{m1: :m1})
assert_receive %{event: "presence_diff"}
PresenceMock.track(presence_client, presence_process_2, topic, presence_key, %{m2: :m2})
assert_receive %{event: "presence_diff"}
client_state = :sys.get_state(presence_client)
assert %{topics: %{^topic => %{"1" => [%{m1: :m1}, %{m2: :m2}]}}} = client_state
send(presence_process_1, :quit)
assert_receive {:DOWN, _ref, :process, ^presence_process_1, _reason}
assert_receive %{event: "presence_diff"}
client_state = :sys.get_state(presence_client)
2021-12-16 17:19:02 +00:00
assert %{topics: %{^topic => %{"1" => [%{m2: :m2}]}}} = client_state
2021-12-15 18:40:37 +00:00
end
2021-12-13 18:33:13 +00:00
defp topic(id) do
"mock_topic:#{id}"
end
end