Skip to content

Commit d592e79

Browse files
committed
fragment generation tests
1 parent 97b45d2 commit d592e79

13 files changed

+401
-5
lines changed

gql_build/lib/src/data_builder.dart

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import "dart:async";
33
import "package:build/build.dart";
44

55
import "package:gql_build/src/config.dart";
6+
import "package:gql_build/src/utils/add_introspection.dart";
67
import "package:gql_build/src/utils/reader.dart";
78
import "package:gql_build/src/utils/writer.dart";
89
import "package:gql_code_builder/data.dart";
@@ -26,7 +27,7 @@ class DataBuilder implements Builder {
2627

2728
final library = buildDataLibrary(
2829
doc,
29-
schema,
30+
addTypenames(schema),
3031
);
3132

3233
return writeDocument(
Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
import "package:gql/ast.dart";
2+
import "package:gql_code_builder/source.dart";
3+
4+
const typenameField = FieldDefinitionNode(
5+
name: NameNode(
6+
value: "__typename",
7+
),
8+
type: NamedTypeNode(
9+
name: NameNode(
10+
value: "String",
11+
),
12+
isNonNull: true,
13+
),
14+
);
15+
16+
class AddTypenameField extends TransformingVisitor {
17+
@override
18+
ObjectTypeDefinitionNode visitObjectTypeDefinitionNode(
19+
ObjectTypeDefinitionNode node,
20+
) =>
21+
ObjectTypeDefinitionNode(
22+
name: node.name,
23+
description: node.description,
24+
directives: node.directives,
25+
fields: [
26+
typenameField,
27+
...node.fields,
28+
],
29+
interfaces: node.interfaces,
30+
span: node.span,
31+
);
32+
33+
@override
34+
InterfaceTypeDefinitionNode visitInterfaceTypeDefinitionNode(
35+
InterfaceTypeDefinitionNode node,
36+
) =>
37+
InterfaceTypeDefinitionNode(
38+
name: node.name,
39+
fields: [
40+
typenameField,
41+
...node.fields,
42+
],
43+
directives: node.directives,
44+
description: node.description,
45+
span: node.span,
46+
);
47+
}
48+
49+
DocumentNode _transform(DocumentNode doc) => transform(
50+
doc,
51+
[
52+
AddTypenameField(),
53+
],
54+
);
55+
56+
SourceNode addTypenames(SourceNode source) => SourceNode(
57+
url: source.url,
58+
document: _transform(source.document),
59+
imports: source.imports.map(addTypenames).toSet(),
60+
);

gql_build/lib/src/var_builder.dart

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import "dart:async";
22

33
import "package:build/build.dart";
44
import "package:gql_build/src/config.dart";
5+
import "package:gql_build/src/utils/add_introspection.dart";
56
import "package:gql_build/src/utils/reader.dart";
67
import "package:gql_build/src/utils/writer.dart";
78
import "package:gql_code_builder/var.dart";
@@ -25,7 +26,7 @@ class VarBuilder implements Builder {
2526

2627
final library = buildVarLibrary(
2728
doc,
28-
schema,
29+
addTypenames(schema),
2930
);
3031

3132
return writeDocument(
Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
import 'package:gql/ast.dart' as _i1;
2+
3+
const Shape = _i1.OperationDefinitionNode(
4+
type: _i1.OperationType.query,
5+
name: _i1.NameNode(value: 'Shape'),
6+
variableDefinitions: [],
7+
directives: [],
8+
selectionSet: _i1.SelectionSetNode(selections: [
9+
_i1.FieldNode(
10+
name: _i1.NameNode(value: 'shape'),
11+
alias: null,
12+
arguments: [],
13+
directives: [],
14+
selectionSet: _i1.SelectionSetNode(selections: [
15+
_i1.FieldNode(
16+
name: _i1.NameNode(value: '__typename'),
17+
alias: null,
18+
arguments: [],
19+
directives: [],
20+
selectionSet: null),
21+
_i1.FieldNode(
22+
name: _i1.NameNode(value: 'area'),
23+
alias: null,
24+
arguments: [],
25+
directives: [],
26+
selectionSet: null),
27+
_i1.InlineFragmentNode(
28+
typeCondition: _i1.TypeConditionNode(
29+
on: _i1.NamedTypeNode(
30+
name: _i1.NameNode(value: 'Square'), isNonNull: false)),
31+
directives: [],
32+
selectionSet: _i1.SelectionSetNode(selections: [
33+
_i1.FieldNode(
34+
name: _i1.NameNode(value: 'sideLength'),
35+
alias: null,
36+
arguments: [],
37+
directives: [],
38+
selectionSet: null)
39+
])),
40+
_i1.InlineFragmentNode(
41+
typeCondition: _i1.TypeConditionNode(
42+
on: _i1.NamedTypeNode(
43+
name: _i1.NameNode(value: 'Rectangle'),
44+
isNonNull: false)),
45+
directives: [],
46+
selectionSet: _i1.SelectionSetNode(selections: [
47+
_i1.FieldNode(
48+
name: _i1.NameNode(value: 'sideLengthA'),
49+
alias: null,
50+
arguments: [],
51+
directives: [],
52+
selectionSet: null),
53+
_i1.FieldNode(
54+
name: _i1.NameNode(value: 'sideLengthB'),
55+
alias: null,
56+
arguments: [],
57+
directives: [],
58+
selectionSet: null)
59+
]))
60+
]))
61+
]));
62+
const document = _i1.DocumentNode(definitions: [Shape]);
Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
class $Shape {
2+
const $Shape(this.data);
3+
4+
final Map<String, dynamic> data;
5+
6+
$Shape$shape get shape => data['shape'] == null
7+
? null
8+
: $Shape$shape((data['shape'] as Map<String, dynamic>));
9+
}
10+
11+
class $Shape$shape {
12+
const $Shape$shape.fromData(this.data);
13+
14+
factory $Shape$shape(data) {
15+
switch (data['__typename']) {
16+
case "Square":
17+
return $Shape$shape$asSquare(data);
18+
case "Rectangle":
19+
return $Shape$shape$asRectangle(data);
20+
default:
21+
return $Shape$shape.fromData(data);
22+
}
23+
}
24+
25+
final Map<String, dynamic> data;
26+
27+
String get $__typename => (data['__typename'] as String);
28+
double get area => data['area']?.toDouble();
29+
}
30+
31+
class $Shape$shape$asSquare implements $Shape$shape {
32+
const $Shape$shape$asSquare(this.data);
33+
34+
final Map<String, dynamic> data;
35+
36+
String get $__typename => (data['__typename'] as String);
37+
double get area => data['area']?.toDouble();
38+
double get sideLength => data['sideLength']?.toDouble();
39+
}
40+
41+
class $Shape$shape$asRectangle implements $Shape$shape {
42+
const $Shape$shape$asRectangle(this.data);
43+
44+
final Map<String, dynamic> data;
45+
46+
String get $__typename => (data['__typename'] as String);
47+
double get area => data['area']?.toDouble();
48+
double get sideLengthA => data['sideLengthA']?.toDouble();
49+
double get sideLengthB => data['sideLengthB']?.toDouble();
50+
}
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
query Shape {
2+
shape {
3+
__typename
4+
area
5+
... on Square {
6+
sideLength
7+
}
8+
... on Rectangle {
9+
sideLengthA
10+
sideLengthB
11+
}
12+
}
13+
}
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
import 'package:gql_exec/gql_exec.dart' as _i1;
2+
import 'package:gql_example_build/fragments/shape.ast.gql.dart' as _i2;
3+
4+
const Shape = _i1.Operation(document: _i2.document, operationName: 'Shape');
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
import 'package:gql_exec/gql_exec.dart' as _i1;
2+
import 'package:gql_example_build/fragments/shape.var.gql.dart' as _i2;
3+
import 'package:gql_example_build/fragments/shape.op.gql.dart' as _i3;
4+
5+
class Shape extends _i1.Request {
6+
Shape(_i2.ShapeVarBuilder Function(_i2.ShapeVarBuilder) buildVars)
7+
: super(
8+
operation: _i3.Shape,
9+
variables: buildVars(_i2.ShapeVarBuilder()).variables);
10+
}
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
class ShapeVarBuilder {
2+
final Map<String, dynamic> variables = <String, dynamic>{};
3+
}

gql_example_build/lib/schema.ast.gql.dart

Lines changed: 75 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -220,6 +220,63 @@ const Field = _i1.ObjectTypeDefinitionNode(
220220
type: _i1.NamedTypeNode(
221221
name: _i1.NameNode(value: 'Field'), isNonNull: true))
222222
]);
223+
const Shape = _i1.InterfaceTypeDefinitionNode(
224+
name: _i1.NameNode(value: 'Shape'),
225+
directives: [],
226+
fields: [
227+
_i1.FieldDefinitionNode(
228+
name: _i1.NameNode(value: 'area'),
229+
directives: [],
230+
args: [],
231+
type: _i1.NamedTypeNode(
232+
name: _i1.NameNode(value: 'Float'), isNonNull: false))
233+
]);
234+
const Square = _i1.ObjectTypeDefinitionNode(
235+
name: _i1.NameNode(value: 'Square'),
236+
directives: [],
237+
interfaces: [
238+
_i1.NamedTypeNode(name: _i1.NameNode(value: 'Shape'), isNonNull: false)
239+
],
240+
fields: [
241+
_i1.FieldDefinitionNode(
242+
name: _i1.NameNode(value: 'area'),
243+
directives: [],
244+
args: [],
245+
type: _i1.NamedTypeNode(
246+
name: _i1.NameNode(value: 'Float'), isNonNull: false)),
247+
_i1.FieldDefinitionNode(
248+
name: _i1.NameNode(value: 'sideLength'),
249+
directives: [],
250+
args: [],
251+
type: _i1.NamedTypeNode(
252+
name: _i1.NameNode(value: 'Float'), isNonNull: false))
253+
]);
254+
const Rectangle = _i1.ObjectTypeDefinitionNode(
255+
name: _i1.NameNode(value: 'Rectangle'),
256+
directives: [],
257+
interfaces: [
258+
_i1.NamedTypeNode(name: _i1.NameNode(value: 'Shape'), isNonNull: false)
259+
],
260+
fields: [
261+
_i1.FieldDefinitionNode(
262+
name: _i1.NameNode(value: 'area'),
263+
directives: [],
264+
args: [],
265+
type: _i1.NamedTypeNode(
266+
name: _i1.NameNode(value: 'Float'), isNonNull: false)),
267+
_i1.FieldDefinitionNode(
268+
name: _i1.NameNode(value: 'sideLengthA'),
269+
directives: [],
270+
args: [],
271+
type: _i1.NamedTypeNode(
272+
name: _i1.NameNode(value: 'Float'), isNonNull: false)),
273+
_i1.FieldDefinitionNode(
274+
name: _i1.NameNode(value: 'sideLengthB'),
275+
directives: [],
276+
args: [],
277+
type: _i1.NamedTypeNode(
278+
name: _i1.NameNode(value: 'Float'), isNonNull: false))
279+
]);
223280
const Query = _i1.ObjectTypeDefinitionNode(
224281
name: _i1.NameNode(value: 'Query'),
225282
directives: [],
@@ -327,7 +384,22 @@ const Query = _i1.ObjectTypeDefinitionNode(
327384
defaultValue: null)
328385
],
329386
type: _i1.NamedTypeNode(
330-
name: _i1.NameNode(value: 'Field'), isNonNull: false))
387+
name: _i1.NameNode(value: 'Field'), isNonNull: false)),
388+
_i1.FieldDefinitionNode(
389+
name: _i1.NameNode(value: 'shape'),
390+
directives: [],
391+
args: [],
392+
type: _i1.NamedTypeNode(
393+
name: _i1.NameNode(value: 'Shape'), isNonNull: false))
331394
]);
332-
const document =
333-
_i1.DocumentNode(definitions: [schema, Scalar, Enum, Input, Field, Query]);
395+
const document = _i1.DocumentNode(definitions: [
396+
schema,
397+
Scalar,
398+
Enum,
399+
Input,
400+
Field,
401+
Shape,
402+
Square,
403+
Rectangle,
404+
Query
405+
]);

gql_example_build/lib/schema.graphql

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,23 @@ type Field {
4949
fieldRequired: Field!
5050
}
5151

52+
interface Shape {
53+
area: Float
54+
}
55+
56+
type Square implements Shape {
57+
area: Float
58+
59+
sideLength: Float
60+
}
61+
62+
type Rectangle implements Shape {
63+
area: Float
64+
65+
sideLengthA: Float
66+
sideLengthB: Float
67+
}
68+
5269
type Query {
5370
field(
5471
id: ID
@@ -69,4 +86,6 @@ type Query {
6986
enumRequired: Enum!
7087
inputRequired: Input!
7188
): Field
89+
90+
shape: Shape
7291
}

gql_example_build/pubspec.yaml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,3 +5,4 @@ dev_dependencies:
55
build_runner: ^1.0.0
66
gql_pedantic: ^1.0.1
77
gql_build: ^0.0.4
8+
test: ^1.0.0

0 commit comments

Comments
 (0)