@@ -8,12 +8,14 @@ module Servant.ClientSpec where
88import Control.Concurrent
99import Control.Exception
1010import Control.Monad.Trans.Either
11+import Data.Foldable
1112import Data.Proxy
1213import Data.Typeable
1314import Network.Socket
1415import Network.URI
1516import Network.Wai
1617import Network.Wai.Handler.Warp
18+import Prelude hiding (mapM_)
1719import Test.Hspec
1820
1921import Servant.API
@@ -28,6 +30,7 @@ type Api =
2830 :<|> "body" :> ReqBody Person :> Post Person
2931 :<|> "param" :> QueryParam "name" String :> Get Person
3032 :<|> "params" :> QueryParams "names" String :> Get [Person]
33+ :<|> "flag" :> QueryFlag "flag" :> Get Bool
3134api :: Proxy Api
3235api = Proxy
3336
@@ -41,6 +44,7 @@ server = serve api (
4144 Just name -> left (400, name ++ " not found")
4245 Nothing -> left (400, "missing parameter"))
4346 :<|> (\ names -> return (zipWith Person names [0..]))
47+ :<|> return
4448 )
4549
4650withServer :: (URIAuth -> IO a) -> IO a
@@ -51,11 +55,13 @@ getCapture :: String -> URIAuth -> EitherT String IO Person
5155getBody :: Person -> URIAuth -> EitherT String IO Person
5256getQueryParam :: Maybe String -> URIAuth -> EitherT String IO Person
5357getQueryParams :: [String] -> URIAuth -> EitherT String IO [Person]
58+getQueryFlag :: Bool -> URIAuth -> EitherT String IO Bool
5459( getGet
5560 :<|> getCapture
5661 :<|> getBody
5762 :<|> getQueryParam
58− :<|> getQueryParams)
63+ :<|> getQueryParams
64+ :<|> getQueryFlag)
5965 = client api
6066
6167spec :: Spec
@@ -80,6 +86,12 @@ spec = do
8086 runEitherT (getQueryParams ["alice", "bob"] host)
8187 `shouldReturn` Right [Person "alice" 0, Person "bob" 1]
8288
89+ context "Servant.API.QueryParam.QueryFlag" $
90+ forM_ [False, True] $ \ flag ->
91+ it (show flag) $ withServer $ \ host -> do
92+ runEitherT (getQueryFlag flag host) `shouldReturn` Right flag
93+
94+
8395 context "client correctly handles error status codes" $ do
8496 let test :: WrappedApi -> Spec
8597 test (WrappedApi api) =