diff options
| author | Eugen Wissner <belka@caraus.de> | 2021-06-17 08:15:27 +0200 |
|---|---|---|
| committer | Eugen Wissner <belka@caraus.de> | 2021-06-17 08:15:27 +0200 |
| commit | 2ce2be5d917091872b45b650b60ac2a23f544916 (patch) | |
| tree | 0b4b3dbceb74cb810522dff5fee923fcc92d8a78 | |
| parent | c311cb0070de2979111014e8e22a5f6fefee3ea3 (diff) | |
| download | graphql-2ce2be5d917091872b45b650b60ac2a23f544916.tar.gz | |
Provide location information for interface errors
| -rw-r--r-- | src/Language/GraphQL/Execute/Execution.hs | 6 | ||||
| -rw-r--r-- | tests/Language/GraphQL/ExecuteSpec.hs | 18 |
2 files changed, 21 insertions, 3 deletions
diff --git a/src/Language/GraphQL/Execute/Execution.hs b/src/Language/GraphQL/Execute/Execution.hs index b671c13..742a6a9 100644 --- a/src/Language/GraphQL/Execute/Execution.hs +++ b/src/Language/GraphQL/Execute/Execution.hs @@ -132,12 +132,13 @@ completeValue (Out.ObjectBaseType objectType) fields result = completeValue (Out.InterfaceBaseType interfaceType) fields result | Type.Object objectMap <- result = do let abstractType = Internal.AbstractInterfaceType interfaceType + let Transform.Field _ _ _ _ location = NonEmpty.head fields concreteType <- resolveAbstractType abstractType objectMap case concreteType of Just objectType -> executeSelectionSet result objectType $ mergeSelectionSets fields Nothing -> addError null - $ Error "Interface value completion failed." [] [] + $ Error "Interface value completion failed." [location] [] completeValue (Out.UnionBaseType unionType) fields result | Type.Object objectMap <- result = do let abstractType = Internal.AbstractUnionType unionType @@ -148,7 +149,8 @@ completeValue (Out.UnionBaseType unionType) fields result $ mergeSelectionSets fields Nothing -> addError null $ Error "Union value completion failed." [location] [] -completeValue _ _ _ = addError null $ Error "Value completion failed." [] [] +completeValue _ (Transform.Field _ _ _ _ location :| _) _ = + addError null $ Error "Value completion failed." [location] [] mergeSelectionSets :: MonadCatch m => NonEmpty (Transform.Field m) diff --git a/tests/Language/GraphQL/ExecuteSpec.hs b/tests/Language/GraphQL/ExecuteSpec.hs index f5bfd33..815e315 100644 --- a/tests/Language/GraphQL/ExecuteSpec.hs +++ b/tests/Language/GraphQL/ExecuteSpec.hs @@ -218,7 +218,7 @@ spec = $ parse document "" "{ philosopher { school } }" in actual `shouldBe` expected - it "gives location information for invalid interfaces" $ + it "gives location information for non-null unions" $ let data'' = Aeson.object [ "philosopher" .= Aeson.object [ "interest" .= Aeson.Null @@ -234,6 +234,22 @@ spec = $ parse document "" "{ philosopher { interest } }" in actual `shouldBe` expected + it "gives location information for invalid interfaces" $ + let data'' = Aeson.object + [ "philosopher" .= Aeson.object + [ "majorWork" .= Aeson.Null + ] + ] + executionErrors = pure $ Error + { message = "Interface value completion failed." + , locations = [Location 1 17] + , path = [] + } + expected = Response data'' executionErrors + Right (Right actual) = either (pure . parseError) execute' + $ parse document "" "{ philosopher { majorWork { title } } }" + in actual `shouldBe` expected + context "Subscription" $ it "subscribes" $ let data'' = Aeson.object |
