22
33namespace BeyondCode \LaravelWebSockets \Tests \Channels ;
44
5+ use BeyondCode \LaravelWebSockets \Tests \Mocks \Connection ;
56use BeyondCode \LaravelWebSockets \Tests \Mocks \Message ;
67use BeyondCode \LaravelWebSockets \Tests \TestCase ;
78use BeyondCode \LaravelWebSockets \WebSockets \Exceptions \InvalidSignature ;
@@ -42,16 +43,7 @@ public function clients_with_valid_auth_signatures_can_join_presence_channels()
4243 ],
4344 ];
4445
45- $ signature = "{$ connection ->socketId }:presence-channel: " .json_encode ($ channelData );
46-
47- $ message = new Message (json_encode ([
48- 'event ' => 'pusher:subscribe ' ,
49- 'data ' => [
50- 'auth ' => $ connection ->app ->key .': ' .hash_hmac ('sha256 ' , $ signature , $ connection ->app ->secret ),
51- 'channel ' => 'presence-channel ' ,
52- 'channel_data ' => json_encode ($ channelData ),
53- ],
54- ]));
46+ $ message = $ this ->getSignedMessage ($ connection , 'presence-channel ' , $ channelData );
5547
5648 $ this ->pusherServer ->onMessage ($ connection , $ message );
5749
@@ -71,21 +63,54 @@ public function clients_with_no_user_info_can_join_presence_channels()
7163 'user_id ' => 1 ,
7264 ];
7365
74- $ signature = "{ $ connection -> socketId } : presence-channel: " . json_encode ( $ channelData );
66+ $ message = $ this -> getSignedMessage ( $ connection , ' presence-channel ' , $ channelData );
7567
76- $ message = new Message (json_encode ([
68+ $ this ->pusherServer ->onMessage ($ connection , $ message );
69+
70+ $ connection ->assertSentEvent ('pusher_internal:subscription_succeeded ' , [
71+ 'channel ' => 'presence-channel ' ,
72+ ]);
73+ }
74+
75+ /** @test */
76+ public function multiple_clients_with_same_user_id_are_counted_once ()
77+ {
78+ $ this ->pusherServer ->onOpen ($ connection = $ this ->getWebSocketConnection ());
79+ $ this ->pusherServer ->onOpen ($ connection2 = $ this ->getWebSocketConnection ());
80+
81+ $ channelName = 'presence-channel ' ;
82+ $ channelData = [
83+ 'user_id ' => $ userId = 1 ,
84+ ];
85+
86+ $ this ->pusherServer ->onMessage ($ connection , $ this ->getSignedMessage ($ connection , $ channelName , $ channelData ));
87+ $ this ->pusherServer ->onMessage ($ connection2 , $ this ->getSignedMessage ($ connection2 , $ channelName , $ channelData ));
88+
89+ $ connection2 ->assertSentEvent ('pusher_internal:subscription_succeeded ' , [
90+ 'channel ' => $ channelName ,
91+ 'data ' => json_encode ([
92+ 'presence ' => [
93+ 'ids ' => [(string ) $ userId ],
94+ 'hash ' => [
95+ (string ) $ userId => [],
96+ ],
97+ 'count ' => 1 ,
98+ ],
99+ ]),
100+ ]);
101+ }
102+
103+ private function getSignedMessage (Connection $ connection , string $ channelName , array $ channelData ): Message
104+ {
105+ $ signature = "{$ connection ->socketId }: {$ channelName }: " .json_encode ($ channelData );
106+
107+ return new Message (json_encode ([
77108 'event ' => 'pusher:subscribe ' ,
78109 'data ' => [
79110 'auth ' => $ connection ->app ->key .': ' .hash_hmac ('sha256 ' , $ signature , $ connection ->app ->secret ),
80- 'channel ' => ' presence-channel ' ,
111+ 'channel ' => $ channelName ,
81112 'channel_data ' => json_encode ($ channelData ),
82113 ],
83114 ]));
84-
85- $ this ->pusherServer ->onMessage ($ connection , $ message );
86-
87- $ connection ->assertSentEvent ('pusher_internal:subscription_succeeded ' , [
88- 'channel ' => 'presence-channel ' ,
89- ]);
90115 }
91116}
0 commit comments