diff --git a/execution_test.go b/execution_test.go index e8f6e0de..c05bbb96 100644 --- a/execution_test.go +++ b/execution_test.go @@ -4983,6 +4983,55 @@ func TestQueryWithBoundaryFields(t *testing.T) { f.checkSuccess(t) } +func TestQuerySelectionSetFragmentMismatchesWithResponse(t *testing.T) { + f := &queryExecutionFixture{ + services: []testService{{ + schema: ` + interface Transport { + speed: Int! + } + + type Bicycle implements Transport { + speed: Int! + dropbars: Boolean! + } + + type Plane implements Transport { + speed: Int! + winglength: Int! + } + + type Query { + selectedTransport: Transport! + }`, + handler: http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + w.Write([]byte(`{ + "data": { + "selectedTransport": { + "speed": 30 + } + } + }`)) + }), + }}, + query: `query { + selectedTransport { + speed + ... on Plane { + __typename + winglength + } + } + }`, + expected: `{ + "selectedTransport": { + "speed": 30 + } + }`, + } + f.checkSuccess(t) +} + func TestQueryWithArrayBoundaryFields(t *testing.T) { f := &queryExecutionFixture{ services: []testService{ diff --git a/query_execution.go b/query_execution.go index bdfeda30..4146d245 100644 --- a/query_execution.go +++ b/query_execution.go @@ -844,10 +844,6 @@ func unionAndTrimSelectionSetRec(objectTypename string, schema *ast.Schema, sele filteredSelectionSet = append(filteredSelectionSet, selection) case *ast.InlineFragment: fragment := selection - if objectTypename == "" { - return nil, errors.New("unionAndTrimSelectionSetRec: expected __typename") - } - if fragment.ObjectDefinition.IsAbstractType() && fragmentImplementsAbstractType(schema, fragment.ObjectDefinition.Name, fragment.TypeCondition) && objectTypenameMatchesDifferentFragment(objectTypename, fragment) {