@@ -1,14 +1,17 @@
1−{-# LANGUAGE DataKinds #-}
2−{-# LANGUAGE DeriveGeneric #-}
3−{-# LANGUAGE OverloadedStrings #-}
4−{-# LANGUAGE ScopedTypeVariables #-}
5−{-# LANGUAGE TypeOperators #-}
6−{-# LANGUAGE TypeSynonymInstances #-}
7−{-# LANGUAGE FlexibleInstances #-}
1+{-# LANGUAGE CPP #-}
2+{-# LANGUAGE DataKinds #-}
3+{-# LANGUAGE DeriveGeneric #-}
4+{-# LANGUAGE OverloadedStrings #-}
5+{-# LANGUAGE ScopedTypeVariables #-}
6+{-# LANGUAGE TypeOperators #-}
7+{-# LANGUAGE TypeSynonymInstances #-}
8+{-# LANGUAGE FlexibleInstances #-}
89
910module Servant.ServerSpec where
1011
11−
12+#if !MIN_VERSION_base(4,8,0)
13+import Control.Applicative ((<$>))
14+#endif
1215import Control.Monad (forM_, when)
1316import Control.Monad.Trans.Except (ExceptT, throwE)
1417import Data.Aeson (FromJSON, ToJSON, decode', encode)
@@ -23,10 +26,12 @@ import GHC.Generics (Generic)
2326import Network.HTTP.Types (hAccept, hContentType,
2427 methodDelete, methodGet, methodHead,
2528 methodPatch, methodPost, methodPut,
26− ok200, parseQuery, status409)
29+ ok200, parseQuery, status409,
30+ Status(..))
2731import Network.Wai (Application, Request, pathInfo,
2832 queryString, rawQueryString,
29− responseLBS)
33+ responseLBS, responseBuilder)
34+import Network.Wai.Internal (Response(ResponseBuilder))
3035import Network.Wai.Test (defaultRequest, request,
3136 runSession, simpleBody)
3237import Test.Hspec (Spec, describe, it, shouldBe)
@@ -41,8 +46,12 @@ import Servant.API ((:<|>) (..), (:>),
4146 Post, Put, RemoteHost, QueryFlag, QueryParam,
4247 QueryParams, Raw, ReqBody)
4348import Servant.Server (Server, serve, ServantErr(..), err404)
49+import Servant.Server.Internal.Router
50+ (tweakResponse, runRouter,
51+ Router, Router'(LeafRouter))
4452import Servant.Server.Internal.RoutingApplication
45− (RouteMismatch (..))
53+ (RouteResult(..), RouteMismatch(..),
54+ toApplication)
4655
4756
4857-- * test data types
@@ -92,6 +101,7 @@ spec = do
92101 unionSpec
93102 prioErrorsSpec
94103 errorsSpec
104+ routerSpec
95105 responseHeadersSpec
96106 miscReqCombinatorsSpec
97107
@@ -697,6 +707,24 @@ errorsSpec = do
697707 nf <> ib `shouldBe` ib
698708 nf <> wm `shouldBe` wm
699709
710+routerSpec :: Spec
711+routerSpec = do
712+ describe "Servant.Server.Internal.Router" $ do
713+ let app' :: Application
714+ app' = toApplication $ runRouter router'
715+
716+ router', router :: Router
717+ router' = tweakResponse (twk <$>) router
718+ router = LeafRouter $ \_ cont -> cont (RR . Right $ responseBuilder (Status 201 "") [] "")
719+
720+ twk :: Response -> Response
721+ twk (ResponseBuilder (Status i s) hs b) = ResponseBuilder (Status (i + 1) s) hs b
722+ twk b = b
723+
724+ describe "tweakResponse" . with (return app') $ do
725+ it "calls f on route result" $ do
726+ get "" `shouldRespondWith` 202
727+
700728type MiscCombinatorsAPI
701729 = "version" :> HttpVersion :> Get '[JSON] String
702730 :<|> "secure" :> IsSecure :> Get '[JSON] String