@@ -187,6 +187,97 @@ test('getChannel should use CHANNEL property of classType provided', () => {
187
187
expect ( channel ) . toBe ( 'dummy-ping' ) ;
188
188
} ) ;
189
189
190
+ describe ( 'subscribe' , ( ) => {
191
+ beforeEach ( ( ) => {
192
+ window . addEventListener = vi . fn ( ) ;
193
+
194
+ ( defaultNoTimeoutChannels . noTimeoutChannels as string [ ] ) = [ ] ;
195
+ } ) ;
196
+
197
+ function getMessageListener ( ) : ( event : MessageEvent ) => void {
198
+ expect ( window . addEventListener ) . toHaveBeenCalledOnce ( ) ;
199
+ expect ( window . addEventListener ) . toHaveBeenCalledWith ( 'message' , expect . any ( Function ) ) ;
200
+ return vi . mocked ( window . addEventListener ) . mock . calls [ 0 ] [ 1 ] as ( event : MessageEvent ) => void ;
201
+ }
202
+
203
+ test ( 'subscriber should be called on event received' , async ( ) => {
204
+ const rpcBrowser = new RpcBrowser ( window , api ) ;
205
+ const messageListener = getMessageListener ( ) ;
206
+
207
+ const listener = vi . fn ( ) ;
208
+ rpcBrowser . subscribe ( 'example' , listener ) ;
209
+
210
+ messageListener ( {
211
+ data : {
212
+ id : 'example' ,
213
+ body : 'hello' ,
214
+ } ,
215
+ } as unknown as MessageEvent ) ;
216
+
217
+ expect ( listener ) . toHaveBeenCalledOnce ( ) ;
218
+ } ) ;
219
+
220
+ test ( 'all subscribers should be called if multiple exists' , async ( ) => {
221
+ const rpcBrowser = new RpcBrowser ( window , api ) ;
222
+ const messageListener = getMessageListener ( ) ;
223
+
224
+ const listeners = Array . from ( { length : 10 } , _ => vi . fn ( ) ) ;
225
+
226
+ listeners . forEach ( listener => rpcBrowser . subscribe ( 'example' , listener ) ) ;
227
+
228
+ messageListener ( {
229
+ data : {
230
+ id : 'example' ,
231
+ body : 'hello' ,
232
+ } ,
233
+ } as unknown as MessageEvent ) ;
234
+
235
+ for ( const listener of listeners ) {
236
+ expect ( listener ) . toHaveBeenCalledWith ( 'hello' ) ;
237
+ }
238
+ } ) ;
239
+
240
+ test ( 'subscribers which unsubscribe should not be called' , async ( ) => {
241
+ const rpcBrowser = new RpcBrowser ( window , api ) ;
242
+ const messageListener = getMessageListener ( ) ;
243
+
244
+ const [ listenerA , listenerB ] = [ vi . fn ( ) , vi . fn ( ) ] ;
245
+
246
+ const unsubscriberA = rpcBrowser . subscribe ( 'example' , listenerA ) ;
247
+ const unsubscriberB = rpcBrowser . subscribe ( 'example' , listenerB ) ;
248
+
249
+ messageListener ( {
250
+ data : {
251
+ id : 'example' ,
252
+ body : 'hello' ,
253
+ } ,
254
+ } as unknown as MessageEvent ) ;
255
+
256
+ // unsubscriber the listener B
257
+ unsubscriberB . unsubscribe ( ) ;
258
+
259
+ messageListener ( {
260
+ data : {
261
+ id : 'example' ,
262
+ body : 'hello' ,
263
+ } ,
264
+ } as unknown as MessageEvent ) ;
265
+
266
+ // unsubscriber the listener A
267
+ unsubscriberA . unsubscribe ( ) ;
268
+
269
+ messageListener ( {
270
+ data : {
271
+ id : 'example' ,
272
+ body : 'hello' ,
273
+ } ,
274
+ } as unknown as MessageEvent ) ;
275
+
276
+ expect ( listenerA ) . toHaveBeenCalledTimes ( 2 ) ;
277
+ expect ( listenerB ) . toHaveBeenCalledOnce ( ) ;
278
+ } ) ;
279
+ } ) ;
280
+
190
281
describe ( 'no timeout channel' , ( ) => {
191
282
beforeEach ( ( ) => {
192
283
vi . resetAllMocks ( ) ;
0 commit comments