summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/Language/GraphQL/Execute/Execution.hs6
-rw-r--r--tests/Language/GraphQL/ExecuteSpec.hs18
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