Skip to content

Commit c9c11cf

Browse files
committed
add tests
1 parent 0f40a2e commit c9c11cf

File tree

7 files changed

+562
-7
lines changed

7 files changed

+562
-7
lines changed
Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
import { expect } from 'chai';
2+
import { describe, it } from 'mocha';
3+
4+
import { invariant } from '../../jsutils/invariant.js';
5+
6+
import { parse } from '../../language/parser.js';
7+
8+
import { GraphQLObjectType } from '../../type/definition.js';
9+
import { GraphQLString } from '../../type/scalars.js';
10+
import { GraphQLSchema } from '../../type/schema.js';
11+
12+
import { validateExecutionArgs } from '../../execution/execute.js';
13+
14+
import { buildTransformationContext } from '../buildTransformationContext.js';
15+
16+
const schema = new GraphQLSchema({
17+
query: new GraphQLObjectType({
18+
name: 'Query',
19+
fields: { someField: { type: GraphQLString } },
20+
}),
21+
});
22+
23+
describe('buildTransformationContext', () => {
24+
it('should build a transformation context', () => {
25+
const validatedExecutionArgs = validateExecutionArgs({
26+
schema,
27+
document: parse('{ someField }'),
28+
});
29+
30+
invariant('schema' in validatedExecutionArgs);
31+
32+
const context = buildTransformationContext(
33+
validatedExecutionArgs,
34+
'__prefix__',
35+
);
36+
37+
expect(context.deferUsageMap instanceof Map).to.equal(true);
38+
expect(context.streamUsageMap instanceof Map).to.equal(true);
39+
expect(context.prefix).to.equal('__prefix__');
40+
expect(context.pendingLabelsByPath instanceof Map).to.equal(true);
41+
expect(context.pendingResultsById instanceof Map).to.equal(true);
42+
expect(context.mergedResult).to.deep.equal({});
43+
});
44+
45+
it('should handle non-standard directives', () => {
46+
const validatedExecutionArgs = validateExecutionArgs({
47+
schema,
48+
document: parse('{ ... @someDirective { someField } }'),
49+
});
50+
51+
invariant('schema' in validatedExecutionArgs);
52+
53+
expect(() =>
54+
buildTransformationContext(validatedExecutionArgs, '__prefix__'),
55+
).not.to.throw();
56+
});
57+
});
Lines changed: 278 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,278 @@
1+
import { expect } from 'chai';
2+
import { describe, it } from 'mocha';
3+
4+
import { invariant } from '../../jsutils/invariant.js';
5+
6+
import { Kind } from '../../language/kinds.js';
7+
import { parse } from '../../language/parser.js';
8+
9+
import {
10+
GraphQLInterfaceType,
11+
GraphQLObjectType,
12+
} from '../../type/definition.js';
13+
import { GraphQLString } from '../../type/scalars.js';
14+
import { GraphQLSchema } from '../../type/schema.js';
15+
16+
import { validateExecutionArgs } from '../../execution/execute.js';
17+
18+
import { collectFields, collectSubfields } from '../collectFields.js';
19+
20+
describe('collectFields', () => {
21+
const someParentInterface = new GraphQLInterfaceType({
22+
name: 'SomeParentInterface',
23+
fields: { someField: { type: GraphQLString } },
24+
});
25+
const someChildInterface = new GraphQLInterfaceType({
26+
name: 'SomeChildInterface',
27+
interfaces: [someParentInterface],
28+
fields: { someField: { type: GraphQLString } },
29+
});
30+
const someObjectType = new GraphQLObjectType({
31+
name: 'SomeObjectType',
32+
interfaces: [someChildInterface, someParentInterface],
33+
fields: { someField: { type: GraphQLString } },
34+
});
35+
const query = new GraphQLObjectType({
36+
name: 'Query',
37+
fields: {
38+
someField: { type: GraphQLString },
39+
anotherField: { type: someParentInterface },
40+
},
41+
});
42+
const schema = new GraphQLSchema({
43+
query,
44+
types: [someObjectType],
45+
});
46+
47+
it('collects fields from a selection set', () => {
48+
const document = parse('{ someField }');
49+
50+
const validatedExecutionArgs = validateExecutionArgs({
51+
schema,
52+
document,
53+
});
54+
55+
invariant('schema' in validatedExecutionArgs);
56+
57+
const { groupedFieldSet } = collectFields(
58+
validatedExecutionArgs,
59+
query,
60+
validatedExecutionArgs.operation.selectionSet,
61+
);
62+
63+
expect(groupedFieldSet.get('someField')).to.deep.equal([
64+
{
65+
node: validatedExecutionArgs.operation.selectionSet.selections[0],
66+
fragmentVariableValues: undefined,
67+
},
68+
]);
69+
});
70+
71+
it('collects fields, skipping a field', () => {
72+
const document = parse('{ someField @skip(if: true) }');
73+
74+
const validatedExecutionArgs = validateExecutionArgs({
75+
schema,
76+
document,
77+
});
78+
79+
invariant('schema' in validatedExecutionArgs);
80+
81+
const { groupedFieldSet } = collectFields(
82+
validatedExecutionArgs,
83+
query,
84+
validatedExecutionArgs.operation.selectionSet,
85+
);
86+
87+
expect(groupedFieldSet.size).to.equal(0);
88+
});
89+
90+
it('collects fields, not including a field', () => {
91+
const document = parse('{ someField @include(if: false) }');
92+
93+
const validatedExecutionArgs = validateExecutionArgs({
94+
schema,
95+
document,
96+
});
97+
98+
invariant('schema' in validatedExecutionArgs);
99+
100+
const { groupedFieldSet } = collectFields(
101+
validatedExecutionArgs,
102+
query,
103+
validatedExecutionArgs.operation.selectionSet,
104+
);
105+
106+
expect(groupedFieldSet.size).to.equal(0);
107+
});
108+
109+
it('collects fields from a selection with an inline fragment', () => {
110+
const document = parse('{ ... { someField } }');
111+
112+
const validatedExecutionArgs = validateExecutionArgs({
113+
schema,
114+
document,
115+
});
116+
117+
invariant('schema' in validatedExecutionArgs);
118+
119+
const inlineFragment =
120+
validatedExecutionArgs.operation.selectionSet.selections[0];
121+
122+
invariant(inlineFragment.kind === Kind.INLINE_FRAGMENT);
123+
124+
const { groupedFieldSet } = collectFields(
125+
validatedExecutionArgs,
126+
query,
127+
validatedExecutionArgs.operation.selectionSet,
128+
);
129+
130+
expect(groupedFieldSet.get('someField')).to.deep.equal([
131+
{
132+
node: inlineFragment.selectionSet.selections[0],
133+
fragmentVariableValues: undefined,
134+
},
135+
]);
136+
});
137+
138+
it('collects fields from a selection with a named fragment with a non-matching conditional type', () => {
139+
const document = parse(`
140+
query { ...SomeFragment }
141+
fragment SomeFragment on SomeObject { someField }
142+
`);
143+
144+
const validatedExecutionArgs = validateExecutionArgs({
145+
schema,
146+
document,
147+
});
148+
149+
invariant('schema' in validatedExecutionArgs);
150+
151+
const { groupedFieldSet } = collectFields(
152+
validatedExecutionArgs,
153+
query,
154+
validatedExecutionArgs.operation.selectionSet,
155+
);
156+
157+
expect(groupedFieldSet.size).to.equal(0);
158+
});
159+
160+
it('collects fields from a selection with an inline fragment with a conditional type', () => {
161+
const document = parse('{ ... on Query { someField } }');
162+
163+
const validatedExecutionArgs = validateExecutionArgs({
164+
schema,
165+
document,
166+
});
167+
168+
invariant('schema' in validatedExecutionArgs);
169+
170+
const inlineFragment =
171+
validatedExecutionArgs.operation.selectionSet.selections[0];
172+
173+
invariant(inlineFragment.kind === Kind.INLINE_FRAGMENT);
174+
175+
const { groupedFieldSet } = collectFields(
176+
validatedExecutionArgs,
177+
query,
178+
validatedExecutionArgs.operation.selectionSet,
179+
);
180+
181+
expect(groupedFieldSet.get('someField')).to.deep.equal([
182+
{
183+
node: inlineFragment.selectionSet.selections[0],
184+
fragmentVariableValues: undefined,
185+
},
186+
]);
187+
});
188+
189+
it('collects fields from a selection with an inline fragment with a conditional abstract subtype', () => {
190+
const document = parse(
191+
'{ anotherField { ... on SomeChildInterface { someField } } }',
192+
);
193+
194+
const validatedExecutionArgs = validateExecutionArgs({
195+
schema,
196+
document,
197+
});
198+
199+
invariant('schema' in validatedExecutionArgs);
200+
201+
const { groupedFieldSet } = collectFields(
202+
validatedExecutionArgs,
203+
query,
204+
validatedExecutionArgs.operation.selectionSet,
205+
);
206+
207+
const fieldDetailsList = groupedFieldSet.get('anotherField');
208+
209+
invariant(fieldDetailsList != null);
210+
211+
const { groupedFieldSet: nestedGroupedFieldSet } = collectSubfields(
212+
validatedExecutionArgs,
213+
someObjectType,
214+
fieldDetailsList,
215+
);
216+
217+
const field = validatedExecutionArgs.operation.selectionSet.selections[0];
218+
219+
invariant(field.kind === Kind.FIELD);
220+
221+
const inlineFragment = field.selectionSet?.selections[0];
222+
223+
invariant(inlineFragment?.kind === Kind.INLINE_FRAGMENT);
224+
225+
expect(nestedGroupedFieldSet.get('someField')).to.deep.equal([
226+
{
227+
node: inlineFragment.selectionSet.selections[0],
228+
fragmentVariableValues: undefined,
229+
},
230+
]);
231+
});
232+
233+
it('collects fields from a selection with an inline fragment with a non-matching conditional subtype', () => {
234+
const document = parse('{ ... on SomeObject { someField } }');
235+
236+
const validatedExecutionArgs = validateExecutionArgs({
237+
schema,
238+
document,
239+
});
240+
241+
invariant('schema' in validatedExecutionArgs);
242+
243+
const { groupedFieldSet } = collectFields(
244+
validatedExecutionArgs,
245+
query,
246+
validatedExecutionArgs.operation.selectionSet,
247+
);
248+
249+
expect(groupedFieldSet.size).to.equal(0);
250+
});
251+
252+
it('collects fields, using fragment variables', () => {
253+
const document = parse(
254+
`
255+
query { ...SomeFragment(skip: false) }
256+
fragment SomeFragment($skip: Boolean ) on Query { someField @skip(if: $skip) }
257+
`,
258+
{
259+
experimentalFragmentArguments: true,
260+
},
261+
);
262+
263+
const validatedExecutionArgs = validateExecutionArgs({
264+
schema,
265+
document,
266+
});
267+
268+
invariant('schema' in validatedExecutionArgs);
269+
270+
const { groupedFieldSet } = collectFields(
271+
validatedExecutionArgs,
272+
query,
273+
validatedExecutionArgs.operation.selectionSet,
274+
);
275+
276+
expect(groupedFieldSet.size).to.equal(1);
277+
});
278+
});

0 commit comments

Comments
 (0)