When argument is not found return null

The relevant test was restored too.
This commit is contained in:
Danny Navarro 2017-03-03 20:39:03 -03:00
parent fb071210cf
commit 2b5648efda
No known key found for this signature in database
GPG Key ID: 81E5F99780FA6A32
2 changed files with 19 additions and 21 deletions

View File

@ -24,7 +24,7 @@ module Data.GraphQL.Schema
, Value(..) , Value(..)
) where ) where
import Control.Applicative (Alternative(empty)) import Control.Applicative (Alternative(empty), (<|>))
import Data.Foldable (fold) import Data.Foldable (fold)
import Data.List.NonEmpty (NonEmpty) import Data.List.NonEmpty (NonEmpty)
import Data.Maybe (fromMaybe) import Data.Maybe (fromMaybe)
@ -66,6 +66,7 @@ objectA
=> Name -> (Arguments -> Resolvers f) -> Resolver f => Name -> (Arguments -> Resolvers f) -> Resolver f
objectA name f fld@(Field _ _ args flds) = withField name (resolve (f args) flds) fld objectA name f fld@(Field _ _ args flds) = withField name (resolve (f args) flds) fld
-- | Create a named 'Resolver' from a list of 'Resolver's. -- | Create a named 'Resolver' from a list of 'Resolver's.
object' :: (Alternative f, Monad f) => Text -> f [Resolver f] -> Resolver f object' :: (Alternative f, Monad f) => Text -> f [Resolver f] -> Resolver f
object' name resolvs = objectA' name $ \case object' name resolvs = objectA' name $ \case
@ -136,9 +137,11 @@ enumA _ _ _ = empty
withField withField
:: (Alternative f, Aeson.ToJSON a) :: (Alternative f, Aeson.ToJSON a)
=> Name -> f a -> Field -> f (HashMap Text Aeson.Value) => Name -> f a -> Field -> f (HashMap Text Aeson.Value)
withField name f (Field alias name' _ _) = withField name v (Field alias name' _ _) =
if name == name' if name == name'
then fmap (HashMap.singleton aliasOrName . Aeson.toJSON) f then fmap (HashMap.singleton aliasOrName . Aeson.toJSON) v
-- TODO: Report error when Non-Nullable type for field argument.
<|> pure (HashMap.singleton aliasOrName Aeson.Null)
else empty else empty
where where
aliasOrName = fromMaybe name alias aliasOrName = fromMaybe name alias

View File

@ -140,24 +140,19 @@ test = testGroup "Star Wars Query Tests"
$ object [ "data" .= object [ $ object [ "data" .= object [
"human" .= object [hanName] "human" .= object [hanName]
]] ]]
-- TODO: Enable after Error handling restoration , testCase "Invalid ID" . testQueryParams
-- , testCase "Invalid ID" . testQueryParams (\v -> if v == "id"
-- (\v -> if v == "id" then Just "Not a valid ID"
-- then Just "Not a valid ID" else Nothing)
-- else Nothing) [r| query humanQuery($id: String!) {
-- [r| query humanQuery($id: String!) { human(id: $id) {
-- human(id: $id) { name
-- name }
-- } }
-- } -- The GraphQL spec specifies that an error should be reported when the
-- |] $ object ["data" .= object ["human" .= object ["name" .= Aeson.Null]], -- type of the argument is Non-Nullable. However the equivalent test in
-- "errors" .= Aeson.toJSON [object ["message" .= ("field name not resolved." :: Text)]]] -- `graphql-js` doesn't check for any errors.
-- TODO: This test is directly ported from `graphql-js`, however do we want |] $ object ["data" .= object ["human" .= Aeson.Null]]
-- to mimic the same behavior? Is this part of the spec? Once proper
-- exceptions are implemented this test might no longer be meaningful.
-- If the same behavior needs to be replicated, should it be implemented
-- when defining the `Schema` or when executing?
-- $ object [ "data" .= object ["human" .= Aeson.Null] ]
, testCase "Luke aliased" . testQuery , testCase "Luke aliased" . testQuery
[r| query FetchLukeAliased { [r| query FetchLukeAliased {
luke: human(id: "1000") { luke: human(id: "1000") {