@@ -46,7 +46,7 @@ import Network.Wai.Test
46 simpleHeaders, simpleStatus)
46 simpleHeaders, simpleStatus)
47import Servant.API
47import Servant.API
48 ((:<|>) (..), (:>), AuthProtect, BasicAuth,
48 ((:<|>) (..), (:>), AuthProtect, BasicAuth,
49− BasicAuthData (BasicAuthData), Capture, CaptureAll, Delete,
49+ BasicAuthData (BasicAuthData), Capture, Capture', CaptureAll, Lenient, Strict, Delete,
50 EmptyAPI, Get, Header, Headers, HttpVersion, IsSecure (..),
50 EmptyAPI, Get, Header, Headers, HttpVersion, IsSecure (..),
51 JSON, NoContent (..), NoFraming, OctetStream, Patch,
51 JSON, NoContent (..), NoFraming, OctetStream, Patch,
52 PlainText, Post, Put, QueryFlag, QueryParam, QueryParams, Raw,
52 PlainText, Post, Put, QueryFlag, QueryParam, QueryParams, Raw,
@@ -54,7 +54,7 @@ import Servant.API
54 addHeader)
54 addHeader)
55import Servant.Server
55import Servant.Server
56 (Context ((:.), EmptyContext), Handler, Server, Tagged (..),
56 (Context ((:.), EmptyContext), Handler, Server, Tagged (..),
57− emptyServer, err401, err403, err404, serve, serveWithContext)
57+ emptyServer, err400, err401, err403, err404, serve, serveWithContext)
58import Servant.Test.ComprehensiveAPI
58import Servant.Test.ComprehensiveAPI
59import qualified Servant.Types.SourceT as S
59import qualified Servant.Types.SourceT as S
60import Test.Hspec
60import Test.Hspec
@@ -204,13 +204,27 @@ verbSpec = describe "Servant.API.Verb" $ do
204------------------------------------------------------------------------------
204------------------------------------------------------------------------------
206type CaptureApi = Capture "legs" Integer :> Get '[JSON] Animal
206type CaptureApi = Capture "legs" Integer :> Get '[JSON] Animal
207+ :<|> "ears" :> Capture' '[Lenient] "ears" Integer :> Get '[JSON] Animal
208+ :<|> "eyes" :> Capture' '[Strict] "eyes" Integer :> Get '[JSON] Animal
207captureApi :: Proxy CaptureApi
209captureApi :: Proxy CaptureApi
208captureApi = Proxy
210captureApi = Proxy
212+captureServer :: Server CaptureApi
213+captureServer = getLegs :<|> getEars :<|> getEyes
209−captureServer :: Integer -> Handler Animal
214+ where getLegs :: Integer -> Handler Animal
210−captureServer legs = case legs of
215+ getLegs legs = case legs of
211− 4 -> return jerry
216+ 4 -> return jerry
212− 2 -> return tweety
217+ 2 -> return tweety
218+ _ -> throwError err404
220+ getEars :: Either String Integer -> Handler Animal
221+ getEars (Left e) = return chimera -- ignore integer parse error, return weird animal
222+ getEars (Right 2) = return jerry
223+ getEars (Right _) = throwError err404
225+ getEyes :: Integer -> Handler Animal
226+ getEyes 2 = return jerry
213− _ -> throwError err404
227+ getEyes _ = throwError err404
215captureSpec :: Spec
229captureSpec :: Spec
216captureSpec = do
230captureSpec = do
@@ -224,6 +238,17 @@ captureSpec = do
224 it "returns 400 if the decoding fails" $ do
238 it "returns 400 if the decoding fails" $ do
225 get "/notAnInt" `shouldRespondWith` 400
239 get "/notAnInt" `shouldRespondWith` 400
241+ it "returns an animal if eyes or ears are 2" $ do
242+ get "/ears/2" `shouldRespondWith` 200
243+ get "/eyes/2" `shouldRespondWith` 200
245+ it "returns a weird animal on Lenient Capture" $ do
246+ response <- get "/ears/bla"
247+ liftIO $ decode' (simpleBody response) `shouldBe` Just chimera
249+ it "returns 400 if parsing integer fails on Strict Capture" $ do
250+ get "/eyes/bla" `shouldRespondWith` 400
227 with (return (serve
252 with (return (serve
228 (Proxy :: Proxy (Capture "captured" String :> Raw))
253 (Proxy :: Proxy (Capture "captured" String :> Raw))
229 (\ "captured" -> Tagged $ \request_ respond ->
254 (\ "captured" -> Tagged $ \request_ respond ->
@@ -780,6 +805,10 @@ jerry = Animal "Mouse" 4
780tweety :: Animal
805tweety :: Animal
781tweety = Animal "Bird" 2
806tweety = Animal "Bird" 2
808+-- weird animal with non-integer amount of ears
810+chimera = Animal "Chimera" (-1)
783beholder :: Animal
812beholder :: Animal
784beholder = Animal "Beholder" 0
813beholder = Animal "Beholder" 0