@@ -99,7 +99,7 @@ defmodule RealtimeWeb.RealtimeChannel.PresenceHandlerTest do
9999    end 
100100  end 
101101
102-   describe  "handle/2 "  do 
102+   describe  "handle/3 "  do 
103103    test  "with true policy and is private, user can track their presence and changes" ,  % { 
104104      tenant:  tenant , 
105105      topic:  topic , 
@@ -142,7 +142,7 @@ defmodule RealtimeWeb.RealtimeChannel.PresenceHandlerTest do
142142      policies  =  % Policies { presence:  % PresencePolicies { read:  false ,  write:  false } } 
143143      socket  =  socket_fixture ( tenant ,  topic ,  key ,  policies:  policies ,  private?:  false ) 
144144
145-       assert  { :ok ,  _socket }  =  PresenceHandler . handle ( % { "event"  =>  "track" } ,  socket ) 
145+       assert  { :ok ,  _socket }  =  PresenceHandler . handle ( % { "event"  =>  "track" } ,  nil ,   socket ) 
146146
147147      topic  =  socket . assigns . tenant_topic 
148148      assert_receive  % Broadcast { topic:  ^ topic ,  event:  "presence_diff" ,  payload:  % { joins:  joins ,  leaves:  % { } } } 
@@ -229,6 +229,7 @@ defmodule RealtimeWeb.RealtimeChannel.PresenceHandlerTest do
229229          assert  { :ok ,  socket }  = 
230230                   PresenceHandler . handle ( 
231231                     % { "event"  =>  "track" ,  "payload"  =>  % { "metadata"  =>  random_string ( ) } } , 
232+                      nil , 
232233                     socket 
233234                   ) 
234235
@@ -248,20 +249,20 @@ defmodule RealtimeWeb.RealtimeChannel.PresenceHandlerTest do
248249      assert  log  =~  "UnknownPresenceEvent" 
249250    end 
250251
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" ,  % { 
252253      tenant:  tenant , 
253254      topic:  topic 
254255    }  do 
255256      key  =  random_string ( ) 
256257      policies  =  % Policies { presence:  % PresencePolicies { read:  true ,  write:  true } } 
257258      socket  =  socket_fixture ( tenant ,  topic ,  key ,  policies:  policies ,  private?:  false ,  enabled?:  false ) 
258259
259-       assert  { :ok ,  _socket }  =  PresenceHandler . handle ( % { "event"  =>  "track"  } ,  socket ) 
260+       assert  { :ok ,  _socket }  =  PresenceHandler . handle ( % { "event"  =>  "untrack"  } ,   nil ,  socket ) 
260261      topic  =  socket . assigns . tenant_topic 
261262      refute_receive  % Broadcast { topic:  ^ topic ,  event:  "presence_diff" } 
262263    end 
263264
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" ,  % { 
265266      tenant:  tenant , 
266267      topic:  topic , 
267268      db_conn:  db_conn 
@@ -270,11 +271,80 @@ defmodule RealtimeWeb.RealtimeChannel.PresenceHandlerTest do
270271      policies  =  % Policies { presence:  % PresencePolicies { read:  true ,  write:  true } } 
271272      socket  =  socket_fixture ( tenant ,  topic ,  key ,  policies:  policies ,  private?:  false ,  enabled?:  false ) 
272273
273-       assert  { :ok ,  _socket }  =  PresenceHandler . handle ( % { "event"  =>  "track " } ,  db_conn ,  socket ) 
274+       assert  { :ok ,  _socket }  =  PresenceHandler . handle ( % { "event"  =>  "untrack " } ,  db_conn ,  socket ) 
274275      topic  =  socket . assigns . tenant_topic 
275276      refute_receive  % Broadcast { topic:  ^ topic ,  event:  "presence_diff" } 
276277    end 
277278
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+ 
278348    @ tag  policies:  [ :authenticated_read_broadcast_and_presence ,  :authenticated_write_broadcast_and_presence ] 
279349    test  "rate limit is checked on private channel" ,  % { tenant:  tenant ,  topic:  topic ,  db_conn:  db_conn }  do 
280350      key  =  random_string ( ) 
0 commit comments