1+ import Redis from 'ioredis-mock'
2+ import { createRedisEventTarget } from '@graphql-yoga/redis-event-target'
13import { createPubSub } from './createPubSub.js'
24
35async function collectAsyncIterableValues < TType > (
@@ -18,97 +20,118 @@ describe('createPubSub', () => {
1820 it ( 'create' , ( ) => {
1921 createPubSub ( )
2022 } )
21- it ( 'subscribe to topic' , async ( ) => {
22- const pubSub = createPubSub < {
23- a : [ number ]
24- } > ( )
25-
26- const sub = pubSub . subscribe ( 'a' )
27- const allValues = collectAsyncIterableValues ( sub )
28- pubSub . publish ( 'a' , 1 )
29- pubSub . publish ( 'a' , 2 )
30- pubSub . publish ( 'a' , 3 )
31-
32- setImmediate ( ( ) => {
33- sub . return ( )
34- } )
3523
36- const result = await allValues
37- expect ( result ) . toEqual ( [ 1 , 2 , 3 ] )
38- } )
39- it ( 'subscribe to multiple topics' , async ( ) => {
40- const pubSub = createPubSub < {
41- a : [ number ]
42- b : [ string ]
43- } > ( )
44-
45- const sub1 = pubSub . subscribe ( 'a' )
46- const sub2 = pubSub . subscribe ( 'b' )
47- const allValues1 = collectAsyncIterableValues ( sub1 )
48- const allValues2 = collectAsyncIterableValues ( sub2 )
49-
50- pubSub . publish ( 'a' , 1 )
51- pubSub . publish ( 'b' , '1' )
52- pubSub . publish ( 'a' , 2 )
53- pubSub . publish ( 'b' , '2' )
54- pubSub . publish ( 'a' , 3 )
55- pubSub . publish ( 'b' , '3' )
56-
57- setImmediate ( ( ) => {
58- sub1 . return ( )
59- sub2 . return ( )
24+ describe . each ( [
25+ [ 'InMemory' , ( ) => new globalThis . EventTarget ( ) ] ,
26+ [
27+ 'Redis' ,
28+ ( ) =>
29+ createRedisEventTarget ( {
30+ publishClient : new Redis ( { } ) ,
31+ subscribeClient : new Redis ( { } ) ,
32+ } ) ,
33+ ] ,
34+ ] ) ( `API %s` , ( _ , createEventTarget ) => {
35+ it ( 'subscribe to topic' , async ( ) => {
36+ const pubSub = createPubSub < {
37+ a : [ number ]
38+ } > ( {
39+ eventTarget : createEventTarget ( ) ,
40+ } )
41+
42+ const sub = pubSub . subscribe ( 'a' )
43+ const allValues = collectAsyncIterableValues ( sub )
44+ pubSub . publish ( 'a' , 1 )
45+ pubSub . publish ( 'a' , 2 )
46+ pubSub . publish ( 'a' , 3 )
47+
48+ setImmediate ( ( ) => {
49+ sub . return ( )
50+ } )
51+
52+ const result = await allValues
53+ expect ( result ) . toEqual ( [ 1 , 2 , 3 ] )
6054 } )
55+ it ( 'subscribe to multiple topics' , async ( ) => {
56+ const pubSub = createPubSub < {
57+ a : [ number ]
58+ b : [ string ]
59+ } > ( {
60+ eventTarget : createEventTarget ( ) ,
61+ } )
6162
62- const result1 = await allValues1
63- const result2 = await allValues2
64- expect ( result1 ) . toEqual ( [ 1 , 2 , 3 ] )
65- expect ( result2 ) . toEqual ( [ '1' , '2' , '3' ] )
66- } )
67- it ( 'subscribe to fine-grained topic' , async ( ) => {
68- const pubSub = createPubSub < {
69- a : [ id : string , payload : number ]
70- } > ( )
71- const id1 = '1'
72- const sub1 = pubSub . subscribe ( 'a' , id1 )
73- const allValues1 = collectAsyncIterableValues ( sub1 )
74- pubSub . publish ( 'a' , id1 , 1 )
75- pubSub . publish ( 'a' , id1 , 2 )
76- pubSub . publish ( 'a' , id1 , 3 )
77- setImmediate ( ( ) => {
78- sub1 . return ( )
63+ const sub1 = pubSub . subscribe ( 'a' )
64+ const sub2 = pubSub . subscribe ( 'b' )
65+ const allValues1 = collectAsyncIterableValues ( sub1 )
66+ const allValues2 = collectAsyncIterableValues ( sub2 )
67+
68+ pubSub . publish ( 'a' , 1 )
69+ pubSub . publish ( 'b' , '1' )
70+ pubSub . publish ( 'a' , 2 )
71+ pubSub . publish ( 'b' , '2' )
72+ pubSub . publish ( 'a' , 3 )
73+ pubSub . publish ( 'b' , '3' )
74+
75+ setImmediate ( ( ) => {
76+ sub1 . return ( )
77+ sub2 . return ( )
78+ } )
79+
80+ const result1 = await allValues1
81+ const result2 = await allValues2
82+ expect ( result1 ) . toEqual ( [ 1 , 2 , 3 ] )
83+ expect ( result2 ) . toEqual ( [ '1' , '2' , '3' ] )
7984 } )
85+ it ( 'subscribe to fine-grained topic' , async ( ) => {
86+ const pubSub = createPubSub < {
87+ a : [ id : string , payload : number ]
88+ } > ( {
89+ eventTarget : createEventTarget ( ) ,
90+ } )
91+ const id1 = '1'
92+ const sub1 = pubSub . subscribe ( 'a' , id1 )
93+ const allValues1 = collectAsyncIterableValues ( sub1 )
94+ pubSub . publish ( 'a' , id1 , 1 )
95+ pubSub . publish ( 'a' , id1 , 2 )
96+ pubSub . publish ( 'a' , id1 , 3 )
97+ setImmediate ( ( ) => {
98+ sub1 . return ( )
99+ } )
80100
81- const result1 = await allValues1
82- expect ( result1 ) . toEqual ( [ 1 , 2 , 3 ] )
83- } )
84- it ( 'subscribe to multiple fine-grained topics' , async ( ) => {
85- const pubSub = createPubSub < {
86- a : [ id : string , payload : number ]
87- b : [ id : string , payload : string ]
88- } > ( )
89- const id1 = '1'
90- const id2 = '1'
91-
92- const sub1 = pubSub . subscribe ( 'a' , id1 )
93- const sub2 = pubSub . subscribe ( 'b' , id2 )
94-
95- const allValues1 = collectAsyncIterableValues ( sub1 )
96- const allValues2 = collectAsyncIterableValues ( sub2 )
97-
98- pubSub . publish ( 'a' , id1 , 1 )
99- pubSub . publish ( 'b' , id1 , '1' )
100- pubSub . publish ( 'a' , id1 , 2 )
101- pubSub . publish ( 'b' , id1 , '2' )
102- pubSub . publish ( 'a' , id1 , 3 )
103- pubSub . publish ( 'b' , id1 , '3' )
104- setImmediate ( ( ) => {
105- sub1 . return ( )
106- sub2 . return ( )
101+ const result1 = await allValues1
102+ expect ( result1 ) . toEqual ( [ 1 , 2 , 3 ] )
107103 } )
104+ it ( 'subscribe to multiple fine-grained topics' , async ( ) => {
105+ const pubSub = createPubSub < {
106+ a : [ id : string , payload : number ]
107+ b : [ id : string , payload : string ]
108+ } > ( {
109+ eventTarget : createEventTarget ( ) ,
110+ } )
111+ const id1 = '1'
112+ const id2 = '1'
113+
114+ const sub1 = pubSub . subscribe ( 'a' , id1 )
115+ const sub2 = pubSub . subscribe ( 'b' , id2 )
108116
109- const result1 = await allValues1
110- const result2 = await allValues2
111- expect ( result1 ) . toEqual ( [ 1 , 2 , 3 ] )
112- expect ( result2 ) . toEqual ( [ '1' , '2' , '3' ] )
117+ const allValues1 = collectAsyncIterableValues ( sub1 )
118+ const allValues2 = collectAsyncIterableValues ( sub2 )
119+
120+ pubSub . publish ( 'a' , id1 , 1 )
121+ pubSub . publish ( 'b' , id1 , '1' )
122+ pubSub . publish ( 'a' , id1 , 2 )
123+ pubSub . publish ( 'b' , id1 , '2' )
124+ pubSub . publish ( 'a' , id1 , 3 )
125+ pubSub . publish ( 'b' , id1 , '3' )
126+ setImmediate ( ( ) => {
127+ sub1 . return ( )
128+ sub2 . return ( )
129+ } )
130+
131+ const result1 = await allValues1
132+ const result2 = await allValues2
133+ expect ( result1 ) . toEqual ( [ 1 , 2 , 3 ] )
134+ expect ( result2 ) . toEqual ( [ '1' , '2' , '3' ] )
135+ } )
113136 } )
114137} )
0 commit comments