@@ -46,15 +46,15 @@ import Network.Wai.Test
46
46
simpleHeaders , simpleStatus )
47
47
import Servant.API
48
48
((:<|>) (.. ), (:>) , AuthProtect , BasicAuth ,
49
- BasicAuthData (BasicAuthData ), Capture , CaptureAll , Delete ,
49
+ BasicAuthData (BasicAuthData ), Capture , Capture' , CaptureAll , Lenient , Strict , Delete ,
50
50
EmptyAPI , Get , Header , Headers , HttpVersion , IsSecure (.. ),
51
51
JSON , NoContent (.. ), NoFraming , OctetStream , Patch ,
52
52
PlainText , Post , Put , QueryFlag , QueryParam , QueryParams , Raw ,
53
53
RemoteHost , ReqBody , SourceIO , StdMethod (.. ), Stream , Verb ,
54
54
addHeader )
55
55
import Servant.Server
56
56
(Context ((:.) , EmptyContext ), Handler , Server , Tagged (.. ),
57
- emptyServer , err401 , err403 , err404 , serve , serveWithContext )
57
+ emptyServer , err400 , err401 , err403 , err404 , serve , serveWithContext )
58
58
import Servant.Test.ComprehensiveAPI
59
59
import qualified Servant.Types.SourceT as S
60
60
import Test.Hspec
@@ -204,13 +204,27 @@ verbSpec = describe "Servant.API.Verb" $ do
204
204
------------------------------------------------------------------------------
205
205
206
206
type 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
207
209
captureApi :: Proxy CaptureApi
208
210
captureApi = 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
214
228
215
229
captureSpec :: Spec
216
230
captureSpec = do
@@ -224,6 +238,17 @@ captureSpec = do
224
238
it " returns 400 if the decoding fails" $ do
225
239
get " /notAnInt" `shouldRespondWith` 400
226
240
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
+
227
252
with (return (serve
228
253
(Proxy :: Proxy (Capture " captured" String :> Raw ))
229
254
(\ " captured" -> Tagged $ \ request_ respond ->
@@ -780,6 +805,10 @@ jerry = Animal "Mouse" 4
780
805
tweety :: Animal
781
806
tweety = Animal " Bird" 2
782
807
808
+ -- weird animal with non-integer amount of ears
809
+ chimera :: Animal
810
+ chimera = Animal " Chimera" (- 1 )
811
+
783
812
beholder :: Animal
784
813
beholder = Animal " Beholder" 0
785
814
-- }}}
0 commit comments