2
2
3
3
namespace BeyondCode \LaravelWebSockets \Tests \Channels ;
4
4
5
+ use BeyondCode \LaravelWebSockets \Tests \Mocks \Connection ;
5
6
use BeyondCode \LaravelWebSockets \Tests \Mocks \Message ;
6
7
use BeyondCode \LaravelWebSockets \Tests \TestCase ;
7
8
use BeyondCode \LaravelWebSockets \WebSockets \Exceptions \InvalidSignature ;
@@ -42,16 +43,7 @@ public function clients_with_valid_auth_signatures_can_join_presence_channels()
42
43
],
43
44
];
44
45
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 );
55
47
56
48
$ this ->pusherServer ->onMessage ($ connection , $ message );
57
49
@@ -71,21 +63,54 @@ public function clients_with_no_user_info_can_join_presence_channels()
71
63
'user_id ' => 1 ,
72
64
];
73
65
74
- $ signature = "{$ connection ->socketId }:presence-channel: " .json_encode ($ channelData );
75
-
76
- $ message = new Message (json_encode ([
77
- 'event ' => 'pusher:subscribe ' ,
78
- 'data ' => [
79
- 'auth ' => $ connection ->app ->key .': ' .hash_hmac ('sha256 ' , $ signature , $ connection ->app ->secret ),
80
- 'channel ' => 'presence-channel ' ,
81
- 'channel_data ' => json_encode ($ channelData ),
82
- ],
83
- ]));
66
+ $ message = $ this ->getSignedMessage ($ connection , 'presence-channel ' , $ channelData );
84
67
85
68
$ this ->pusherServer ->onMessage ($ connection , $ message );
86
69
87
70
$ connection ->assertSentEvent ('pusher_internal:subscription_succeeded ' , [
88
71
'channel ' => 'presence-channel ' ,
89
72
]);
90
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 ([
108
+ 'event ' => 'pusher:subscribe ' ,
109
+ 'data ' => [
110
+ 'auth ' => $ connection ->app ->key . ': ' . hash_hmac ('sha256 ' , $ signature , $ connection ->app ->secret ),
111
+ 'channel ' => $ channelName ,
112
+ 'channel_data ' => json_encode ($ channelData ),
113
+ ],
114
+ ]));
115
+ }
91
116
}
0 commit comments