diff --git a/test/live_beats/presence/presence_client_test.exs b/test/live_beats/presence/presence_client_test.exs index bedc562..9fcb26f 100644 --- a/test/live_beats/presence/presence_client_test.exs +++ b/test/live_beats/presence/presence_client_test.exs @@ -28,13 +28,9 @@ defmodule Phoenix.Presence.ClientTest do 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 end @@ -49,24 +45,70 @@ defmodule Phoenix.Presence.ClientTest do 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 send(presence_process, :quit) - assert_receive {:DOWN, _ref, :process, ^presence_process, _reason} client_state = :sys.get_state(presence_client) - assert %{topics: %{}} = client_state end + test "When there are two presences for the same key, the metas are accumulated" do + presence_key = 1 + topic = topic(100) + + {:ok, presence_client} = Client.start_link(@presence_client_opts) + {:ok, presence_process_1} = PresenceMock.start_link(id: presence_key) + {:ok, presence_process_2} = PresenceMock.start_link(id: presence_key) + + 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 + + test "When there are two presences for the same key and one leaves, just the meta is deleted" do + presence_key = 1 + topic = topic(100) + + {:ok, presence_client} = Client.start_link(@presence_client_opts) + {:ok, presence_process_1} = PresenceMock.start_link(id: presence_key) + {:ok, presence_process_2} = PresenceMock.start_link(id: presence_key) + + 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) + assert %{topics: %{^topic => %{"1" => [%{m2: :m2}]}}} = client_state + end + defp topic(id) do "mock_topic:#{id}" end diff --git a/test/support/presence/presence_mock.ex b/test/support/presence/presence_mock.ex index f882ec9..e693d91 100644 --- a/test/support/presence/presence_mock.ex +++ b/test/support/presence/presence_mock.ex @@ -13,8 +13,8 @@ defmodule Phoenix.Presence.Client.PresenceMock do {:ok, %{id: id}} end - def track(client_pid, pid, topic, key) do - GenServer.cast(pid, {:track, client_pid, topic, key}) + def track(client_pid, pid, topic, key, meta \\ %{}) do + GenServer.cast(pid, {:track, client_pid, topic, key, meta}) end @impl true @@ -24,8 +24,8 @@ defmodule Phoenix.Presence.Client.PresenceMock do end @impl true - def handle_cast({:track, client_pid, topic, key}, state) do - Client.track(client_pid, topic, key, %{}) + def handle_cast({:track, client_pid, topic, key, meta}, state) do + Client.track(client_pid, topic, key, meta) {:noreply, state} end end