Skip to content

Commit eca9224

Browse files
committed
Add standalone.input.spec.ts to TDD
1 parent db05491 commit eca9224

File tree

1 file changed

+368
-0
lines changed

1 file changed

+368
-0
lines changed
Lines changed: 368 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,368 @@
1+
import { mergeOutputs } from '@graphql-codegen/plugin-helpers';
2+
import { validateTs } from '@graphql-codegen/testing';
3+
import { buildSchema, parse } from 'graphql';
4+
import { plugin } from '../src/index.js';
5+
6+
describe('TypeScript Operations Plugin - Input', () => {
7+
it('generates nested input correctly', async () => {
8+
const schema = buildSchema(/* GraphQL */ `
9+
type Query {
10+
users(input: UsersInput!): [User!]!
11+
}
12+
13+
type ResponseError {
14+
error: ResponseErrorType!
15+
}
16+
17+
enum ResponseErrorType {
18+
NOT_FOUND
19+
INPUT_VALIDATION_ERROR
20+
FORBIDDEN_ERROR
21+
UNEXPECTED_ERROR
22+
}
23+
24+
type User {
25+
id: ID!
26+
ageRange1: [Int]
27+
ageRange2: [Int]!
28+
ageRange3: [Int!]
29+
ageRange4: [Int!]!
30+
}
31+
32+
"UserRole Description"
33+
enum UserRole {
34+
"UserRole ADMIN"
35+
ADMIN
36+
"UserRole CUSTOMER"
37+
CUSTOMER
38+
}
39+
40+
"UsersInput Description"
41+
input UsersInput {
42+
"UsersInput from"
43+
from: DateTime
44+
"UsersInput to"
45+
to: DateTime
46+
timezone: TimeZone
47+
role: UserRole
48+
ageRange1: [Int]
49+
ageRange2: [Int]!
50+
ageRange3: [Int!]
51+
ageRange4: [Int!]!
52+
bestFriend: UsersBestFriendInput
53+
nestedInput: UsersInput
54+
}
55+
56+
input UsersBestFriendInput {
57+
name: String
58+
}
59+
60+
scalar DateTime
61+
scalar TimeZone
62+
`);
63+
const document = parse(/* GraphQL */ `
64+
query UsersWithScalarInput($inputNonNullable: UsersInput!, $inputNullable: UsersInput) {
65+
users(input: $inputNonNullable) {
66+
ageRange1
67+
ageRange2
68+
ageRange3
69+
ageRange4
70+
}
71+
}
72+
`);
73+
74+
const result = mergeOutputs([
75+
await plugin(
76+
schema,
77+
[{ document }],
78+
{
79+
scalars: {
80+
DateTime: 'Date',
81+
},
82+
},
83+
{ outputFile: '' }
84+
),
85+
]);
86+
87+
expect(result).toMatchInlineSnapshot(`
88+
"type Exact<T extends { [key: string]: unknown }> = { [K in keyof T]: T[K] };
89+
export type Incremental<T> = T | { [P in keyof T]?: P extends ' $fragmentName' | '__typename' ? T[P] : never };
90+
/** UserRole Description */
91+
export type UserRole =
92+
/** UserRole ADMIN */
93+
| 'ADMIN'
94+
/** UserRole CUSTOMER */
95+
| 'CUSTOMER';
96+
97+
/** UsersInput Description */
98+
type UsersInput = {
99+
/** UsersInput from */
100+
from?: Date | null | undefined;
101+
/** UsersInput to */
102+
to?: Date | null | undefined;
103+
timezone?: any;
104+
role?: UserRole | null | undefined;
105+
ageRange1?: Array<number | null | undefined> | null | undefined;
106+
ageRange2: Array<number | null | undefined>;
107+
ageRange3?: Array<number> | null | undefined;
108+
ageRange4: Array<number>;
109+
bestFriend?: UsersBestFriendInput | null | undefined;
110+
nestedInput?: UsersInput | null | undefined;
111+
};
112+
113+
type UsersBestFriendInput = {
114+
name?: string | null | undefined;
115+
};
116+
117+
export type UsersWithScalarInputQueryVariables = Exact<{
118+
inputNonNullable: UsersInput;
119+
inputNullable?: UsersInput | null;
120+
}>;
121+
122+
123+
export type UsersWithScalarInputQuery = { __typename?: 'Query', users: Array<{ __typename?: 'User', ageRange1: Array<number | null> | null, ageRange2: Array<number | null>, ageRange3: Array<number> | null, ageRange4: Array<number> }> };
124+
"
125+
`);
126+
127+
validateTs(result, undefined, undefined, undefined, undefined, true);
128+
});
129+
130+
it('generates readonly input when immutableTypes:true', async () => {
131+
const schema = buildSchema(/* GraphQL */ `
132+
type Query {
133+
users(input: UsersInput!): [User!]!
134+
}
135+
136+
type ResponseError {
137+
error: ResponseErrorType!
138+
}
139+
140+
enum ResponseErrorType {
141+
NOT_FOUND
142+
INPUT_VALIDATION_ERROR
143+
FORBIDDEN_ERROR
144+
UNEXPECTED_ERROR
145+
}
146+
147+
type User {
148+
id: ID!
149+
ageRange1: [Int]
150+
ageRange2: [Int]!
151+
ageRange3: [Int!]
152+
ageRange4: [Int!]!
153+
}
154+
155+
"UserRole Description"
156+
enum UserRole {
157+
"UserRole ADMIN"
158+
ADMIN
159+
"UserRole CUSTOMER"
160+
CUSTOMER
161+
}
162+
163+
"UsersInput Description"
164+
input UsersInput {
165+
"UsersInput from"
166+
from: DateTime
167+
"UsersInput to"
168+
to: DateTime
169+
timezone: TimeZone
170+
role: UserRole
171+
ageRange1: [Int]
172+
ageRange2: [Int]!
173+
ageRange3: [Int!]
174+
ageRange4: [Int!]!
175+
bestFriend: UsersBestFriendInput
176+
nestedInput: UsersInput
177+
}
178+
179+
input UsersBestFriendInput {
180+
name: String
181+
}
182+
183+
scalar DateTime
184+
scalar TimeZone
185+
`);
186+
const document = parse(/* GraphQL */ `
187+
query UsersWithScalarInput($inputNonNullable: UsersInput!, $inputNullable: UsersInput) {
188+
users(input: $inputNonNullable) {
189+
ageRange1
190+
ageRange2
191+
ageRange3
192+
ageRange4
193+
}
194+
}
195+
`);
196+
197+
const result = mergeOutputs([
198+
await plugin(
199+
schema,
200+
[{ document }],
201+
{
202+
scalars: {
203+
DateTime: 'Date',
204+
},
205+
immutableTypes: true,
206+
},
207+
{ outputFile: '' }
208+
),
209+
]);
210+
211+
expect(result).toMatchInlineSnapshot(`
212+
"type Exact<T extends { [key: string]: unknown }> = { [K in keyof T]: T[K] };
213+
export type Incremental<T> = T | { [P in keyof T]?: P extends ' $fragmentName' | '__typename' ? T[P] : never };
214+
/** UserRole Description */
215+
export type UserRole =
216+
/** UserRole ADMIN */
217+
| 'ADMIN'
218+
/** UserRole CUSTOMER */
219+
| 'CUSTOMER';
220+
221+
/** UsersInput Description */
222+
type UsersInput = {
223+
/** UsersInput from */
224+
readonly from?: Date | null | undefined;
225+
/** UsersInput to */
226+
readonly to?: Date | null | undefined;
227+
readonly timezone?: any;
228+
readonly role?: UserRole | null | undefined;
229+
readonly ageRange1?: Array<number | null | undefined> | null | undefined;
230+
readonly ageRange2: Array<number | null | undefined>;
231+
readonly ageRange3?: Array<number> | null | undefined;
232+
readonly ageRange4: Array<number>;
233+
readonly bestFriend?: UsersBestFriendInput | null | undefined;
234+
readonly nestedInput?: UsersInput | null | undefined;
235+
};
236+
237+
type UsersBestFriendInput = {
238+
readonly name?: string | null | undefined;
239+
};
240+
241+
export type UsersWithScalarInputQueryVariables = Exact<{
242+
inputNonNullable: UsersInput;
243+
inputNullable?: UsersInput | null;
244+
}>;
245+
246+
247+
export type UsersWithScalarInputQuery = { readonly __typename?: 'Query', readonly users: ReadonlyArray<{ readonly __typename?: 'User', readonly ageRange1: ReadonlyArray<number | null> | null, readonly ageRange2: ReadonlyArray<number | null>, readonly ageRange3: ReadonlyArray<number> | null, readonly ageRange4: ReadonlyArray<number> }> };
248+
"
249+
`);
250+
251+
validateTs(result, undefined, undefined, undefined, undefined, true);
252+
});
253+
254+
it('generates @oneOf input correctly', async () => {
255+
const schema = buildSchema(/* GraphQL */ `
256+
type Query {
257+
users(input: UsersInput!): [User!]!
258+
}
259+
260+
type ResponseError {
261+
error: ResponseErrorType!
262+
}
263+
264+
enum ResponseErrorType {
265+
NOT_FOUND
266+
INPUT_VALIDATION_ERROR
267+
FORBIDDEN_ERROR
268+
UNEXPECTED_ERROR
269+
}
270+
271+
type User {
272+
id: ID!
273+
ageRange1: [Int]
274+
ageRange2: [Int]!
275+
ageRange3: [Int!]
276+
ageRange4: [Int!]!
277+
}
278+
279+
"UserRole Description"
280+
enum UserRole {
281+
"UserRole ADMIN"
282+
ADMIN
283+
"UserRole CUSTOMER"
284+
CUSTOMER
285+
}
286+
287+
"UsersInput Description"
288+
input UsersInput @oneOf {
289+
"UsersInput from"
290+
from: DateTime
291+
"UsersInput to"
292+
to: DateTime
293+
timezone: TimeZone
294+
role: UserRole
295+
ageRange1: [Int]
296+
ageRange3: [Int!]
297+
bestFriend: UsersBestFriendInput
298+
nestedInput: UsersInput
299+
}
300+
301+
input UsersBestFriendInput {
302+
name: String
303+
}
304+
305+
scalar DateTime
306+
scalar TimeZone
307+
`);
308+
const document = parse(/* GraphQL */ `
309+
query Users($inputNonNullable: UsersInput!, $inputNullable: UsersInput) {
310+
users(input: $inputNonNullable) {
311+
__typename
312+
}
313+
}
314+
`);
315+
316+
const result = mergeOutputs([
317+
await plugin(
318+
schema,
319+
[{ document }],
320+
{
321+
scalars: {
322+
DateTime: 'Date',
323+
},
324+
},
325+
{ outputFile: '' }
326+
),
327+
]);
328+
329+
expect(result).toMatchInlineSnapshot(`
330+
"type Exact<T extends { [key: string]: unknown }> = { [K in keyof T]: T[K] };
331+
export type Incremental<T> = T | { [P in keyof T]?: P extends ' $fragmentName' | '__typename' ? T[P] : never };
332+
/** UserRole Description */
333+
export type UserRole =
334+
/** UserRole ADMIN */
335+
| 'ADMIN'
336+
/** UserRole CUSTOMER */
337+
| 'CUSTOMER';
338+
339+
/** UsersInput Description */
340+
export type UsersInput =
341+
{ /** UsersInput from */
342+
from?: Date | null | undefined; to?: never; timezone?: never; role?: never; ageRange1?: never; ageRange3?: never; bestFriend?: never; nestedInput?: never; }
343+
| { from?: never; /** UsersInput to */
344+
to?: Date | null | undefined; timezone?: never; role?: never; ageRange1?: never; ageRange3?: never; bestFriend?: never; nestedInput?: never; }
345+
| { from?: never; to?: never; timezone?: any; role?: never; ageRange1?: never; ageRange3?: never; bestFriend?: never; nestedInput?: never; }
346+
| { from?: never; to?: never; timezone?: never; role?: UserRole | null | undefined; ageRange1?: never; ageRange3?: never; bestFriend?: never; nestedInput?: never; }
347+
| { from?: never; to?: never; timezone?: never; role?: never; ageRange1?: Array<number | null | undefined> | null | undefined; ageRange3?: never; bestFriend?: never; nestedInput?: never; }
348+
| { from?: never; to?: never; timezone?: never; role?: never; ageRange1?: never; ageRange3?: Array<number> | null | undefined; bestFriend?: never; nestedInput?: never; }
349+
| { from?: never; to?: never; timezone?: never; role?: never; ageRange1?: never; ageRange3?: never; bestFriend?: UsersBestFriendInput | null | undefined; nestedInput?: never; }
350+
| { from?: never; to?: never; timezone?: never; role?: never; ageRange1?: never; ageRange3?: never; bestFriend?: never; nestedInput?: UsersInput | null | undefined; };
351+
352+
type UsersBestFriendInput = {
353+
name?: string | null | undefined;
354+
};
355+
356+
export type UsersQueryVariables = Exact<{
357+
inputNonNullable: UsersInput;
358+
inputNullable?: UsersInput | null;
359+
}>;
360+
361+
362+
export type UsersQuery = { __typename?: 'Query', users: Array<{ __typename: 'User' }> };
363+
"
364+
`);
365+
366+
validateTs(result, undefined, undefined, undefined, undefined, true);
367+
});
368+
});

0 commit comments

Comments
 (0)