morpheus-graphql-0.12.0: test/Subscription/Case/ApolloRequest.hs
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE NamedFieldPuns #-}
{-# LANGUAGE OverloadedStrings #-}
module Subscription.Case.ApolloRequest
( testApolloRequest,
SubM,
)
where
import Data.ByteString.Lazy.Char8 (ByteString)
import Data.Morpheus.Types
( Input,
Stream,
)
import Data.Morpheus.Types.Internal.Subscription
( GQLChannel (..),
WS,
)
import Subscription.Utils
( SimulationState (..),
SubM,
apolloInit,
apolloStart,
apolloStop,
inputsAreConsumed,
storeIsEmpty,
storeSubscriptions,
stored,
storedSingle,
testResponse,
testSimulation,
)
import Test.Tasty
( TestTree,
testGroup,
)
testUnknownType ::
( Eq (StreamChannel e),
GQLChannel e
) =>
(Input WS -> Stream WS e (SubM e)) ->
IO TestTree
testUnknownType =
testSimulation
test
["{ \"type\":\"bla\" }"]
where
test _ SimulationState {inputs, outputs, store} =
testGroup
"unknown request type"
[ inputsAreConsumed inputs,
testResponse
["Unknown Request type \"bla\"."]
outputs,
storeIsEmpty store
]
testConnectionInit ::
( Eq (StreamChannel e),
GQLChannel e
) =>
(Input WS -> Stream WS e (SubM e)) ->
IO TestTree
testConnectionInit = testSimulation test [apolloInit]
where
test input SimulationState {inputs, outputs, store} =
testGroup
"connection init"
[ inputsAreConsumed inputs,
testResponse
[]
outputs,
stored input store,
storedSingle store
]
startSub :: ByteString -> ByteString
startSub = apolloStart "subscription MySubscription { newDeity { name }}"
testSubscriptionStart ::
( Eq (StreamChannel e),
GQLChannel e
) =>
(Input WS -> Stream WS e (SubM e)) ->
IO TestTree
testSubscriptionStart =
testSimulation
test
[ apolloInit,
startSub "1",
startSub "5"
]
where
test input SimulationState {inputs, outputs, store} =
testGroup
"subscription start"
[ inputsAreConsumed inputs,
testResponse
[]
outputs,
storeSubscriptions
input
["1", "5"]
store
]
testSubscriptionStop ::
( Eq (StreamChannel e),
GQLChannel e
) =>
(Input WS -> Stream WS e (SubM e)) ->
IO TestTree
testSubscriptionStop =
testSimulation
test
[ apolloInit,
startSub "1",
startSub "5",
apolloStop "1"
]
where
test input SimulationState {inputs, outputs, store} =
testGroup
"stop subscription"
[ inputsAreConsumed inputs,
testResponse
[]
outputs,
storeSubscriptions
input
["5"]
store
]
testApolloRequest ::
( Eq (StreamChannel e),
GQLChannel e
) =>
(Input WS -> Stream WS e (SubM e)) ->
IO TestTree
testApolloRequest api = do
unknownType <- testUnknownType api
connection_init <- testConnectionInit api
start <- testSubscriptionStart api
stop <- testSubscriptionStop api
return $ testGroup "ApolloRequest" [unknownType, connection_init, start, stop]