summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEugen Wissner <belka@caraus.de>2021-04-12 07:09:39 +0200
committerEugen Wissner <belka@caraus.de>2021-04-12 07:09:39 +0200
commit5654b78935b38a88f3dd4998eb8667a2695aea14 (patch)
treea81993de154da6fd7b4f56f176f38ea4fe2df2ac
parentd6dda14cfd1486c6a5648a0a1086a5b5302f1954 (diff)
downloadgraphql-5654b78935b38a88f3dd4998eb8667a2695aea14.tar.gz
Traverse input object properties once
-rw-r--r--CHANGELOG.md4
-rw-r--r--graphql.cabal3
-rw-r--r--src/Language/GraphQL/Validate/Rules.hs16
-rw-r--r--tests/Language/GraphQL/Validate/RulesSpec.hs15
4 files changed, 24 insertions, 14 deletions
diff --git a/CHANGELOG.md b/CHANGELOG.md
index eec1c07..2854191 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -14,8 +14,10 @@ and this project adheres to
### Fixed
- Parser now accepts empty lists and objects.
- Parser now accepts all directive locations.
-- `valuesOfCorrectTypeRule` doesn't check list items recursively since the
+- `valuesOfCorrectTypeRule` doesn't check lists recursively since the
validation traverser calls it on all list items.
+- `valuesOfCorrectTypeRule` doesn't check objects recursively since the
+ validation traverser calls it on all object properties.
### Changed
- `AST.Document.Value.List` and `AST.Document.ConstValue.ConstList` contain
diff --git a/graphql.cabal b/graphql.cabal
index 294787e..b2316de 100644
--- a/graphql.cabal
+++ b/graphql.cabal
@@ -88,9 +88,6 @@ test-suite graphql-test
Test.DirectiveSpec
Test.FragmentSpec
Test.RootOperationSpec
- Paths_graphql
- autogen-modules:
- Paths_graphql
hs-source-dirs:
tests
ghc-options: -threaded -rtsopts -with-rtsopts=-N -Wall
diff --git a/src/Language/GraphQL/Validate/Rules.hs b/src/Language/GraphQL/Validate/Rules.hs
index 905c2a7..a6bc43b 100644
--- a/src/Language/GraphQL/Validate/Rules.hs
+++ b/src/Language/GraphQL/Validate/Rules.hs
@@ -1582,24 +1582,20 @@ valuesOfCorrectTypeRule = ValueRule go constGo
, Full.ConstEnum memberValue <- node
, HashMap.member memberValue members = mempty
check (In.InputObjectBaseType objectType) Full.Node{ node }
- | In.InputObjectType _ _ typeFields <- objectType
- , Full.ConstObject valueFields <- node =
- foldMap (checkObjectField typeFields) valueFields
+ -- Skip, objects are checked recursively by the validation traverser.
+ | In.InputObjectType{} <- objectType
+ , Full.ConstObject{} <- node = mempty
check (In.ListBaseType listType) constValue@Full.Node{ .. }
-- Skip, lists are checked recursively by the validation traverser.
- | Full.ConstList _ <- node = mempty
+ | Full.ConstList{} <- node = mempty
| otherwise = check listType constValue
check inputType Full.Node{ .. } = pure $ Error
{ message = concat
[ "Value "
- , show node, " cannot be coerced to type \""
+ , show node
+ , " cannot be coerced to type \""
, show inputType
, "\"."
]
, locations = [location]
}
- checkObjectField typeFields Full.ObjectField{..}
- | Just typeField <- HashMap.lookup name typeFields
- , In.InputField _ fieldType _ <- typeField =
- check fieldType value
- checkObjectField _ _ = mempty
diff --git a/tests/Language/GraphQL/Validate/RulesSpec.hs b/tests/Language/GraphQL/Validate/RulesSpec.hs
index ce12138..02b14ae 100644
--- a/tests/Language/GraphQL/Validate/RulesSpec.hs
+++ b/tests/Language/GraphQL/Validate/RulesSpec.hs
@@ -929,3 +929,18 @@ spec =
, locations = [AST.Location 4 54]
}
in validate queryString `shouldBe` [expected]
+
+ it "validates input object properties once" $
+ let queryString = [r|
+ {
+ findDog(complex: { name: 3 }) {
+ name
+ }
+ }
+ |]
+ expected = Error
+ { message =
+ "Value 3 cannot be coerced to type \"!String\"."
+ , locations = [AST.Location 3 46]
+ }
+ in validate queryString `shouldBe` [expected]