Skip to content

Commit 46cf654

Browse files
author
Matthieu Vachon
committed
Allowed Subscription resolver to return *QueryError directly
Previously, any error returned by the Subscription resolver was immediately wrapped inside its own `*QueryError` value even if the returned error was already a `*QueryError`. Now, when receiving such types, we use it as-is without wrapping again.
1 parent 4c772c1 commit 46cf654

File tree

2 files changed

+31
-3
lines changed

2 files changed

+31
-3
lines changed

internal/exec/subscribe.go

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -49,9 +49,15 @@ func (r *Request) Subscribe(ctx context.Context, s *resolvable.Schema, op *query
4949
result = callOut[0]
5050

5151
if f.field.HasError && !callOut[1].IsNil() {
52-
resolverErr := callOut[1].Interface().(error)
53-
err = errors.Errorf("%s", resolverErr)
54-
err.ResolverError = resolverErr
52+
switch resolverErr := callOut[1].Interface().(type) {
53+
case *errors.QueryError:
54+
err = resolverErr
55+
case error:
56+
err = errors.Errorf("%s", resolverErr)
57+
err.ResolverError = resolverErr
58+
default:
59+
panic(fmt.Errorf("can only deal with *QueryError and error types, got %T", resolverErr))
60+
}
5561
}
5662
}()
5763

subscription_test.go

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ func (r *helloResolver) Hello() string {
2424
}
2525

2626
var resolverErr = errors.New("resolver error")
27+
var resolverQueryErr = &qerrors.QueryError{Message: "query", ResolverError: resolverErr}
2728

2829
type helloSaidResolver struct {
2930
err error
@@ -265,6 +266,27 @@ func TestSchemaSubscribe(t *testing.T) {
265266
},
266267
},
267268
},
269+
{
270+
Name: "subscription_resolver_can_query_error",
271+
Schema: graphql.MustParseSchema(schema, &rootResolver{
272+
helloSaidResolver: &helloSaidResolver{err: resolverQueryErr},
273+
}),
274+
Query: `
275+
subscription onHelloSaid {
276+
helloSaid {
277+
msg
278+
}
279+
}
280+
`,
281+
ExpectedResults: []gqltesting.TestResponse{
282+
{
283+
Data: json.RawMessage(`
284+
null
285+
`),
286+
Errors: []*qerrors.QueryError{resolverQueryErr},
287+
},
288+
},
289+
},
268290
{
269291
Name: "schema_without_resolver_errors",
270292
Schema: graphql.MustParseSchema(schema, nil),

0 commit comments

Comments
 (0)