Skip to content

Commit a5e24f0

Browse files
committed
add additional test
1 parent 21b4965 commit a5e24f0

File tree

1 file changed

+120
-1
lines changed

1 file changed

+120
-1
lines changed

src/execution/__tests__/defer-test.ts

Lines changed: 120 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -858,7 +858,7 @@ describe('Execute: defer directive', () => {
858858
]);
859859
});
860860

861-
it('Initiates all deferred grouped field sets immediately if and only if they have been released as pending', async () => {
861+
it('Initiates deferred grouped field sets only if they have been released as pending', async () => {
862862
const document = parse(`
863863
query {
864864
... @defer {
@@ -986,6 +986,125 @@ describe('Execute: defer directive', () => {
986986
});
987987
});
988988

989+
it('Initiates all deferred grouped field sets immediately once they have been released as pending', async () => {
990+
const document = parse(`
991+
query {
992+
... @defer {
993+
a {
994+
... @defer {
995+
b {
996+
c { d }
997+
}
998+
}
999+
}
1000+
}
1001+
... @defer {
1002+
a {
1003+
... @defer {
1004+
b {
1005+
c { d }
1006+
e { f }
1007+
}
1008+
}
1009+
}
1010+
}
1011+
}
1012+
`);
1013+
1014+
const { promise: cPromise, resolve: resolveC } =
1015+
// eslint-disable-next-line @typescript-eslint/no-invalid-void-type
1016+
promiseWithResolvers<void>();
1017+
let cResolverCalled = false;
1018+
let eResolverCalled = false;
1019+
const executeResult = experimentalExecuteIncrementally({
1020+
schema,
1021+
document,
1022+
rootValue: {
1023+
a: {
1024+
b: {
1025+
c: async () => {
1026+
cResolverCalled = true;
1027+
await cPromise;
1028+
return { d: 'd' };
1029+
},
1030+
e: () => {
1031+
eResolverCalled = true;
1032+
return { f: 'f' };
1033+
},
1034+
},
1035+
},
1036+
},
1037+
enableEarlyExecution: false,
1038+
});
1039+
1040+
assert('initialResult' in executeResult);
1041+
1042+
const result1 = executeResult.initialResult;
1043+
expectJSON(result1).toDeepEqual({
1044+
data: {},
1045+
pending: [
1046+
{ id: '0', path: [] },
1047+
{ id: '1', path: [] },
1048+
],
1049+
hasNext: true,
1050+
});
1051+
1052+
const iterator = executeResult.subsequentResults[Symbol.asyncIterator]();
1053+
1054+
expect(cResolverCalled).to.equal(false);
1055+
expect(eResolverCalled).to.equal(false);
1056+
1057+
const result2 = await iterator.next();
1058+
expectJSON(result2).toDeepEqual({
1059+
value: {
1060+
pending: [
1061+
{ id: '2', path: ['a'] },
1062+
{ id: '3', path: ['a'] },
1063+
],
1064+
incremental: [
1065+
{
1066+
data: { a: {} },
1067+
id: '0',
1068+
},
1069+
],
1070+
completed: [{ id: '0' }, { id: '1' }],
1071+
hasNext: true,
1072+
},
1073+
done: false,
1074+
});
1075+
1076+
resolveC();
1077+
1078+
expect(cResolverCalled).to.equal(true);
1079+
expect(eResolverCalled).to.equal(true);
1080+
1081+
const result3 = await iterator.next();
1082+
expectJSON(result3).toDeepEqual({
1083+
value: {
1084+
incremental: [
1085+
{
1086+
data: { b: { c: { d: 'd' } } },
1087+
id: '2',
1088+
},
1089+
{
1090+
data: { e: { f: 'f' } },
1091+
id: '3',
1092+
subPath: ['b'],
1093+
},
1094+
],
1095+
completed: [{ id: '2' }, { id: '3' }],
1096+
hasNext: false,
1097+
},
1098+
done: false,
1099+
});
1100+
1101+
const result4 = await iterator.next();
1102+
expectJSON(result4).toDeepEqual({
1103+
value: undefined,
1104+
done: true,
1105+
});
1106+
});
1107+
9891108
it('Can deduplicate multiple defers on the same object', async () => {
9901109
const document = parse(`
9911110
query {

0 commit comments

Comments
 (0)