@@ -34,7 +34,8 @@ defmodule Phoenix.PresenceTest do
34
34
Phoenix.Presence . init ( {
35
35
__MODULE__ ,
36
36
__MODULE__ . TaskSupervisor ,
37
- PresPub
37
+ PresPub ,
38
+ Phoenix.Channel.Server
38
39
} )
39
40
end
40
41
@@ -43,13 +44,27 @@ defmodule Phoenix.PresenceTest do
43
44
end
44
45
end
45
46
47
+ defmodule CustomDispatcher do
48
+ def dispatch ( entries , from , message ) do
49
+ for { pid , _ } <- entries , pid != from , do: send ( pid , { :custom_dispatcher , message } )
50
+
51
+ :ok
52
+ end
53
+ end
54
+
55
+ defmodule CustomDispatcherPresence do
56
+ use Phoenix.Presence , otp_app: :phoenix , dispatcher: CustomDispatcher
57
+ end
58
+
46
59
Application . put_env ( :phoenix , MyPresence , pubsub_server: PresPub )
47
60
Application . put_env ( :phoenix , MetasPresence , pubsub_server: PresPub )
61
+ Application . put_env ( :phoenix , CustomDispatcherPresence , pubsub_server: PresPub )
48
62
49
63
setup_all do
50
64
start_supervised! ( { Phoenix.PubSub , name: PresPub , pool_size: 1 } )
51
65
start_supervised! ( MyPresence )
52
66
start_supervised! ( MetasPresence )
67
+ start_supervised! ( CustomDispatcherPresence )
53
68
{ :ok , pubsub: PresPub }
54
69
end
55
70
@@ -174,6 +189,40 @@ defmodule Phoenix.PresenceTest do
174
189
assert MyPresence . list ( topic ) == % { }
175
190
end
176
191
192
+ test "handle_diff with custom dispatcher" , % { topic: topic } = config do
193
+ pid = spawn ( fn -> :timer . sleep ( :infinity ) end )
194
+ Phoenix.PubSub . subscribe ( config . pubsub , topic )
195
+ start_supervised! ( { DefaultPresence , pubsub_server: config . pubsub } )
196
+ CustomDispatcherPresence . track ( pid , topic , "u1" , % { name: "u1" } )
197
+
198
+ assert_receive { :custom_dispatcher ,
199
+ % Broadcast {
200
+ topic: ^ topic ,
201
+ event: "presence_diff" ,
202
+ payload: % {
203
+ joins: % { "u1" => % { metas: [ % { name: "u1" , phx_ref: u1_ref } ] } } ,
204
+ leaves: % { }
205
+ }
206
+ } }
207
+
208
+ assert % { "u1" => % { metas: [ % { name: "u1" , phx_ref: ^ u1_ref } ] } } =
209
+ CustomDispatcherPresence . list ( topic )
210
+
211
+ Process . exit ( pid , :kill )
212
+
213
+ assert_receive { :custom_dispatcher ,
214
+ % Broadcast {
215
+ topic: ^ topic ,
216
+ event: "presence_diff" ,
217
+ payload: % {
218
+ joins: % { } ,
219
+ leaves: % { "u1" => % { metas: [ % { name: "u1" , phx_ref: ^ u1_ref } ] } }
220
+ }
221
+ } }
222
+
223
+ assert CustomDispatcherPresence . list ( topic ) == % { }
224
+ end
225
+
177
226
test "untrack with pid" , % { topic: topic } = config do
178
227
Phoenix.PubSub . subscribe ( config . pubsub , config . topic )
179
228
MyPresence . track ( self ( ) , config . topic , "u1" , % { } )
0 commit comments