From 8dfb96c78a8be069698100d66c5b2958a6936d7a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Berenice=20Medel=20S=C3=A1nchez?= Date: Tue, 14 Dec 2021 16:14:37 -0600 Subject: [PATCH] fix tests --- .../presence/presence_client_test.exs | 74 ++++++++++++------- test/support/presence/presence_mock.ex | 8 +- 2 files changed, 53 insertions(+), 29 deletions(-) diff --git a/test/live_beats/presence/presence_client_test.exs b/test/live_beats/presence/presence_client_test.exs index 2ac01e5..bedc562 100644 --- a/test/live_beats/presence/presence_client_test.exs +++ b/test/live_beats/presence/presence_client_test.exs @@ -1,46 +1,70 @@ defmodule Phoenix.Presence.ClientTest do - use ExUnit.Case, async: true + use ExUnit.Case alias Phoenix.Presence.Client.PresenceMock + alias Phoenix.Presence.Client - test "When a new process is tracked, a topic is created" do + @pubsub LiveBeats.PubSub + @client Phoenix.Presence.Client.Mock + @presence LiveBeatsWeb.Presence + + @presence_client_opts [client: @client, pubsub: @pubsub, presence: @presence] + + setup tags do + 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 + + test "When a new process is tracked, a topic key is added to the topics state" do presence_key = 1 - topic_id = 100 + topic = topic(100) - {:ok, pid} = PresenceMock.start_link(id: presence_key) + {:ok, presence_client} = Client.start_link(@presence_client_opts) + {:ok, presence_process} = PresenceMock.start_link(id: presence_key) - PresenceMock.track(pid, topic(topic_id), presence_key) - assert Process.alive?(pid) - # _ = :sys.get_state(PresenceClient) - :timer.sleep(1000)# not the best + Phoenix.PubSub.subscribe(@pubsub, topic) + Process.monitor(presence_process) - assert %{topics: %{"mock_topic:100" => %{"1" => [%{phx_ref: _ref}]}}} = - GenServer.call(PresenceClient, :state) + PresenceMock.track(presence_client, presence_process, topic, presence_key) - send(pid, :quit) - :timer.sleep(1000) - refute Process.alive?(pid) + 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 test "topic is removed from the topics state when there is no more presences" do presence_key = 1 - topic_id = 100 + topic = topic(100) - {:ok, pid} = PresenceMock.start_link(id: presence_key) + {:ok, presence_client} = Client.start_link(@presence_client_opts) + {:ok, presence_process} = PresenceMock.start_link(id: presence_key) - PresenceMock.track(pid, topic(topic_id), presence_key) - assert Process.alive?(pid) - # _ = :sys.get_state(PresenceClient) + Phoenix.PubSub.subscribe(@pubsub, topic) + Process.monitor(presence_process) - :timer.sleep(1000)# not the best + PresenceMock.track(presence_client, presence_process, topic, presence_key) - assert %{topics: %{"mock_topic:100" => %{"1" => [%{phx_ref: _ref}]}}} = - GenServer.call(PresenceClient, :state) + assert Process.alive?(presence_process) - send(pid, :quit) - :timer.sleep(1000) - refute Process.alive?(pid) - assert %{topics: %{}} = GenServer.call(PresenceClient, :state) + 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 defp topic(id) do diff --git a/test/support/presence/presence_mock.ex b/test/support/presence/presence_mock.ex index 91126e5..f882ec9 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(pid, topic, key) do - GenServer.cast(pid, {:track, topic, key}) + def track(client_pid, pid, topic, key) do + GenServer.cast(pid, {:track, client_pid, topic, key}) end @impl true @@ -24,8 +24,8 @@ defmodule Phoenix.Presence.Client.PresenceMock do end @impl true - def handle_cast({:track, topic, key}, state) do - Client.track(topic, key, %{}) + def handle_cast({:track, client_pid, topic, key}, state) do + Client.track(client_pid, topic, key, %{}) {:noreply, state} end end