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 );
66
+ $ message = $ this -> getSignedMessage ( $ connection , ' presence-channel ' , $ channelData );
75
67
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 ([
77
108
'event ' => 'pusher:subscribe ' ,
78
109
'data ' => [
79
110
'auth ' => $ connection ->app ->key .': ' .hash_hmac ('sha256 ' , $ signature , $ connection ->app ->secret ),
80
- 'channel ' => ' presence-channel ' ,
111
+ 'channel ' => $ channelName ,
81
112
'channel_data ' => json_encode ($ channelData ),
82
113
],
83
114
]));
84
-
85
- $ this ->pusherServer ->onMessage ($ connection , $ message );
86
-
87
- $ connection ->assertSentEvent ('pusher_internal:subscription_succeeded ' , [
88
- 'channel ' => 'presence-channel ' ,
89
- ]);
90
115
}
91
116
}
0 commit comments