@@ -99,7 +99,7 @@ defmodule RealtimeWeb.RealtimeChannel.PresenceHandlerTest do
99
99
end
100
100
end
101
101
102
- describe "handle/2 " do
102
+ describe "handle/3 " do
103
103
test "with true policy and is private, user can track their presence and changes" , % {
104
104
tenant: tenant ,
105
105
topic: topic ,
@@ -142,7 +142,7 @@ defmodule RealtimeWeb.RealtimeChannel.PresenceHandlerTest do
142
142
policies = % Policies { presence: % PresencePolicies { read: false , write: false } }
143
143
socket = socket_fixture ( tenant , topic , key , policies: policies , private?: false )
144
144
145
- assert { :ok , _socket } = PresenceHandler . handle ( % { "event" => "track" } , socket )
145
+ assert { :ok , _socket } = PresenceHandler . handle ( % { "event" => "track" } , nil , socket )
146
146
147
147
topic = socket . assigns . tenant_topic
148
148
assert_receive % Broadcast { topic: ^ topic , event: "presence_diff" , payload: % { joins: joins , leaves: % { } } }
@@ -229,6 +229,7 @@ defmodule RealtimeWeb.RealtimeChannel.PresenceHandlerTest do
229
229
assert { :ok , socket } =
230
230
PresenceHandler . handle (
231
231
% { "event" => "track" , "payload" => % { "metadata" => random_string ( ) } } ,
232
+ nil ,
232
233
socket
233
234
)
234
235
@@ -248,20 +249,20 @@ defmodule RealtimeWeb.RealtimeChannel.PresenceHandlerTest do
248
249
assert log =~ "UnknownPresenceEvent"
249
250
end
250
251
251
- test "socket with presence enabled false will ignore presence events in public channel" , % {
252
+ test "socket with presence enabled false will ignore non-track presence events in public channel" , % {
252
253
tenant: tenant ,
253
254
topic: topic
254
255
} do
255
256
key = random_string ( )
256
257
policies = % Policies { presence: % PresencePolicies { read: true , write: true } }
257
258
socket = socket_fixture ( tenant , topic , key , policies: policies , private?: false , enabled?: false )
258
259
259
- assert { :ok , _socket } = PresenceHandler . handle ( % { "event" => "track" } , socket )
260
+ assert { :ok , _socket } = PresenceHandler . handle ( % { "event" => "untrack" } , nil , socket )
260
261
topic = socket . assigns . tenant_topic
261
262
refute_receive % Broadcast { topic: ^ topic , event: "presence_diff" }
262
263
end
263
264
264
- test "socket with presence enabled false will ignore presence events in private channel" , % {
265
+ test "socket with presence enabled false will ignore non-track presence events in private channel" , % {
265
266
tenant: tenant ,
266
267
topic: topic ,
267
268
db_conn: db_conn
@@ -270,11 +271,80 @@ defmodule RealtimeWeb.RealtimeChannel.PresenceHandlerTest do
270
271
policies = % Policies { presence: % PresencePolicies { read: true , write: true } }
271
272
socket = socket_fixture ( tenant , topic , key , policies: policies , private?: false , enabled?: false )
272
273
273
- assert { :ok , _socket } = PresenceHandler . handle ( % { "event" => "track " } , db_conn , socket )
274
+ assert { :ok , _socket } = PresenceHandler . handle ( % { "event" => "untrack " } , db_conn , socket )
274
275
topic = socket . assigns . tenant_topic
275
276
refute_receive % Broadcast { topic: ^ topic , event: "presence_diff" }
276
277
end
277
278
279
+ test "socket with presence disabled will enable presence on track message for public channel" , % {
280
+ tenant: tenant ,
281
+ topic: topic
282
+ } do
283
+ key = random_string ( )
284
+ policies = % Policies { presence: % PresencePolicies { read: true , write: true } }
285
+ socket = socket_fixture ( tenant , topic , key , policies: policies , private?: false , enabled?: false )
286
+
287
+ refute socket . assigns . presence_enabled?
288
+
289
+ assert { :ok , updated_socket } = PresenceHandler . handle ( % { "event" => "track" } , nil , socket )
290
+
291
+ assert updated_socket . assigns . presence_enabled?
292
+ topic = socket . assigns . tenant_topic
293
+ assert_receive % Broadcast { topic: ^ topic , event: "presence_diff" , payload: % { joins: joins , leaves: % { } } }
294
+ assert Map . has_key? ( joins , key )
295
+ end
296
+
297
+ test "socket with presence disabled will enable presence on track message for private channel" , % {
298
+ tenant: tenant ,
299
+ topic: topic ,
300
+ db_conn: db_conn
301
+ } do
302
+ key = random_string ( )
303
+ policies = % Policies { presence: % PresencePolicies { read: true , write: true } }
304
+ socket = socket_fixture ( tenant , topic , key , policies: policies , private?: true , enabled?: false )
305
+
306
+ refute socket . assigns . presence_enabled?
307
+
308
+ assert { :ok , updated_socket } = PresenceHandler . handle ( % { "event" => "track" } , db_conn , socket )
309
+
310
+ assert updated_socket . assigns . presence_enabled?
311
+ topic = socket . assigns . tenant_topic
312
+ assert_receive % Broadcast { topic: ^ topic , event: "presence_diff" , payload: % { joins: joins , leaves: % { } } }
313
+ assert Map . has_key? ( joins , key )
314
+ end
315
+
316
+ test "socket with presence disabled will not enable presence on untrack message" , % {
317
+ tenant: tenant ,
318
+ topic: topic ,
319
+ db_conn: db_conn
320
+ } do
321
+ key = random_string ( )
322
+ policies = % Policies { presence: % PresencePolicies { read: true , write: true } }
323
+ socket = socket_fixture ( tenant , topic , key , policies: policies , enabled?: false )
324
+
325
+ refute socket . assigns . presence_enabled?
326
+
327
+ assert { :ok , updated_socket } = PresenceHandler . handle ( % { "event" => "untrack" } , db_conn , socket )
328
+
329
+ refute updated_socket . assigns . presence_enabled?
330
+ topic = socket . assigns . tenant_topic
331
+ refute_receive % Broadcast { topic: ^ topic , event: "presence_diff" }
332
+ end
333
+
334
+ test "socket with presence disabled will not enable presence on unknown event" , % {
335
+ tenant: tenant ,
336
+ topic: topic ,
337
+ db_conn: db_conn
338
+ } do
339
+ key = random_string ( )
340
+ policies = % Policies { presence: % PresencePolicies { read: true , write: true } }
341
+ socket = socket_fixture ( tenant , topic , key , policies: policies , enabled?: false )
342
+
343
+ refute socket . assigns . presence_enabled?
344
+
345
+ assert { :error , :unknown_presence_event } = PresenceHandler . handle ( % { "event" => "unknown" } , db_conn , socket )
346
+ end
347
+
278
348
@ tag policies: [ :authenticated_read_broadcast_and_presence , :authenticated_write_broadcast_and_presence ]
279
349
test "rate limit is checked on private channel" , % { tenant: tenant , topic: topic , db_conn: db_conn } do
280
350
key = random_string ( )
0 commit comments