Skip to content

Commit

Permalink
Merge pull request #526 from purple4reina/resolve-errors
Browse files Browse the repository at this point in the history
Always call resolveFieldFinishFn even if an error occurs in resolve.
  • Loading branch information
chris-ramon committed Feb 5, 2020
2 parents 2e2b648 + 0c12f38 commit d925012
Show file tree
Hide file tree
Showing 2 changed files with 39 additions and 4 deletions.
8 changes: 4 additions & 4 deletions executor.go
Original file line number Diff line number Diff line change
Expand Up @@ -650,15 +650,15 @@ func resolveField(eCtx *executionContext, parentType *Object, source interface{}
Context: eCtx.Context,
})

if resolveFnError != nil {
panic(resolveFnError)
}

extErrs = resolveFieldFinishFn(result, resolveFnError)
if len(extErrs) != 0 {
eCtx.Errors = append(eCtx.Errors, extErrs...)
}

if resolveFnError != nil {
panic(resolveFnError)
}

completed := completeValueCatchingError(eCtx, returnType, fieldASTs, info, path, result)
return completed, resultState
}
Expand Down
35 changes: 35 additions & 0 deletions extensions_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,12 @@ func tinit(t *testing.T) graphql.Schema {
return "foo", nil
},
},
"erred": &graphql.Field{
Type: graphql.String,
Resolve: func(p graphql.ResolveParams) (interface{}, error) {
return "", errors.New("ooops")
},
},
},
}),
})
Expand Down Expand Up @@ -306,6 +312,35 @@ func TestExtensionResolveFieldFinishFuncPanic(t *testing.T) {
}
}

func TestExtensionResolveFieldFinishFuncAfterError(t *testing.T) {
var fnErrs int
ext := newtestExt("testExt")
ext.resolveFieldDidStartFn = func(ctx context.Context, i *graphql.ResolveInfo) (context.Context, graphql.ResolveFieldFinishFunc) {
return ctx, func(v interface{}, err error) {
if err != nil {
fnErrs++
}
}
}

schema := tinit(t)
query := `query Example { erred }`
schema.AddExtensions(ext)

result := graphql.Do(graphql.Params{
Schema: schema,
RequestString: query,
})

if resErrs := len(result.Errors); resErrs != 1 {
t.Errorf("Incorrect number of returned result errors: %d", resErrs)
}

if fnErrs != 1 {
t.Errorf("Incorrect number of errors captured: %d", fnErrs)
}
}

func TestExtensionGetResultPanic(t *testing.T) {
ext := newtestExt("testExt")
ext.getResultFn = func(context.Context) interface{} {
Expand Down

0 comments on commit d925012

Please sign in to comment.