Skip to content

Commit 34142da

Browse files
committed
Take callback as second argument
1 parent 39ee7b4 commit 34142da

File tree

6 files changed

+26
-29
lines changed

6 files changed

+26
-29
lines changed

CHANGELOG.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,7 @@
1+
## v0.1.5 (TBA)
2+
3+
- `TestServer.websocket_info/2` now takes the callback function as second argument
4+
15
## v0.1.4 (2022-09-13)
26

37
- WebSocket support

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -122,7 +122,7 @@ TestServer.websocket_handle(socket)
122122
TestServer.websocket_handle(socket, to: fn _frame_, state -> {:reply, "pong", state})
123123
TestServer.websocket_handle(socket, match: fn {_opcode, message}, _state -> messsage == "ping")
124124

125-
TestServer.websocket_info(socket, to: fn state -> {:reply, {:text, "ping"}, state} end)
125+
TestServer.websocket_info(socket, fn state -> {:reply, {:text, "ping"}, state} end)
126126
```
127127

128128
<!-- MDOC !-->

lib/test_server.ex

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -441,16 +441,17 @@ defmodule TestServer do
441441
@doc """
442442
Sends an message to a websocket instance.
443443
"""
444-
@spec websocket_info(websocket_socket(), keyword()) :: :ok
445-
def websocket_info({instance, _route_ref} = socket, options \\ []) do
444+
@spec websocket_info(websocket_socket(), function() | nil) :: :ok
445+
def websocket_info({instance, _route_ref} = socket, callback \\ nil)
446+
when is_function(callback) or is_nil(callback) do
446447
instance_alive!(instance)
447448

448449
[_first_module_entry | stacktrace] = get_stacktrace()
449450

450-
options = Keyword.put_new(options, :to, &default_websocket_info/1)
451+
callback = callback || (&default_websocket_info/1)
451452

452453
for pid <- Instance.active_websocket_connections(socket) do
453-
send(pid, {options, stacktrace})
454+
send(pid, {callback, stacktrace})
454455
end
455456

456457
:ok

lib/test_server/instance.ex

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,10 @@ defmodule TestServer.Instance do
3333
GenServer.call(instance, {:register, {:plug, {plug, stacktrace}}})
3434
end
3535

36-
@spec register(TestServer.websocket_socket(), {:websocket, {:handle, keyword(), TestServer.stacktrace()}}) ::
36+
@spec register(
37+
TestServer.websocket_socket(),
38+
{:websocket, {:handle, keyword(), TestServer.stacktrace()}}
39+
) ::
3740
{:ok, map()}
3841
def register({instance, _router_ref} = socket, {:websocket, {:handle, options, stacktrace}}) do
3942
unless is_nil(options[:match]) or is_function(options[:match]),
@@ -66,17 +69,17 @@ defmodule TestServer.Instance do
6669

6770
@spec dispatch(
6871
TestServer.websocket_socket(),
69-
{:websocket, {:info, keyword(), TestServer.stacktrace()}, TestServer.websocket_state()}
72+
{:websocket, {:info, function(), TestServer.stacktrace()}, TestServer.websocket_state()}
7073
) ::
7174
{:ok, TestServer.websocket_reply()}
7275
| {:error, {term(), TestServer.stacktrace()}}
7376
def dispatch(
7477
{instance, _router_ref} = socket,
75-
{:websocket, {:info, options, stacktrace}, state}
78+
{:websocket, {:info, callback, stacktrace}, state}
7679
) do
7780
GenServer.call(
7881
instance,
79-
{:dispatch, {:websocket, socket, {:info, options, stacktrace}, state}}
82+
{:dispatch, {:websocket, socket, {:info, callback, stacktrace}, state}}
8083
)
8184
end
8285

@@ -286,16 +289,13 @@ defmodule TestServer.Instance do
286289
end
287290

288291
def handle_call(
289-
{:dispatch, {:websocket, _socket, {:info, options, stacktrace}, websocket_state}},
292+
{:dispatch, {:websocket, _socket, {:info, callback, stacktrace}, websocket_state}},
290293
_from,
291294
state
292295
) do
293296
res =
294297
try do
295-
unless is_function(options[:to]),
296-
do: raise(BadFunctionError, term: options[:to])
297-
298-
frame = validate_websocket_frame!(options[:to].(websocket_state), stacktrace)
298+
frame = validate_websocket_frame!(callback.(websocket_state), stacktrace)
299299

300300
{:ok, frame}
301301
rescue

lib/test_server/plug_cowboy/handler.ex

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -80,8 +80,8 @@ defmodule TestServer.Plug.Cowboy.Handler do
8080
defp handle_reply({:ok, state}, socket), do: {:ok, {socket, state}}
8181

8282
@impl true
83-
def websocket_info({options, stacktrace}, {socket, state}) do
84-
case Instance.dispatch(socket, {:websocket, {:info, options, stacktrace}, state}) do
83+
def websocket_info({callback, stacktrace}, {socket, state}) do
84+
case Instance.dispatch(socket, {:websocket, {:info, callback, stacktrace}, state}) do
8585
{:ok, result} -> handle_reply(result, socket)
8686
{:error, {error, stacktrace}} -> reply_with_error({socket, state}, {error, stacktrace})
8787
end

test/test_server_test.exs

Lines changed: 5 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -598,12 +598,6 @@ defmodule TestServerTest do
598598
end
599599
end
600600

601-
test "invalid options" do
602-
assert_raise ArgumentError, ~r/`:to` is an invalid option/, fn ->
603-
TestServer.websocket_init("/", to: :invalid)
604-
end
605-
end
606-
607601
test "with invalid callback response" do
608602
defmodule WebSocketInfoInvalidMessageTest do
609603
use ExUnit.Case
@@ -612,7 +606,7 @@ defmodule TestServerTest do
612606
{:ok, _instance} = TestServer.start(suppress_warning: true)
613607
assert {:ok, socket} = TestServer.websocket_init("/ws")
614608
assert {:ok, client} = WebSocketClient.start_link(TestServer.url("/ws"))
615-
assert :ok = TestServer.websocket_info(socket, to: fn _state -> :invalid end)
609+
assert :ok = TestServer.websocket_info(socket, fn _state -> :invalid end)
616610

617611
assert {:ok, message} = WebSocketClient.receive_message(client)
618612
assert message =~ "(RuntimeError) Invalid callback response, got: :invalid."
@@ -632,7 +626,7 @@ defmodule TestServerTest do
632626
assert {:ok, socket} = TestServer.websocket_init("/ws")
633627
assert {:ok, client} = WebSocketClient.start_link(TestServer.url("/ws"))
634628

635-
assert :ok = TestServer.websocket_info(socket, to: fn _state -> raise "boom" end)
629+
assert :ok = TestServer.websocket_info(socket, fn _state -> raise "boom" end)
636630

637631
assert {:ok, message} = WebSocketClient.receive_message(client)
638632
assert message =~ "(RuntimeError) boom"
@@ -649,11 +643,9 @@ defmodule TestServerTest do
649643
assert {:ok, client} = WebSocketClient.start_link(TestServer.url("/ws"))
650644

651645
assert :ok =
652-
TestServer.websocket_info(socket,
653-
to: fn state ->
654-
{:reply, {:text, "pong"}, state}
655-
end
656-
)
646+
TestServer.websocket_info(socket, fn state ->
647+
{:reply, {:text, "pong"}, state}
648+
end)
657649

658650
assert {:ok, "pong"} = WebSocketClient.receive_message(client)
659651
end

0 commit comments

Comments
 (0)