Skip to content

Instantly share code, notes, and snippets.

@graeme-hill
Created August 13, 2017 01:29
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save graeme-hill/e55f265c261429c2d2b4283f90b726fb to your computer and use it in GitHub Desktop.
Save graeme-hill/e55f265c261429c2d2b4283f90b726fb to your computer and use it in GitHub Desktop.
Helper GenServer for testing multiple phoenix channels clients at the same time
defmodule AsyncSocket do
use GenServer
use MatchmakerApiWeb.ChannelCase
# Client
defmacro create_and_join(channel, topic, payload) do
if endpoint = Module.get_attribute(__CALLER__.module, :endpoint) do
quote do
{:ok, pid} = AsyncSocket.start_link(unquote(endpoint))
AsyncSocket.join(
pid, unquote(channel), unquote(topic), unquote(payload))
end
else
raise "module attribute @endpoint not set for create/0"
end
end
def start_link(endpoint) do
GenServer.start_link(__MODULE__, endpoint)
end
def push(server, event, payload) do
GenServer.call(server, {:push, {event, payload}})
end
def assert_broadcast(server, event, payload) do
GenServer.call(server, {:assert_broadcast, {event, payload}})
end
def join(pid, channel, topic, payload) do
GenServer.call(pid, {:join, {channel, topic, payload}})
pid
end
# Server
def init(endpoint) do
socket = %Phoenix.Socket{
serializer: Phoenix.ChannelTest.NoopSerializer,
transport_pid: self(),
endpoint: endpoint,
pubsub_server: endpoint.__pubsub_server__(),
id: "",
assigns: %{},
transport: Phoenix.ChannelTest,
transport_name: :channel_test}
{:ok, socket}
end
def handle_call({:push, {event, payload}}, _from, socket) do
Phoenix.ChannelTest.push(socket, event, payload)
{:reply, :ok, socket}
end
def handle_call({:assert_broadcast, {event, payload}}, _from, socket) do
Phoenix.ChannelTest.assert_broadcast(^event, ^payload)
{:reply, :ok, socket}
end
def handle_call({:join, {channel, topic, payload}}, _from, socket) do
{:ok, _payload, new_socket} =
subscribe_and_join(socket, channel, topic, payload)
{:reply, :ok, new_socket}
end
def handle_info(_, state) do
{:noreply, state}
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment