@@ -17,8 +17,10 @@ import Prelude.Compat
17
17
18
18
import Control.Monad
19
19
(forM_ , unless , when )
20
+ import Control.Monad.Reader (runReaderT , ask )
20
21
import Control.Monad.Error.Class
21
22
(MonadError (.. ))
23
+ import Control.Monad.IO.Class (MonadIO (.. ))
22
24
import Data.Aeson
23
25
(FromJSON , ToJSON , decode' , encode )
24
26
import Data.Acquire
@@ -54,19 +56,19 @@ import Servant.API
54
56
Delete , EmptyAPI , Fragment , Get , HasStatus (StatusOf ), Header ,
55
57
Headers , HttpVersion , IsSecure (.. ), JSON , Lenient ,
56
58
NoContent (.. ), NoContentVerb , NoFraming , OctetStream , Patch ,
57
- PlainText , Post , Put , QueryFlag , QueryParam , QueryParams , Raw ,
59
+ PlainText , Post , Put , QueryFlag , QueryParam , QueryParams , Raw , RawM ,
58
60
RemoteHost , ReqBody , SourceIO , StdMethod (.. ), Stream , Strict ,
59
61
UVerb , Union , Verb , WithStatus (.. ), addHeader )
60
62
import Servant.Server
61
- (Context ((:.) , EmptyContext ), Handler , Server , Tagged (.. ),
62
- emptyServer , err401 , err403 , err404 , respond , serve ,
63
+ (Context ((:.) , EmptyContext ), Handler , Server , ServerT , Tagged (.. ),
64
+ emptyServer , err401 , err403 , err404 , hoistServer , respond , serve ,
63
65
serveWithContext )
64
66
import Servant.Test.ComprehensiveAPI
65
67
import qualified Servant.Types.SourceT as S
66
68
import Test.Hspec
67
69
(Spec , context , describe , it , shouldBe , shouldContain )
68
70
import Test.Hspec.Wai
69
- (get , liftIO , matchHeaders , matchStatus , shouldRespondWith ,
71
+ (get , matchHeaders , matchStatus , shouldRespondWith ,
70
72
with , (<:>) )
71
73
import qualified Test.Hspec.Wai as THW
72
74
@@ -102,6 +104,7 @@ spec = do
102
104
reqBodySpec
103
105
headerSpec
104
106
rawSpec
107
+ rawMSpec
105
108
alternativeSpec
106
109
responseHeadersSpec
107
110
uverbResponseHeadersSpec
@@ -610,6 +613,46 @@ rawSpec = do
610
613
611
614
-- }}}
612
615
------------------------------------------------------------------------------
616
+ -- * rawMSpec {{{
617
+ ------------------------------------------------------------------------------
618
+
619
+ type RawMApi = " foo" :> RawM
620
+
621
+ rawMApi :: Proxy RawMApi
622
+ rawMApi = Proxy
623
+
624
+ rawMServer :: (Monad m , MonadIO m , Show a ) => (Request -> m a ) -> ServerT RawMApi m
625
+ rawMServer f req resp = liftIO . resp . responseLBS ok200 [] . cs . show =<< f req
626
+
627
+ rawMSpec :: Spec
628
+ rawMSpec = do
629
+ describe " Servant.API.RawM" $ do
630
+ it " gives access to monadic context" $ do
631
+ flip runSession (serve rawMApi
632
+ (hoistServer rawMApi (flip runReaderT (42 :: Integer )) (rawMServer (const ask)))) $ do
633
+ response <- Network.Wai.Test. request defaultRequest{
634
+ pathInfo = [" foo" ]
635
+ }
636
+ liftIO $ do
637
+ simpleBody response `shouldBe` " 42"
638
+
639
+ it " lets users throw servant errors" $ do
640
+ flip runSession (serve rawMApi (rawMServer (const $ throwError err404 >> pure (42 :: Integer )))) $ do
641
+ response <- Network.Wai.Test. request defaultRequest{
642
+ pathInfo = [" foo" ]
643
+ }
644
+ liftIO $ do
645
+ statusCode (simpleStatus response) `shouldBe` 404
646
+
647
+ it " gets the pathInfo modified" $ do
648
+ flip runSession (serve rawMApi (rawMServer (pure . pathInfo))) $ do
649
+ response <- Network.Wai.Test. request defaultRequest{
650
+ pathInfo = [" foo" , " bar" ]
651
+ }
652
+ liftIO $ do
653
+ simpleBody response `shouldBe` cs (show [" bar" :: String ])
654
+ -- }}}
655
+ ------------------------------------------------------------------------------
613
656
-- * alternativeSpec {{{
614
657
------------------------------------------------------------------------------
615
658
type AlternativeApi =
0 commit comments