@@ -5,6 +5,8 @@ import { expectJSON } from '../../__testUtils__/expectJSON';
5
5
import { resolveOnNextTick } from '../../__testUtils__/resolveOnNextTick' ;
6
6
7
7
import { isAsyncIterable } from '../../jsutils/isAsyncIterable' ;
8
+ import { isPromise } from '../../jsutils/isPromise' ;
9
+ import type { PromiseOrValue } from '../../jsutils/PromiseOrValue' ;
8
10
9
11
import { parse } from '../../language/parser' ;
10
12
@@ -123,38 +125,59 @@ function createSubscription(pubsub: SimplePubSub<Email>) {
123
125
return subscribe ( { schema : emailSchema , document, rootValue : data } ) ;
124
126
}
125
127
126
- async function expectPromise ( promise : Promise < unknown > ) {
127
- let caughtError : Error ;
128
-
129
- try {
130
- /* c8 ignore next 2 */
131
- await promise ;
132
- expect . fail ( 'promise should have thrown but did not' ) ;
133
- } catch ( error ) {
134
- caughtError = error ;
135
- }
128
+ // TODO: consider adding this method to testUtils (with tests)
129
+ function expectPromise ( maybePromise : unknown ) {
130
+ assert ( isPromise ( maybePromise ) ) ;
136
131
137
132
return {
138
- toReject ( ) {
139
- expect ( caughtError ) . to . be . an . instanceOf ( Error ) ;
133
+ toResolve ( ) {
134
+ return maybePromise ;
140
135
} ,
141
- toRejectWith ( message : string ) {
136
+ async toRejectWith ( message : string ) {
137
+ let caughtError : Error ;
138
+
139
+ try {
140
+ /* c8 ignore next 2 */
141
+ await maybePromise ;
142
+ expect . fail ( 'promise should have thrown but did not' ) ;
143
+ } catch ( error ) {
144
+ caughtError = error ;
145
+ }
146
+
142
147
expect ( caughtError ) . to . be . an . instanceOf ( Error ) ;
143
148
expect ( caughtError ) . to . have . property ( 'message' , message ) ;
144
149
} ,
145
150
} ;
146
151
}
147
152
153
+ // TODO: consider adding this method to testUtils (with tests)
154
+ function expectEqualPromisesOrValues < T > (
155
+ value1 : PromiseOrValue < T > ,
156
+ value2 : PromiseOrValue < T > ,
157
+ ) : PromiseOrValue < T > {
158
+ if ( isPromise ( value1 ) ) {
159
+ assert ( isPromise ( value2 ) ) ;
160
+ return Promise . all ( [ value1 , value2 ] ) . then ( ( resolved ) => {
161
+ expectJSON ( resolved [ 1 ] ) . toDeepEqual ( resolved [ 0 ] ) ;
162
+ return resolved [ 0 ] ;
163
+ } ) ;
164
+ }
165
+
166
+ assert ( ! isPromise ( value2 ) ) ;
167
+ expectJSON ( value2 ) . toDeepEqual ( value1 ) ;
168
+ return value1 ;
169
+ }
170
+
148
171
const DummyQueryType = new GraphQLObjectType ( {
149
172
name : 'Query' ,
150
173
fields : {
151
174
dummy : { type : GraphQLString } ,
152
175
} ,
153
176
} ) ;
154
177
155
- async function subscribeWithBadFn (
178
+ function subscribeWithBadFn (
156
179
subscribeFn : ( ) => unknown ,
157
- ) : Promise < ExecutionResult > {
180
+ ) : PromiseOrValue < ExecutionResult | AsyncIterable < unknown > > {
158
181
const schema = new GraphQLSchema ( {
159
182
query : DummyQueryType ,
160
183
subscription : new GraphQLObjectType ( {
@@ -165,13 +188,11 @@ async function subscribeWithBadFn(
165
188
} ) ,
166
189
} ) ;
167
190
const document = parse ( 'subscription { foo }' ) ;
168
- const result = await subscribe ( { schema, document } ) ;
169
191
170
- assert ( ! isAsyncIterable ( result ) ) ;
171
- expectJSON ( await createSourceEventStream ( schema , document ) ) . toDeepEqual (
172
- result ,
192
+ return expectEqualPromisesOrValues (
193
+ subscribe ( { schema, document } ) ,
194
+ createSourceEventStream ( schema , document ) ,
173
195
) ;
174
- return result ;
175
196
}
176
197
177
198
/* eslint-disable @typescript-eslint/require-await */
@@ -193,7 +214,7 @@ describe('Subscription Initialization Phase', () => {
193
214
yield { foo : 'FooValue' } ;
194
215
}
195
216
196
- const subscription = await subscribe ( {
217
+ const subscription = subscribe ( {
197
218
schema,
198
219
document : parse ( 'subscription { foo }' ) ,
199
220
rootValue : { foo : fooGenerator } ,
@@ -229,7 +250,7 @@ describe('Subscription Initialization Phase', () => {
229
250
} ) ,
230
251
} ) ;
231
252
232
- const subscription = await subscribe ( {
253
+ const subscription = subscribe ( {
233
254
schema,
234
255
document : parse ( 'subscription { foo }' ) ,
235
256
} ) ;
@@ -267,10 +288,13 @@ describe('Subscription Initialization Phase', () => {
267
288
} ) ,
268
289
} ) ;
269
290
270
- const subscription = await subscribe ( {
291
+ const promise = subscribe ( {
271
292
schema,
272
293
document : parse ( 'subscription { foo }' ) ,
273
294
} ) ;
295
+ assert ( isPromise ( promise ) ) ;
296
+
297
+ const subscription = await promise ;
274
298
assert ( isAsyncIterable ( subscription ) ) ;
275
299
276
300
expect ( await subscription . next ( ) ) . to . deep . equal ( {
@@ -299,7 +323,7 @@ describe('Subscription Initialization Phase', () => {
299
323
yield { foo : 'FooValue' } ;
300
324
}
301
325
302
- const subscription = await subscribe ( {
326
+ const subscription = subscribe ( {
303
327
schema,
304
328
document : parse ( 'subscription { foo }' ) ,
305
329
rootValue : { customFoo : fooGenerator } ,
@@ -349,7 +373,7 @@ describe('Subscription Initialization Phase', () => {
349
373
} ) ,
350
374
} ) ;
351
375
352
- const subscription = await subscribe ( {
376
+ const subscription = subscribe ( {
353
377
schema,
354
378
document : parse ( 'subscription { foo bar }' ) ,
355
379
} ) ;
@@ -379,31 +403,29 @@ describe('Subscription Initialization Phase', () => {
379
403
} ) ;
380
404
381
405
// @ts -expect-error (schema must not be null)
382
- ( await expectPromise ( subscribe ( { schema : null , document } ) ) ) . toRejectWith (
406
+ expect ( ( ) => subscribe ( { schema : null , document } ) ) . to . throw (
383
407
'Expected null to be a GraphQL schema.' ,
384
408
) ;
385
409
386
410
// @ts -expect-error
387
- ( await expectPromise ( subscribe ( { document } ) ) ) . toRejectWith (
411
+ expect ( ( ) => subscribe ( { document } ) ) . to . throw (
388
412
'Expected undefined to be a GraphQL schema.' ,
389
413
) ;
390
414
391
415
// @ts -expect-error (document must not be null)
392
- ( await expectPromise ( subscribe ( { schema, document : null } ) ) ) . toRejectWith (
416
+ expect ( ( ) => subscribe ( { schema, document : null } ) ) . to . throw (
393
417
'Must provide document.' ,
394
418
) ;
395
419
396
420
// @ts -expect-error
397
- ( await expectPromise ( subscribe ( { schema } ) ) ) . toRejectWith (
398
- 'Must provide document.' ,
399
- ) ;
421
+ expect ( ( ) => subscribe ( { schema } ) ) . to . throw ( 'Must provide document.' ) ;
400
422
} ) ;
401
423
402
424
it ( 'resolves to an error if schema does not support subscriptions' , async ( ) => {
403
425
const schema = new GraphQLSchema ( { query : DummyQueryType } ) ;
404
426
const document = parse ( 'subscription { unknownField }' ) ;
405
427
406
- const result = await subscribe ( { schema, document } ) ;
428
+ const result = subscribe ( { schema, document } ) ;
407
429
expectJSON ( result ) . toDeepEqual ( {
408
430
errors : [
409
431
{
@@ -427,7 +449,7 @@ describe('Subscription Initialization Phase', () => {
427
449
} ) ;
428
450
const document = parse ( 'subscription { unknownField }' ) ;
429
451
430
- const result = await subscribe ( { schema, document } ) ;
452
+ const result = subscribe ( { schema, document } ) ;
431
453
expectJSON ( result ) . toDeepEqual ( {
432
454
errors : [
433
455
{
@@ -450,11 +472,11 @@ describe('Subscription Initialization Phase', () => {
450
472
} ) ;
451
473
452
474
// @ts -expect-error
453
- ( await expectPromise ( subscribe ( { schema, document : { } } ) ) ) . toReject ( ) ;
475
+ expect ( ( ) => subscribe ( { schema, document : { } } ) ) . to . throw ( ) ;
454
476
} ) ;
455
477
456
478
it ( 'throws an error if subscribe does not return an iterator' , async ( ) => {
457
- expectJSON ( await subscribeWithBadFn ( ( ) => 'test' ) ) . toDeepEqual ( {
479
+ const expectedResult = {
458
480
errors : [
459
481
{
460
482
message :
@@ -463,7 +485,15 @@ describe('Subscription Initialization Phase', () => {
463
485
path : [ 'foo' ] ,
464
486
} ,
465
487
] ,
466
- } ) ;
488
+ } ;
489
+
490
+ expectJSON ( subscribeWithBadFn ( ( ) => 'test' ) ) . toDeepEqual ( expectedResult ) ;
491
+
492
+ expectJSON (
493
+ await expectPromise (
494
+ subscribeWithBadFn ( ( ) => Promise . resolve ( 'test' ) ) ,
495
+ ) . toResolve ( ) ,
496
+ ) . toDeepEqual ( expectedResult ) ;
467
497
} ) ;
468
498
469
499
it ( 'resolves to an error for subscription resolver errors' , async ( ) => {
@@ -479,24 +509,28 @@ describe('Subscription Initialization Phase', () => {
479
509
480
510
expectJSON (
481
511
// Returning an error
482
- await subscribeWithBadFn ( ( ) => new Error ( 'test error' ) ) ,
512
+ subscribeWithBadFn ( ( ) => new Error ( 'test error' ) ) ,
483
513
) . toDeepEqual ( expectedResult ) ;
484
514
485
515
expectJSON (
486
516
// Throwing an error
487
- await subscribeWithBadFn ( ( ) => {
517
+ subscribeWithBadFn ( ( ) => {
488
518
throw new Error ( 'test error' ) ;
489
519
} ) ,
490
520
) . toDeepEqual ( expectedResult ) ;
491
521
492
522
expectJSON (
493
523
// Resolving to an error
494
- await subscribeWithBadFn ( ( ) => Promise . resolve ( new Error ( 'test error' ) ) ) ,
524
+ await expectPromise (
525
+ subscribeWithBadFn ( ( ) => Promise . resolve ( new Error ( 'test error' ) ) ) ,
526
+ ) . toResolve ( ) ,
495
527
) . toDeepEqual ( expectedResult ) ;
496
528
497
529
expectJSON (
498
530
// Rejecting with an error
499
- await subscribeWithBadFn ( ( ) => Promise . reject ( new Error ( 'test error' ) ) ) ,
531
+ await expectPromise (
532
+ subscribeWithBadFn ( ( ) => Promise . reject ( new Error ( 'test error' ) ) ) ,
533
+ ) . toResolve ( ) ,
500
534
) . toDeepEqual ( expectedResult ) ;
501
535
} ) ;
502
536
@@ -523,7 +557,7 @@ describe('Subscription Initialization Phase', () => {
523
557
524
558
// If we receive variables that cannot be coerced correctly, subscribe() will
525
559
// resolve to an ExecutionResult that contains an informative error description.
526
- const result = await subscribe ( { schema, document, variableValues } ) ;
560
+ const result = subscribe ( { schema, document, variableValues } ) ;
527
561
expectJSON ( result ) . toDeepEqual ( {
528
562
errors : [
529
563
{
@@ -541,10 +575,10 @@ describe('Subscription Publish Phase', () => {
541
575
it ( 'produces a payload for multiple subscribe in same subscription' , async ( ) => {
542
576
const pubsub = new SimplePubSub < Email > ( ) ;
543
577
544
- const subscription = await createSubscription ( pubsub ) ;
578
+ const subscription = createSubscription ( pubsub ) ;
545
579
assert ( isAsyncIterable ( subscription ) ) ;
546
580
547
- const secondSubscription = await createSubscription ( pubsub ) ;
581
+ const secondSubscription = createSubscription ( pubsub ) ;
548
582
assert ( isAsyncIterable ( secondSubscription ) ) ;
549
583
550
584
const payload1 = subscription . next ( ) ;
@@ -583,7 +617,7 @@ describe('Subscription Publish Phase', () => {
583
617
584
618
it ( 'produces a payload per subscription event' , async ( ) => {
585
619
const pubsub = new SimplePubSub < Email > ( ) ;
586
- const subscription = await createSubscription ( pubsub ) ;
620
+ const subscription = createSubscription ( pubsub ) ;
587
621
assert ( isAsyncIterable ( subscription ) ) ;
588
622
589
623
// Wait for the next subscription payload.
@@ -672,7 +706,7 @@ describe('Subscription Publish Phase', () => {
672
706
673
707
it ( 'produces a payload when there are multiple events' , async ( ) => {
674
708
const pubsub = new SimplePubSub < Email > ( ) ;
675
- const subscription = await createSubscription ( pubsub ) ;
709
+ const subscription = createSubscription ( pubsub ) ;
676
710
assert ( isAsyncIterable ( subscription ) ) ;
677
711
678
712
let payload = subscription . next ( ) ;
@@ -738,7 +772,7 @@ describe('Subscription Publish Phase', () => {
738
772
739
773
it ( 'should not trigger when subscription is already done' , async ( ) => {
740
774
const pubsub = new SimplePubSub < Email > ( ) ;
741
- const subscription = await createSubscription ( pubsub ) ;
775
+ const subscription = createSubscription ( pubsub ) ;
742
776
assert ( isAsyncIterable ( subscription ) ) ;
743
777
744
778
let payload = subscription . next ( ) ;
@@ -792,7 +826,7 @@ describe('Subscription Publish Phase', () => {
792
826
793
827
it ( 'should not trigger when subscription is thrown' , async ( ) => {
794
828
const pubsub = new SimplePubSub < Email > ( ) ;
795
- const subscription = await createSubscription ( pubsub ) ;
829
+ const subscription = createSubscription ( pubsub ) ;
796
830
assert ( isAsyncIterable ( subscription ) ) ;
797
831
798
832
let payload = subscription . next ( ) ;
@@ -845,7 +879,7 @@ describe('Subscription Publish Phase', () => {
845
879
846
880
it ( 'event order is correct for multiple publishes' , async ( ) => {
847
881
const pubsub = new SimplePubSub < Email > ( ) ;
848
- const subscription = await createSubscription ( pubsub ) ;
882
+ const subscription = createSubscription ( pubsub ) ;
849
883
assert ( isAsyncIterable ( subscription ) ) ;
850
884
851
885
let payload = subscription . next ( ) ;
@@ -936,7 +970,7 @@ describe('Subscription Publish Phase', () => {
936
970
} ) ;
937
971
938
972
const document = parse ( 'subscription { newMessage }' ) ;
939
- const subscription = await subscribe ( { schema, document } ) ;
973
+ const subscription = subscribe ( { schema, document } ) ;
940
974
assert ( isAsyncIterable ( subscription ) ) ;
941
975
942
976
expect ( await subscription . next ( ) ) . to . deep . equal ( {
@@ -997,7 +1031,7 @@ describe('Subscription Publish Phase', () => {
997
1031
} ) ;
998
1032
999
1033
const document = parse ( 'subscription { newMessage }' ) ;
1000
- const subscription = await subscribe ( { schema, document } ) ;
1034
+ const subscription = subscribe ( { schema, document } ) ;
1001
1035
assert ( isAsyncIterable ( subscription ) ) ;
1002
1036
1003
1037
expect ( await subscription . next ( ) ) . to . deep . equal ( {
@@ -1007,7 +1041,7 @@ describe('Subscription Publish Phase', () => {
1007
1041
} ,
1008
1042
} ) ;
1009
1043
1010
- ( await expectPromise ( subscription . next ( ) ) ) . toRejectWith ( 'test error' ) ;
1044
+ await expectPromise ( subscription . next ( ) ) . toRejectWith ( 'test error' ) ;
1011
1045
1012
1046
expect ( await subscription . next ( ) ) . to . deep . equal ( {
1013
1047
done : true ,
0 commit comments