@@ -46,7 +46,7 @@ import Network.Wai.Test
4646 simpleHeaders, simpleStatus)
4747import Servant.API
4848 ((:<|>) (..), (:>), AuthProtect, BasicAuth,
49− BasicAuthData (BasicAuthData), Capture, CaptureAll, Delete,
49+ BasicAuthData (BasicAuthData), Capture, Capture', CaptureAll, Lenient, Strict, Delete,
5050 EmptyAPI, Get, Header, Headers, HttpVersion, IsSecure (..),
5151 JSON, NoContent (..), NoFraming, OctetStream, Patch,
5252 PlainText, Post, Put, QueryFlag, QueryParam, QueryParams, Raw,
@@ -54,7 +54,7 @@ import Servant.API
5454 addHeader)
5555import Servant.Server
5656 (Context ((:.), EmptyContext), Handler, Server, Tagged (..),
57− emptyServer, err401, err403, err404, serve, serveWithContext)
57+ emptyServer, err400, err401, err403, err404, serve, serveWithContext)
5858import Servant.Test.ComprehensiveAPI
5959import qualified Servant.Types.SourceT as S
6060import Test.Hspec
@@ -204,13 +204,27 @@ verbSpec = describe "Servant.API.Verb" $ do
204204------------------------------------------------------------------------------
205205
206206type 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
207209captureApi :: Proxy CaptureApi
208210captureApi = Proxy
209−captureServer :: Integer -> Handler Animal
210−captureServer legs = case legs of
211− 4 -> return jerry
212− 2 -> return tweety
213− _ -> throwError err404
211+
212+captureServer :: Server CaptureApi
213+captureServer = getLegs :<|> getEars :<|> getEyes
214+ where getLegs :: Integer -> Handler Animal
215+ getLegs legs = case legs of
216+ 4 -> return jerry
217+ 2 -> return tweety
218+ _ -> throwError err404
219+
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
224+
225+ getEyes :: Integer -> Handler Animal
226+ getEyes 2 = return jerry
227+ getEyes _ = throwError err404
214228
215229captureSpec :: Spec
216230captureSpec = do
@@ -224,6 +238,17 @@ captureSpec = do
224238 it "returns 400 if the decoding fails" $ do
225239 get "/notAnInt" `shouldRespondWith` 400
226240
241+ it "returns an animal if eyes or ears are 2" $ do
242+ get "/ears/2" `shouldRespondWith` 200
243+ get "/eyes/2" `shouldRespondWith` 200
244+
245+ it "returns a weird animal on Lenient Capture" $ do
246+ response <- get "/ears/bla"
247+ liftIO $ decode' (simpleBody response) `shouldBe` Just chimera
248+
249+ it "returns 400 if parsing integer fails on Strict Capture" $ do
250+ get "/eyes/bla" `shouldRespondWith` 400
251+
227252 with (return (serve
228253 (Proxy :: Proxy (Capture "captured" String :> Raw))
229254 (\ "captured" -> Tagged $ \request_ respond ->
@@ -780,6 +805,10 @@ jerry = Animal "Mouse" 4
780805tweety :: Animal
781806tweety = Animal "Bird" 2
782807
808+-- weird animal with non-integer amount of ears
809+chimera :: Animal
810+chimera = Animal "Chimera" (-1)
811+
783812beholder :: Animal
784813beholder = Animal "Beholder" 0
785814-- }}}