graphql/tests/Test/StarWars/Schema.hs

76 lines
2.5 KiB
Haskell
Raw Normal View History

{-# LANGUAGE OverloadedStrings #-}
2019-07-14 05:58:05 +02:00
module Test.StarWars.Schema
( character
, droid
, hero
, human
, schema
) where
import Control.Monad.Trans.Except (throwE)
import Control.Monad.Trans.Class (lift)
import Data.Functor.Identity (Identity)
import qualified Data.HashMap.Strict as HashMap
import Data.Maybe (catMaybes)
import qualified Language.GraphQL.Schema as Schema
import Language.GraphQL.Trans
2020-05-14 09:17:14 +02:00
import Language.GraphQL.Type.Definition
2020-05-24 13:51:00 +02:00
import qualified Language.GraphQL.Type.In as In
import qualified Language.GraphQL.Type.Out as Out
2020-05-14 09:17:14 +02:00
import Language.GraphQL.Type.Schema
import Test.StarWars.Data
-- See https://github.com/graphql/graphql-js/blob/master/src/__tests__/starWarsSchema.js
2020-05-14 09:17:14 +02:00
schema :: Schema Identity
schema = Schema { query = queryType, mutation = Nothing }
where
queryType = Out.ObjectType "Query" Nothing [] $ HashMap.fromList
[ ("hero", Out.Field Nothing (Out.NamedScalarType string) mempty hero)
, ("human", Out.Field Nothing (Out.NamedScalarType string) mempty human)
, ("droid", Out.Field Nothing (Out.NamedScalarType string) mempty droid)
]
2020-05-24 13:51:00 +02:00
hero :: ActionT Identity (Out.Value Identity)
hero = do
episode <- argument "episode"
pure $ character $ case episode of
2020-05-24 13:51:00 +02:00
In.Enum "NEWHOPE" -> getHero 4
In.Enum "EMPIRE" -> getHero 5
In.Enum "JEDI" -> getHero 6
_ -> artoo
2020-05-24 13:51:00 +02:00
human :: ActionT Identity (Out.Value Identity)
human = do
id' <- argument "id"
case id' of
2020-05-24 13:51:00 +02:00
In.String i -> do
humanCharacter <- lift $ return $ getHuman i >>= Just
case humanCharacter of
2020-05-24 13:51:00 +02:00
Nothing -> pure Out.Null
Just e -> pure $ character e
_ -> ActionT $ throwE "Invalid arguments."
2020-05-24 13:51:00 +02:00
droid :: ActionT Identity (Out.Value Identity)
droid = do
id' <- argument "id"
case id' of
In.String i -> character <$> getDroid i
_ -> ActionT $ throwE "Invalid arguments."
2020-05-24 13:51:00 +02:00
character :: Character -> Out.Value Identity
character char = Schema.object
2020-05-24 13:51:00 +02:00
[ Schema.Resolver "id" $ pure $ Out.String $ id_ char
, Schema.Resolver "name" $ pure $ Out.String $ name_ char
, Schema.Resolver "friends"
$ pure $ Out.List $ character <$> getFriends char
2020-05-24 13:51:00 +02:00
, Schema.Resolver "appearsIn" $ pure
$ Out.List $ Out.Enum <$> catMaybes (getEpisode <$> appearsIn char)
, Schema.Resolver "secretBackstory" $ Out.String
<$> secretBackstory char
, Schema.Resolver "homePlanet" $ pure $ Out.String
$ either mempty homePlanet char
, Schema.Resolver "__typename" $ pure $ Out.String
$ typeName char
]