1
|
|
|
<?php |
2
|
|
|
|
3
|
|
|
declare(strict_types=1); |
4
|
|
|
|
5
|
|
|
namespace GraphQL\Tests\Validator; |
6
|
|
|
|
7
|
|
|
use GraphQL\Error\FormattedError; |
8
|
|
|
use GraphQL\Language\SourceLocation; |
9
|
|
|
use GraphQL\Validator\Rules\ProvidedRequiredArguments; |
10
|
|
|
|
11
|
|
|
class ProvidedRequiredArgumentsTest extends ValidatorTestCase |
12
|
|
|
{ |
13
|
|
|
// Validate: Provided required arguments |
14
|
|
|
/** |
15
|
|
|
* @see it('ignores unknown arguments') |
16
|
|
|
*/ |
17
|
|
|
public function testIgnoresUnknownArguments() : void |
18
|
|
|
{ |
19
|
|
|
// ignores unknown arguments |
20
|
|
|
$this->expectPassesRule( |
21
|
|
|
new ProvidedRequiredArguments(), |
22
|
|
|
' |
23
|
|
|
{ |
24
|
|
|
dog { |
25
|
|
|
isHousetrained(unknownArgument: true) |
26
|
|
|
} |
27
|
|
|
} |
28
|
|
|
' |
29
|
|
|
); |
30
|
|
|
} |
31
|
|
|
|
32
|
|
|
// Valid non-nullable value: |
33
|
|
|
|
34
|
|
|
/** |
35
|
|
|
* @see it('Arg on optional arg') |
36
|
|
|
*/ |
37
|
|
|
public function testArgOnOptionalArg() : void |
38
|
|
|
{ |
39
|
|
|
$this->expectPassesRule( |
40
|
|
|
new ProvidedRequiredArguments(), |
41
|
|
|
' |
42
|
|
|
{ |
43
|
|
|
dog { |
44
|
|
|
isHousetrained(atOtherHomes: true) |
45
|
|
|
} |
46
|
|
|
} |
47
|
|
|
' |
48
|
|
|
); |
49
|
|
|
} |
50
|
|
|
|
51
|
|
|
/** |
52
|
|
|
* @see it('No Arg on optional arg') |
53
|
|
|
*/ |
54
|
|
|
public function testNoArgOnOptionalArg() : void |
55
|
|
|
{ |
56
|
|
|
$this->expectPassesRule( |
57
|
|
|
new ProvidedRequiredArguments(), |
58
|
|
|
' |
59
|
|
|
{ |
60
|
|
|
dog { |
61
|
|
|
isHousetrained |
62
|
|
|
} |
63
|
|
|
} |
64
|
|
|
' |
65
|
|
|
); |
66
|
|
|
} |
67
|
|
|
|
68
|
|
|
/** |
69
|
|
|
* @see it('No arg on non-null field with default') |
70
|
|
|
*/ |
71
|
|
|
public function testNoArgOnNonNullFieldWithDefault() |
72
|
|
|
{ |
73
|
|
|
$this->expectPassesRule( |
74
|
|
|
new ProvidedRequiredArguments(), |
75
|
|
|
' |
76
|
|
|
{ |
77
|
|
|
complicatedArgs { |
78
|
|
|
nonNullFieldWithDefault |
79
|
|
|
} |
80
|
|
|
} |
81
|
|
|
' |
82
|
|
|
); |
83
|
|
|
} |
84
|
|
|
|
85
|
|
|
/** |
86
|
|
|
* @see it('Multiple args') |
87
|
|
|
*/ |
88
|
|
|
public function testMultipleArgs() : void |
89
|
|
|
{ |
90
|
|
|
$this->expectPassesRule( |
91
|
|
|
new ProvidedRequiredArguments(), |
92
|
|
|
' |
93
|
|
|
{ |
94
|
|
|
complicatedArgs { |
95
|
|
|
multipleReqs(req1: 1, req2: 2) |
96
|
|
|
} |
97
|
|
|
} |
98
|
|
|
' |
99
|
|
|
); |
100
|
|
|
} |
101
|
|
|
|
102
|
|
|
/** |
103
|
|
|
* @see it('Multiple args reverse order') |
104
|
|
|
*/ |
105
|
|
|
public function testMultipleArgsReverseOrder() : void |
106
|
|
|
{ |
107
|
|
|
$this->expectPassesRule( |
108
|
|
|
new ProvidedRequiredArguments(), |
109
|
|
|
' |
110
|
|
|
{ |
111
|
|
|
complicatedArgs { |
112
|
|
|
multipleReqs(req2: 2, req1: 1) |
113
|
|
|
} |
114
|
|
|
} |
115
|
|
|
' |
116
|
|
|
); |
117
|
|
|
} |
118
|
|
|
|
119
|
|
|
/** |
120
|
|
|
* @see it('No args on multiple optional') |
121
|
|
|
*/ |
122
|
|
|
public function testNoArgsOnMultipleOptional() : void |
123
|
|
|
{ |
124
|
|
|
$this->expectPassesRule( |
125
|
|
|
new ProvidedRequiredArguments(), |
126
|
|
|
' |
127
|
|
|
{ |
128
|
|
|
complicatedArgs { |
129
|
|
|
multipleOpts |
130
|
|
|
} |
131
|
|
|
} |
132
|
|
|
' |
133
|
|
|
); |
134
|
|
|
} |
135
|
|
|
|
136
|
|
|
/** |
137
|
|
|
* @see it('One arg on multiple optional') |
138
|
|
|
*/ |
139
|
|
|
public function testOneArgOnMultipleOptional() : void |
140
|
|
|
{ |
141
|
|
|
$this->expectPassesRule( |
142
|
|
|
new ProvidedRequiredArguments(), |
143
|
|
|
' |
144
|
|
|
{ |
145
|
|
|
complicatedArgs { |
146
|
|
|
multipleOpts(opt1: 1) |
147
|
|
|
} |
148
|
|
|
} |
149
|
|
|
' |
150
|
|
|
); |
151
|
|
|
} |
152
|
|
|
|
153
|
|
|
/** |
154
|
|
|
* @see it('Second arg on multiple optional') |
155
|
|
|
*/ |
156
|
|
|
public function testSecondArgOnMultipleOptional() : void |
157
|
|
|
{ |
158
|
|
|
$this->expectPassesRule( |
159
|
|
|
new ProvidedRequiredArguments(), |
160
|
|
|
' |
161
|
|
|
{ |
162
|
|
|
complicatedArgs { |
163
|
|
|
multipleOpts(opt2: 1) |
164
|
|
|
} |
165
|
|
|
} |
166
|
|
|
' |
167
|
|
|
); |
168
|
|
|
} |
169
|
|
|
|
170
|
|
|
/** |
171
|
|
|
* @see it('Multiple reqs on mixedList') |
172
|
|
|
*/ |
173
|
|
|
public function testMultipleReqsOnMixedList() : void |
174
|
|
|
{ |
175
|
|
|
$this->expectPassesRule( |
176
|
|
|
new ProvidedRequiredArguments(), |
177
|
|
|
' |
178
|
|
|
{ |
179
|
|
|
complicatedArgs { |
180
|
|
|
multipleOptAndReq(req1: 3, req2: 4) |
181
|
|
|
} |
182
|
|
|
} |
183
|
|
|
' |
184
|
|
|
); |
185
|
|
|
} |
186
|
|
|
|
187
|
|
|
/** |
188
|
|
|
* @see it('Multiple reqs and one opt on mixedList') |
189
|
|
|
*/ |
190
|
|
|
public function testMultipleReqsAndOneOptOnMixedList() : void |
191
|
|
|
{ |
192
|
|
|
$this->expectPassesRule( |
193
|
|
|
new ProvidedRequiredArguments(), |
194
|
|
|
' |
195
|
|
|
{ |
196
|
|
|
complicatedArgs { |
197
|
|
|
multipleOptAndReq(req1: 3, req2: 4, opt1: 5) |
198
|
|
|
} |
199
|
|
|
} |
200
|
|
|
' |
201
|
|
|
); |
202
|
|
|
} |
203
|
|
|
|
204
|
|
|
/** |
205
|
|
|
* @see it('All reqs and opts on mixedList') |
206
|
|
|
*/ |
207
|
|
|
public function testAllReqsAndOptsOnMixedList() : void |
208
|
|
|
{ |
209
|
|
|
$this->expectPassesRule( |
210
|
|
|
new ProvidedRequiredArguments(), |
211
|
|
|
' |
212
|
|
|
{ |
213
|
|
|
complicatedArgs { |
214
|
|
|
multipleOptAndReq(req1: 3, req2: 4, opt1: 5, opt2: 6) |
215
|
|
|
} |
216
|
|
|
} |
217
|
|
|
' |
218
|
|
|
); |
219
|
|
|
} |
220
|
|
|
|
221
|
|
|
// Invalid non-nullable value |
222
|
|
|
|
223
|
|
|
/** |
224
|
|
|
* @see it('Missing one non-nullable argument') |
225
|
|
|
*/ |
226
|
|
|
public function testMissingOneNonNullableArgument() : void |
227
|
|
|
{ |
228
|
|
|
$this->expectFailsRule( |
229
|
|
|
new ProvidedRequiredArguments(), |
230
|
|
|
' |
231
|
|
|
{ |
232
|
|
|
complicatedArgs { |
233
|
|
|
multipleReqs(req2: 2) |
234
|
|
|
} |
235
|
|
|
} |
236
|
|
|
', |
237
|
|
|
[$this->missingFieldArg('multipleReqs', 'req1', 'Int!', 4, 13)] |
238
|
|
|
); |
239
|
|
|
} |
240
|
|
|
|
241
|
|
|
private function missingFieldArg($fieldName, $argName, $typeName, $line, $column) |
242
|
|
|
{ |
243
|
|
|
return FormattedError::create( |
|
|
|
|
244
|
|
|
ProvidedRequiredArguments::missingFieldArgMessage($fieldName, $argName, $typeName), |
245
|
|
|
[new SourceLocation($line, $column)] |
246
|
|
|
); |
247
|
|
|
} |
248
|
|
|
|
249
|
|
|
/** |
250
|
|
|
* @see it('Missing multiple non-nullable arguments') |
251
|
|
|
*/ |
252
|
|
|
public function testMissingMultipleNonNullableArguments() : void |
253
|
|
|
{ |
254
|
|
|
$this->expectFailsRule( |
255
|
|
|
new ProvidedRequiredArguments(), |
256
|
|
|
' |
257
|
|
|
{ |
258
|
|
|
complicatedArgs { |
259
|
|
|
multipleReqs |
260
|
|
|
} |
261
|
|
|
} |
262
|
|
|
', |
263
|
|
|
[ |
264
|
|
|
$this->missingFieldArg('multipleReqs', 'req1', 'Int!', 4, 13), |
265
|
|
|
$this->missingFieldArg('multipleReqs', 'req2', 'Int!', 4, 13), |
266
|
|
|
] |
267
|
|
|
); |
268
|
|
|
} |
269
|
|
|
|
270
|
|
|
// Describe: Directive arguments |
271
|
|
|
|
272
|
|
|
/** |
273
|
|
|
* @see it('Incorrect value and missing argument') |
274
|
|
|
*/ |
275
|
|
|
public function testIncorrectValueAndMissingArgument() : void |
276
|
|
|
{ |
277
|
|
|
$this->expectFailsRule( |
278
|
|
|
new ProvidedRequiredArguments(), |
279
|
|
|
' |
280
|
|
|
{ |
281
|
|
|
complicatedArgs { |
282
|
|
|
multipleReqs(req1: "one") |
283
|
|
|
} |
284
|
|
|
} |
285
|
|
|
', |
286
|
|
|
[ |
287
|
|
|
$this->missingFieldArg('multipleReqs', 'req2', 'Int!', 4, 13), |
288
|
|
|
] |
289
|
|
|
); |
290
|
|
|
} |
291
|
|
|
|
292
|
|
|
/** |
293
|
|
|
* @see it('ignores unknown directives') |
294
|
|
|
*/ |
295
|
|
|
public function testIgnoresUnknownDirectives() : void |
296
|
|
|
{ |
297
|
|
|
$this->expectPassesRule( |
298
|
|
|
new ProvidedRequiredArguments(), |
299
|
|
|
' |
300
|
|
|
{ |
301
|
|
|
dog @unknown |
302
|
|
|
} |
303
|
|
|
' |
304
|
|
|
); |
305
|
|
|
} |
306
|
|
|
|
307
|
|
|
/** |
308
|
|
|
* @see it('with directives of valid types') |
309
|
|
|
*/ |
310
|
|
|
public function testWithDirectivesOfValidTypes() : void |
311
|
|
|
{ |
312
|
|
|
$this->expectPassesRule( |
313
|
|
|
new ProvidedRequiredArguments(), |
314
|
|
|
' |
315
|
|
|
{ |
316
|
|
|
dog @include(if: true) { |
317
|
|
|
name |
318
|
|
|
} |
319
|
|
|
human @skip(if: false) { |
320
|
|
|
name |
321
|
|
|
} |
322
|
|
|
} |
323
|
|
|
' |
324
|
|
|
); |
325
|
|
|
} |
326
|
|
|
|
327
|
|
|
/** |
328
|
|
|
* @see it('with directive with missing types') |
329
|
|
|
*/ |
330
|
|
|
public function testWithDirectiveWithMissingTypes() : void |
331
|
|
|
{ |
332
|
|
|
$this->expectFailsRule( |
333
|
|
|
new ProvidedRequiredArguments(), |
334
|
|
|
' |
335
|
|
|
{ |
336
|
|
|
dog @include { |
337
|
|
|
name @skip |
338
|
|
|
} |
339
|
|
|
} |
340
|
|
|
', |
341
|
|
|
[ |
342
|
|
|
$this->missingDirectiveArg('include', 'if', 'Boolean!', 3, 15), |
343
|
|
|
$this->missingDirectiveArg('skip', 'if', 'Boolean!', 4, 18), |
344
|
|
|
] |
345
|
|
|
); |
346
|
|
|
} |
347
|
|
|
|
348
|
|
|
private function missingDirectiveArg($directiveName, $argName, $typeName, $line, $column) |
349
|
|
|
{ |
350
|
|
|
return FormattedError::create( |
|
|
|
|
351
|
|
|
ProvidedRequiredArguments::missingDirectiveArgMessage($directiveName, $argName, $typeName), |
352
|
|
|
[new SourceLocation($line, $column)] |
353
|
|
|
); |
354
|
|
|
} |
355
|
|
|
} |
356
|
|
|
|
This function has been deprecated. The supplier of the function has supplied an explanatory message.
The explanatory message should give you some clue as to whether and when the function will be removed and what other function to use instead.