schema_test.yml

  1object types:
  2  - name: simple
  3    input: |
  4      type Hello {
  5        world: String
  6      }
  7    ast: |
  8      <SchemaDocument>
  9        Definitions: [Definition]
 10        - <Definition>
 11            Kind: DefinitionKind("OBJECT")
 12            Name: "Hello"
 13            Fields: [FieldDefinition]
 14            - <FieldDefinition>
 15                Name: "world"
 16                Type: String
 17
 18  - name: with description
 19    input: |
 20      "Description"
 21      type Hello {
 22        world: String
 23      }
 24    ast: |
 25      <SchemaDocument>
 26        Definitions: [Definition]
 27        - <Definition>
 28            Kind: DefinitionKind("OBJECT")
 29            Description: "Description"
 30            Name: "Hello"
 31            Fields: [FieldDefinition]
 32            - <FieldDefinition>
 33                Name: "world"
 34                Type: String
 35
 36  - name: with block description
 37    input: |
 38      """
 39      Description
 40      """
 41      # Even with comments between them
 42      type Hello {
 43        world: String
 44      }
 45    ast: |
 46      <SchemaDocument>
 47        Definitions: [Definition]
 48        - <Definition>
 49            Kind: DefinitionKind("OBJECT")
 50            Description: "Description"
 51            Name: "Hello"
 52            Fields: [FieldDefinition]
 53            - <FieldDefinition>
 54                Name: "world"
 55                Type: String
 56  - name: with field arg
 57    input: |
 58      type Hello {
 59        world(flag: Boolean): String
 60      }
 61    ast: |
 62      <SchemaDocument>
 63        Definitions: [Definition]
 64        - <Definition>
 65            Kind: DefinitionKind("OBJECT")
 66            Name: "Hello"
 67            Fields: [FieldDefinition]
 68            - <FieldDefinition>
 69                Name: "world"
 70                Arguments: [ArgumentDefinition]
 71                - <ArgumentDefinition>
 72                    Name: "flag"
 73                    Type: Boolean
 74                Type: String
 75
 76  - name: with field arg and default value
 77    input: |
 78      type Hello {
 79        world(flag: Boolean = true): String
 80      }
 81    ast: |
 82      <SchemaDocument>
 83        Definitions: [Definition]
 84        - <Definition>
 85            Kind: DefinitionKind("OBJECT")
 86            Name: "Hello"
 87            Fields: [FieldDefinition]
 88            - <FieldDefinition>
 89                Name: "world"
 90                Arguments: [ArgumentDefinition]
 91                - <ArgumentDefinition>
 92                    Name: "flag"
 93                    DefaultValue: true
 94                    Type: Boolean
 95                Type: String
 96
 97  - name: with field list arg
 98    input: |
 99      type Hello {
100        world(things: [String]): String
101      }
102    ast: |
103      <SchemaDocument>
104        Definitions: [Definition]
105        - <Definition>
106            Kind: DefinitionKind("OBJECT")
107            Name: "Hello"
108            Fields: [FieldDefinition]
109            - <FieldDefinition>
110                Name: "world"
111                Arguments: [ArgumentDefinition]
112                - <ArgumentDefinition>
113                    Name: "things"
114                    Type: [String]
115                Type: String
116
117  - name: with two args
118    input: |
119      type Hello {
120        world(argOne: Boolean, argTwo: Int): String
121      }
122    ast: |
123      <SchemaDocument>
124        Definitions: [Definition]
125        - <Definition>
126            Kind: DefinitionKind("OBJECT")
127            Name: "Hello"
128            Fields: [FieldDefinition]
129            - <FieldDefinition>
130                Name: "world"
131                Arguments: [ArgumentDefinition]
132                - <ArgumentDefinition>
133                    Name: "argOne"
134                    Type: Boolean
135                - <ArgumentDefinition>
136                    Name: "argTwo"
137                    Type: Int
138                Type: String
139  - name: must define one or more fields
140    input: |
141      type Hello {}
142    error:
143      message: "expected at least one definition, found }"
144      locations: [{ line: 1, column: 13 }]
145
146type extensions:
147  - name: Object extension
148    input: |
149      extend type Hello {
150        world: String
151      }
152    ast: |
153      <SchemaDocument>
154        Extensions: [Definition]
155        - <Definition>
156            Kind: DefinitionKind("OBJECT")
157            Name: "Hello"
158            Fields: [FieldDefinition]
159            - <FieldDefinition>
160                Name: "world"
161                Type: String
162
163  - name: without any fields
164    input: "extend type Hello implements Greeting"
165    ast: |
166      <SchemaDocument>
167        Extensions: [Definition]
168        - <Definition>
169            Kind: DefinitionKind("OBJECT")
170            Name: "Hello"
171            Interfaces: [string]
172            - "Greeting"
173
174  - name: without fields twice
175    input: |
176      extend type Hello implements Greeting
177      extend type Hello implements SecondGreeting
178    ast: |
179      <SchemaDocument>
180        Extensions: [Definition]
181        - <Definition>
182            Kind: DefinitionKind("OBJECT")
183            Name: "Hello"
184            Interfaces: [string]
185            - "Greeting"
186        - <Definition>
187            Kind: DefinitionKind("OBJECT")
188            Name: "Hello"
189            Interfaces: [string]
190            - "SecondGreeting"
191
192  - name: without anything errors
193    input: "extend type Hello"
194    error:
195      message: "Unexpected <EOF>"
196      locations: [{ line: 1, column: 18 }]
197
198  - name: can have descriptions # hmm, this might not be spec compliant...
199    input: |
200      "Description"
201      extend type Hello {
202        world: String
203      }
204    error:
205      message: 'Unexpected String "Description"'
206      locations: [{ line: 1, column: 2 }]
207
208  - name: can not have descriptions on types
209    input: |
210      extend "Description" type Hello {
211        world: String
212      }
213    error:
214      message: Unexpected String "Description"
215      locations: [{ line: 1, column: 9 }]
216
217schema definition:
218  - name: simple
219    input: |
220      schema {
221        query: Query
222      }
223    ast: |
224      <SchemaDocument>
225        Schema: [SchemaDefinition]
226        - <SchemaDefinition>
227            OperationTypes: [OperationTypeDefinition]
228            - <OperationTypeDefinition>
229                Operation: Operation("query")
230                Type: "Query"
231
232schema extensions:
233  - name: simple
234    input: |
235       extend schema {
236         mutation: Mutation
237       }
238    ast: |
239      <SchemaDocument>
240        SchemaExtension: [SchemaDefinition]
241        - <SchemaDefinition>
242            OperationTypes: [OperationTypeDefinition]
243            - <OperationTypeDefinition>
244                Operation: Operation("mutation")
245                Type: "Mutation"
246
247  - name: directive only
248    input: "extend schema @directive"
249    ast: |
250      <SchemaDocument>
251        SchemaExtension: [SchemaDefinition]
252        - <SchemaDefinition>
253            Directives: [Directive]
254            - <Directive>
255                Name: "directive"
256
257  - name: without anything errors
258    input: "extend schema"
259    error:
260      message: "Unexpected <EOF>"
261      locations: [{ line: 1, column: 14}]
262
263type extensions:
264  - name: all can have directives
265    input: |
266      extend scalar Foo @deprecated
267      extend type Foo @deprecated
268      extend interface Foo @deprecated
269      extend union Foo @deprecated
270      extend enum Foo @deprecated
271      extend input Foo @deprecated
272    ast: |
273      <SchemaDocument>
274        Extensions: [Definition]
275        - <Definition>
276            Kind: DefinitionKind("SCALAR")
277            Name: "Foo"
278            Directives: [Directive]
279            - <Directive>
280                Name: "deprecated"
281        - <Definition>
282            Kind: DefinitionKind("OBJECT")
283            Name: "Foo"
284            Directives: [Directive]
285            - <Directive>
286                Name: "deprecated"
287        - <Definition>
288            Kind: DefinitionKind("INTERFACE")
289            Name: "Foo"
290            Directives: [Directive]
291            - <Directive>
292                Name: "deprecated"
293        - <Definition>
294            Kind: DefinitionKind("UNION")
295            Name: "Foo"
296            Directives: [Directive]
297            - <Directive>
298                Name: "deprecated"
299        - <Definition>
300            Kind: DefinitionKind("ENUM")
301            Name: "Foo"
302            Directives: [Directive]
303            - <Directive>
304                Name: "deprecated"
305        - <Definition>
306            Kind: DefinitionKind("INPUT_OBJECT")
307            Name: "Foo"
308            Directives: [Directive]
309            - <Directive>
310                Name: "deprecated"
311
312
313inheritance:
314  - name: single
315    input: "type Hello implements World { field: String }"
316    ast: |
317      <SchemaDocument>
318        Definitions: [Definition]
319        - <Definition>
320            Kind: DefinitionKind("OBJECT")
321            Name: "Hello"
322            Interfaces: [string]
323            - "World"
324            Fields: [FieldDefinition]
325            - <FieldDefinition>
326                Name: "field"
327                Type: String
328
329  - name: multi
330    input: "type Hello implements Wo & rld { field: String }"
331    ast: |
332      <SchemaDocument>
333        Definitions: [Definition]
334        - <Definition>
335            Kind: DefinitionKind("OBJECT")
336            Name: "Hello"
337            Interfaces: [string]
338            - "Wo"
339            - "rld"
340            Fields: [FieldDefinition]
341            - <FieldDefinition>
342                Name: "field"
343                Type: String
344
345  - name: multi with leading amp
346    input: "type Hello implements & Wo & rld { field: String }"
347    ast: |
348      <SchemaDocument>
349        Definitions: [Definition]
350        - <Definition>
351            Kind: DefinitionKind("OBJECT")
352            Name: "Hello"
353            Interfaces: [string]
354            - "Wo"
355            - "rld"
356            Fields: [FieldDefinition]
357            - <FieldDefinition>
358                Name: "field"
359                Type: String
360
361enums:
362  - name: single value
363    input: "enum Hello { WORLD }"
364    ast: |
365      <SchemaDocument>
366        Definitions: [Definition]
367        - <Definition>
368            Kind: DefinitionKind("ENUM")
369            Name: "Hello"
370            EnumValues: [EnumValueDefinition]
371            - <EnumValueDefinition>
372                Name: "WORLD"
373
374  - name: double value
375    input: "enum Hello { WO, RLD }"
376    ast: |
377      <SchemaDocument>
378        Definitions: [Definition]
379        - <Definition>
380            Kind: DefinitionKind("ENUM")
381            Name: "Hello"
382            EnumValues: [EnumValueDefinition]
383            - <EnumValueDefinition>
384                Name: "WO"
385            - <EnumValueDefinition>
386                Name: "RLD"
387  - name: must define one or more unique enum values
388    input: |
389      enum Hello {}
390    error:
391      message: "expected at least one definition, found }"
392      locations: [{ line: 1, column: 13 }]
393
394interface:
395  - name: simple
396    input: |
397      interface Hello {
398        world: String
399      }
400    ast: |
401      <SchemaDocument>
402        Definitions: [Definition]
403        - <Definition>
404            Kind: DefinitionKind("INTERFACE")
405            Name: "Hello"
406            Fields: [FieldDefinition]
407            - <FieldDefinition>
408                Name: "world"
409                Type: String
410  - name: must define one or more fields
411    input: |
412      interface Hello {}
413    error:
414      message: "expected at least one definition, found }"
415      locations: [{ line: 1, column: 18 }]
416
417unions:
418  - name: simple
419    input: "union Hello = World"
420    ast: |
421      <SchemaDocument>
422        Definitions: [Definition]
423        - <Definition>
424            Kind: DefinitionKind("UNION")
425            Name: "Hello"
426            Types: [string]
427            - "World"
428
429  - name: with two types
430    input: "union Hello = Wo | Rld"
431    ast: |
432      <SchemaDocument>
433        Definitions: [Definition]
434        - <Definition>
435            Kind: DefinitionKind("UNION")
436            Name: "Hello"
437            Types: [string]
438            - "Wo"
439            - "Rld"
440
441  - name: with leading pipe
442    input: "union Hello = | Wo | Rld"
443    ast: |
444      <SchemaDocument>
445        Definitions: [Definition]
446        - <Definition>
447            Kind: DefinitionKind("UNION")
448            Name: "Hello"
449            Types: [string]
450            - "Wo"
451            - "Rld"
452
453  - name: cant be empty
454    input: "union Hello = || Wo | Rld"
455    error:
456      message: "Expected Name, found |"
457      locations: [{ line: 1, column: 16 }]
458
459  - name: cant double pipe
460    input: "union Hello = Wo || Rld"
461    error:
462      message: "Expected Name, found |"
463      locations: [{ line: 1, column: 19 }]
464
465  - name: cant have trailing pipe
466    input: "union Hello = | Wo | Rld |"
467    error:
468      message: "Expected Name, found <EOF>"
469      locations: [{ line: 1, column: 27 }]
470
471scalar:
472  - name: simple
473    input: "scalar Hello"
474    ast: |
475      <SchemaDocument>
476        Definitions: [Definition]
477        - <Definition>
478            Kind: DefinitionKind("SCALAR")
479            Name: "Hello"
480
481input object:
482  - name: simple
483    input: |
484      input Hello {
485        world: String
486      }
487    ast: |
488      <SchemaDocument>
489        Definitions: [Definition]
490        - <Definition>
491            Kind: DefinitionKind("INPUT_OBJECT")
492            Name: "Hello"
493            Fields: [FieldDefinition]
494            - <FieldDefinition>
495                Name: "world"
496                Type: String
497
498  - name: can not have args
499    input: |
500      input Hello {
501        world(foo: Int): String
502      }
503    error:
504      message: "Expected :, found ("
505      locations: [{ line: 2, column: 8 }]
506  - name: must define one or more input fields
507    input: |
508      input Hello {}
509    error:
510      message: "expected at least one definition, found }"
511      locations: [{ line: 1, column: 14 }]
512
513directives:
514  - name: simple
515    input: directive @foo on FIELD
516    ast: |
517      <SchemaDocument>
518        Directives: [DirectiveDefinition]
519        - <DirectiveDefinition>
520            Name: "foo"
521            Locations: [DirectiveLocation]
522            - DirectiveLocation("FIELD")
523
524  - name: invalid location
525    input: "directive @foo on FIELD | INCORRECT_LOCATION"
526    error:
527      message: 'Unexpected Name "INCORRECT_LOCATION"'
528      locations: [{ line: 1, column: 27 }]
529
530fuzzer:
531  - name: 1
532    input: "type o{d(g:["
533    error:
534      message: 'Expected Name, found <EOF>'
535      locations: [{ line: 1, column: 13 }]
536  - name: 2
537    input: "\"\"\"\r"
538    error:
539      message: 'Unexpected <Invalid>'
540      locations: [{ line: 1, column: 5 }]