Skip to content

Commit a4e5707

Browse files
committed
add test
1 parent 966ebe0 commit a4e5707

File tree

1 file changed

+36
-7
lines changed

1 file changed

+36
-7
lines changed

servant-server/test/Servant/ServerSpec.hs

Lines changed: 36 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -46,15 +46,15 @@ import Network.Wai.Test
4646
simpleHeaders, simpleStatus)
4747
import 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,
5353
RemoteHost, ReqBody, SourceIO, StdMethod (..), Stream, Verb,
5454
addHeader)
5555
import Servant.Server
5656
(Context ((:.), EmptyContext), Handler, Server, Tagged (..),
57-
emptyServer, err401, err403, err404, serve, serveWithContext)
57+
emptyServer, err400, err401, err403, err404, serve, serveWithContext)
5858
import Servant.Test.ComprehensiveAPI
5959
import qualified Servant.Types.SourceT as S
6060
import Test.Hspec
@@ -204,13 +204,27 @@ verbSpec = describe "Servant.API.Verb" $ do
204204
------------------------------------------------------------------------------
205205

206206
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
207209
captureApi :: Proxy CaptureApi
208210
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
214228

215229
captureSpec :: Spec
216230
captureSpec = 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
780805
tweety :: Animal
781806
tweety = Animal "Bird" 2
782807

808+
-- weird animal with non-integer amount of ears
809+
chimera :: Animal
810+
chimera = Animal "Chimera" (-1)
811+
783812
beholder :: Animal
784813
beholder = Animal "Beholder" 0
785814
-- }}}

0 commit comments

Comments
 (0)