hspec-wai-0.11.1: Experimental Hspec support for testing WAI applications
Safe HaskellSafe-Inferred
LanguageHaskell2010

Test.Hspec.Wai

Description

Have a look at the README for an example of how to use this library.

Synopsis

Types

data WaiSession st a Source #

A WAI test session that carries the Application under test and some client state.

Instances

Instances details
MonadFail (WaiSession st) Source # 
Instance details

Defined in Test.Hspec.Wai.Internal

Methods

fail :: String -> WaiSession st a #

MonadIO (WaiSession st) Source # 
Instance details

Defined in Test.Hspec.Wai.Internal

Methods

liftIO :: IO a -> WaiSession st a #

Applicative (WaiSession st) Source # 
Instance details

Defined in Test.Hspec.Wai.Internal

Methods

pure :: a -> WaiSession st a #

(<*>) :: WaiSession st (a -> b) -> WaiSession st a -> WaiSession st b #

liftA2 :: (a -> b -> c) -> WaiSession st a -> WaiSession st b -> WaiSession st c #

(*>) :: WaiSession st a -> WaiSession st b -> WaiSession st b #

(<*) :: WaiSession st a -> WaiSession st b -> WaiSession st a #

Functor (WaiSession st) Source # 
Instance details

Defined in Test.Hspec.Wai.Internal

Methods

fmap :: (a -> b) -> WaiSession st a -> WaiSession st b #

(<$) :: a -> WaiSession st b -> WaiSession st a #

Monad (WaiSession st) Source # 
Instance details

Defined in Test.Hspec.Wai.Internal

Methods

(>>=) :: WaiSession st a -> (a -> WaiSession st b) -> WaiSession st b #

(>>) :: WaiSession st a -> WaiSession st b -> WaiSession st b #

return :: a -> WaiSession st a #

Example (WaiExpectation st) Source # 
Instance details

Defined in Test.Hspec.Wai.Internal

Associated Types

type Arg (WaiExpectation st) Source #

Testable (WaiExpectation st) Source # 
Instance details

Defined in Test.Hspec.Wai.QuickCheck

Associated Types

type State (WaiExpectation st) Source #

type Arg (WaiExpectation st) Source # 
Instance details

Defined in Test.Hspec.Wai.Internal

type Arg (WaiExpectation st) = (st, Application)
type State (WaiExpectation st) Source # 
Instance details

Defined in Test.Hspec.Wai.QuickCheck

type State (WaiExpectation st) = st

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 additional Header 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 MatchHeader Source #

Constructors

MatchHeader ([Header] -> Body -> Maybe String) 

data MatchBody Source #

Constructors

MatchBody ([Header] -> Body -> Maybe String) 

Instances

Instances details
IsString MatchBody Source # 
Instance details

Defined in Test.Hspec.Wai.Matcher

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

Expand
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 liftIO, we would have ended up with this error:

• 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 IO a and returns an (m a): liftIO, enabling us to run the program and see the expected results:

> evalStateT printState "hello"
"hello"

> evalStateT printState 3
3

pending :: WaiSession st () Source #

A lifted version of pending.

pendingWith :: String -> WaiSession st () Source #

A lifted version of pendingWith.