Skip to content

Commit 21b77bd

Browse files
authored
Merge pull request #443 from eko/fix-369
Fixed duplicated __typename in response (fixes #369)
2 parents d2656e8 + fe4cb53 commit 21b77bd

File tree

3 files changed

+50
-8
lines changed

3 files changed

+50
-8
lines changed

gqltesting/testing.go

+16-3
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ type Test struct {
2323
Variables map[string]interface{}
2424
ExpectedResult string
2525
ExpectedErrors []*errors.QueryError
26+
RawResponse bool
2627
}
2728

2829
// RunTests runs the given GraphQL test cases as subtests.
@@ -57,10 +58,22 @@ func RunTest(t *testing.T, test *Test) {
5758
}
5859

5960
// Verify JSON to avoid red herring errors.
60-
got, err := formatJSON(result.Data)
61-
if err != nil {
62-
t.Fatalf("got: invalid JSON: %s", err)
61+
var got []byte
62+
63+
if test.RawResponse {
64+
value, err := result.Data.MarshalJSON()
65+
if err != nil {
66+
t.Fatalf("got: unable to marshal JSON response: %s", err)
67+
}
68+
got = value
69+
} else {
70+
value, err := formatJSON(result.Data)
71+
if err != nil {
72+
t.Fatalf("got: invalid JSON: %s", err)
73+
}
74+
got = value
6375
}
76+
6477
want, err := formatJSON([]byte(test.ExpectedResult))
6578
if err != nil {
6679
t.Fatalf("want: invalid JSON: %s", err)

graphql_test.go

+24
Original file line numberDiff line numberDiff line change
@@ -1836,6 +1836,30 @@ func TestTypeName(t *testing.T) {
18361836
}
18371837
`,
18381838
},
1839+
1840+
{
1841+
Schema: starwarsSchema,
1842+
Query: `
1843+
{
1844+
hero {
1845+
__typename
1846+
name
1847+
... on Character {
1848+
...Droid
1849+
name
1850+
__typename
1851+
}
1852+
}
1853+
}
1854+
1855+
fragment Droid on Droid {
1856+
name
1857+
__typename
1858+
}
1859+
`,
1860+
RawResponse: true,
1861+
ExpectedResult: `{"hero":{"__typename":"Droid","name":"R2-D2"}}`,
1862+
},
18391863
})
18401864
}
18411865

internal/exec/exec.go

+10-5
Original file line numberDiff line numberDiff line change
@@ -129,12 +129,17 @@ func collectFieldsToResolve(sels []selected.Selection, s *resolvable.Schema, res
129129
field.sels = append(field.sels, sel.Sels...)
130130

131131
case *selected.TypenameField:
132-
sf := &selected.SchemaField{
133-
Field: s.Meta.FieldTypename,
134-
Alias: sel.Alias,
135-
FixedResult: reflect.ValueOf(typeOf(sel, resolver)),
132+
_, ok := fieldByAlias[sel.Alias]
133+
if !ok {
134+
sf := &selected.SchemaField{
135+
Field: s.Meta.FieldTypename,
136+
Alias: sel.Alias,
137+
FixedResult: reflect.ValueOf(typeOf(sel, resolver)),
138+
}
139+
field := &fieldToExec{field: sf, resolver: resolver}
140+
*fields = append(*fields, field)
141+
fieldByAlias[sel.Alias] = field
136142
}
137-
*fields = append(*fields, &fieldToExec{field: sf, resolver: resolver})
138143

139144
case *selected.TypeAssertion:
140145
out := resolver.Method(sel.MethodIndex).Call(nil)

0 commit comments

Comments
 (0)