Safe Haskell | Safe-Inferred |
---|---|
Language | Haskell2010 |
Have a look at the README for an example of how to use this library.
Synopsis
- data WaiSession st a
- type WaiExpectation st = WaiSession st ()
- get :: ByteString -> WaiSession st SResponse
- post :: ByteString -> ByteString -> WaiSession st SResponse
- put :: ByteString -> ByteString -> WaiSession st SResponse
- patch :: ByteString -> ByteString -> WaiSession st SResponse
- options :: ByteString -> WaiSession st SResponse
- delete :: ByteString -> WaiSession st SResponse
- request :: Method -> ByteString -> [Header] -> ByteString -> WaiSession st SResponse
- postHtmlForm :: ByteString -> [(String, String)] -> WaiSession st SResponse
- shouldRespondWith :: HasCallStack => WaiSession st SResponse -> ResponseMatcher -> WaiExpectation st
- data ResponseMatcher = ResponseMatcher {
- matchStatus :: Int
- matchHeaders :: [MatchHeader]
- matchBody :: MatchBody
- data MatchHeader = MatchHeader ([Header] -> Body -> Maybe String)
- data MatchBody = MatchBody ([Header] -> Body -> Maybe String)
- type Body = ByteString
- (<:>) :: HeaderName -> ByteString -> MatchHeader
- liftIO :: MonadIO m => IO a -> m a
- with :: IO Application -> SpecWith ((), Application) -> Spec
- withState :: IO (st, Application) -> SpecWith (st, Application) -> Spec
- getState :: WaiSession st st
- pending :: WaiSession st ()
- pendingWith :: String -> WaiSession st ()
Types
data WaiSession st a Source #
A WAI test
session that carries the Application
under test and some client state.
Instances
type WaiExpectation st = WaiSession st () Source #
An expectation in the WaiSession
monad. Failing expectations are
communicated through exceptions (similar to Expectation
and
Assertion
).
Performing requests
get :: ByteString -> WaiSession st SResponse Source #
Perform a GET
request to the application under test.
post :: ByteString -> ByteString -> WaiSession st SResponse Source #
Perform a POST
request to the application under test.
put :: ByteString -> ByteString -> WaiSession st SResponse Source #
Perform a PUT
request to the application under test.
patch :: ByteString -> ByteString -> WaiSession st SResponse Source #
Perform a PATCH
request to the application under test.
options :: ByteString -> WaiSession st SResponse Source #
Perform an OPTIONS
request to the application under test.
delete :: ByteString -> WaiSession st SResponse Source #
Perform a DELETE
request to the application under test.
request :: Method -> ByteString -> [Header] -> ByteString -> WaiSession st SResponse Source #
Perform a request to the application under test, with specified HTTP method, request path, headers and body.
Posting HTML forms
postHtmlForm :: ByteString -> [(String, String)] -> WaiSession st SResponse Source #
Perform a POST
request to the application under test.
The specified list of key-value pairs is encoded as
application/x-www-form-urlencoded
and used as request body.
In addition the Content-Type
is set to application/x-www-form-urlencoded
.
Matching on the response
shouldRespondWith :: HasCallStack => WaiSession st SResponse -> ResponseMatcher -> WaiExpectation st Source #
Set the expectation that a response matches a specified ResponseMatcher
.
A ResponseMatcher
matches a response if:
- the specified status matches the HTTP response status code
- the specified body (if any) matches the response body
- the response has all of the specified
Header
fields (the response may have arbitrary additionalHeader
fields)
You can use ResponseMatcher
's (broken) Num
instance to match for a HTTP
status code:
get "/" `shouldRespondWith` 200 -- matches if status is 200
You can use ResponseMatcher
's IsString
instance to match for a HTTP
status 200
and a body:
get "/" `shouldRespondWith` "foo" -- matches if body is "foo" and status is 200
If you want to match for a different HTTP status, you can use record update
notation to specify matchStatus
explicitly:
get "/" `shouldRespondWith` "foo" {matchStatus = 404} -- matches if body is "foo" and status is 404
If you want to require a specific header field you can specify
matchHeaders
:
get "/" `shouldRespondWith` "foo" {matchHeaders = ["Content-Type" <:> "text/plain"]} -- matches if body is "foo", status is 200 and there is a header field "Content-Type: text/plain"
data ResponseMatcher Source #
Instances
IsString ResponseMatcher Source # | |
Defined in Test.Hspec.Wai.Matcher fromString :: String -> ResponseMatcher # | |
Num ResponseMatcher Source # | |
Defined in Test.Hspec.Wai.Matcher (+) :: ResponseMatcher -> ResponseMatcher -> ResponseMatcher # (-) :: ResponseMatcher -> ResponseMatcher -> ResponseMatcher # (*) :: ResponseMatcher -> ResponseMatcher -> ResponseMatcher # negate :: ResponseMatcher -> ResponseMatcher # abs :: ResponseMatcher -> ResponseMatcher # signum :: ResponseMatcher -> ResponseMatcher # fromInteger :: Integer -> ResponseMatcher # |
data MatchHeader Source #
MatchHeader ([Header] -> Body -> Maybe String) |
Instances
IsString MatchBody Source # | |
Defined in Test.Hspec.Wai.Matcher fromString :: String -> MatchBody # |
type Body = ByteString Source #
(<:>) :: HeaderName -> ByteString -> MatchHeader Source #
Helpers and re-exports
liftIO :: MonadIO m => IO a -> m a #
Lift a computation from the IO
monad.
This allows us to run IO computations in any monadic stack, so long as it supports these kinds of operations
(i.e. IO
is the base monad for the stack).
Example
import Control.Monad.Trans.State -- from the "transformers" library printState :: Show s => StateT s IO () printState = do state <- get liftIO $ print state
Had we omitted
, we would have ended up with this error:liftIO
• Couldn't match type ‘IO’ with ‘StateT s IO’ Expected type: StateT s IO () Actual type: IO ()
The important part here is the mismatch between StateT s IO ()
and
.IO
()
Luckily, we know of a function that takes an
and returns an IO
a(m a)
:
,
enabling us to run the program and see the expected results:liftIO
> evalStateT printState "hello" "hello" > evalStateT printState 3 3
with :: IO Application -> SpecWith ((), Application) -> Spec Source #
withState :: IO (st, Application) -> SpecWith (st, Application) -> Spec Source #
getState :: WaiSession st st Source #
pending :: WaiSession st () Source #
A lifted version of pending
.
pendingWith :: String -> WaiSession st () Source #
A lifted version of pendingWith
.