freckle-app-1.15.2.0: Haskell application toolkit used at Freckle
Safe HaskellSafe-Inferred
LanguageHaskell2010

Freckle.App.Test.Yesod

Description

Similar to Yesod.Test from the yesod-test package

Actions in the YesodExample monad are generalized to a MonadYesodExample constraint, allowing tests to be written in custom monads more easily.

Synopsis

Monad class

class (MonadIO m, Yesod site) => MonadYesodExample site m | m -> site where Source #

Methods

liftYesodExample :: YesodExample site a -> m a Source #

Instances

Instances details
MonadYesodExample site m => MonadYesodExample site (LoggingT m) Source # 
Instance details

Defined in Freckle.App.Test.Yesod

MonadYesodExample site m => MonadYesodExample site (ResourceT m) Source # 
Instance details

Defined in Freckle.App.Test.Yesod

MonadYesodExample site m => MonadYesodExample site (MaybeT m) Source # 
Instance details

Defined in Freckle.App.Test.Yesod

Methods

liftYesodExample :: YesodExample site a -> MaybeT m a Source #

Yesod site => MonadYesodExample site (YesodExample site) Source # 
Instance details

Defined in Freckle.App.Test.Yesod

MonadYesodExample site m => MonadYesodExample site (ValidateT e m) Source # 
Instance details

Defined in Freckle.App.Test.Yesod

Methods

liftYesodExample :: YesodExample site a -> ValidateT e m a Source #

MonadYesodExample site m => MonadYesodExample site (ExceptT e m) Source # 
Instance details

Defined in Freckle.App.Test.Yesod

Methods

liftYesodExample :: YesodExample site a -> ExceptT e m a Source #

MonadYesodExample site m => MonadYesodExample site (ReaderT r m) Source # 
Instance details

Defined in Freckle.App.Test.Yesod

Methods

liftYesodExample :: YesodExample site a -> ReaderT r m a Source #

MonadYesodExample site m => MonadYesodExample site (StateT s m) Source # 
Instance details

Defined in Freckle.App.Test.Yesod

Methods

liftYesodExample :: YesodExample site a -> StateT s m a Source #

Making requests

Via RequestBuilder

request :: forall m site. MonadYesodExample site m => RequestBuilder site () -> m () Source #

The general interface for performing requests

request takes a RequestBuilder, constructs a request, and executes it.

The RequestBuilder allows you to build up attributes of the request, like the headers, parameters, and URL of the request.

type RequestBuilder site = SIO (RequestBuilderData site) #

The RequestBuilder state monad constructs a URL encoded string of arguments to send with your requests. Some of the functions that run on it use the current response to analyze the forms that the server is expecting to receive.

setMethod :: Method -> RequestBuilder site () #

Sets the HTTP method used by the request.

Examples

Expand
request $ do
  setMethod "POST"
import Network.HTTP.Types.Method
request $ do
  setMethod methodPut

setUrl :: (Yesod site, RedirectUrl site url) => url -> RequestBuilder site () #

Sets the URL used by the request.

Examples

Expand
request $ do
  setUrl HomeR
request $ do
  setUrl ("http://google.com/" :: Text)

setRequestBody :: ByteString -> RequestBuilder site () #

Simple way to set HTTP request body

Examples

Expand
request $ do
  setRequestBody "foobar"
import Data.Aeson
request $ do
  setRequestBody $ encode $ object ["age" .= (1 :: Integer)]

addGetParam :: Text -> Text -> RequestBuilder site () #

Add a parameter with the given name and value to the query string.

Examples

Expand
{-# LANGUAGE OverloadedStrings #-}
request $ do
  addGetParam "key" "value" -- Adds ?key=value to the URL

addPostParam :: Text -> Text -> RequestBuilder site () #

Add a parameter with the given name and value to the request body. This function can be called multiple times to add multiple parameters, and be mixed with calls to addFile.

"Post parameter" is an informal description of what is submitted by making an HTTP POST with an HTML <form>. Like HTML <form>s, yesod-test will default to a Content-Type of application/x-www-form-urlencoded if no files are added, and switch to multipart/form-data if files are added.

Calling this function after using setRequestBody will raise an error.

Examples

Expand
{-# LANGUAGE OverloadedStrings #-}
post $ do
  addPostParam "key" "value"

addRequestHeader :: Header -> RequestBuilder site () #

Adds the given header to the request; see Network.HTTP.Types.Header for creating Headers.

Examples

Expand
import Network.HTTP.Types.Header
request $ do
  addRequestHeader (hUserAgent, "Chrome/41.0.2228.0")

addJsonHeaders :: RequestBuilder site () Source #

Sets both Content-Type and Accept fields to application/json

setLanguage :: BCP47 -> RequestBuilder site () Source #

Set a language for the test Request

This uses a _LANG query parameter since it's a singleton case, just to exercise that machinery.

addAcceptLanguage :: [Text] -> RequestBuilder site () Source #

Set the Accept-Language header to a list of raw values

This allows testing with actual quality-factors, etc.

addFile #

Arguments

:: Text

The parameter name for the file.

-> FilePath

The path to the file.

-> Text

The MIME type of the file, e.g. "image/png".

-> RequestBuilder site () 

Add a file to be posted with the current request.

Adding a file will automatically change your request content-type to be multipart/form-data.

Examples

Expand
request $ do
  addFile "profile_picture" "static/img/picture.png" "img/png"

Other ways

get :: forall url m site. (MonadYesodExample site m, RedirectUrl site url) => url -> m () Source #

Perform a GET request to url

post :: forall url m site. (MonadYesodExample site m, RedirectUrl site url) => url -> m () Source #

Perform a POST request to url

followRedirect Source #

Arguments

:: forall m site. MonadYesodExample site m 
=> m (Either Text Text)

Left with an error message if not a redirect, Right with the redirected URL if it was

Follow a redirect, if the last response was a redirect

Inspecting the response

Getting the body

getRawBody :: forall m site. MonadYesodExample site m => m ByteString Source #

Get the body of the most recent response as a byte string

getCsvBody :: forall a m site. (MonadYesodExample site m, FromNamedRecord a) => m [a] Source #

Get the body of the most recent response and decode it as CSV

getJsonBody :: forall a m site. (MonadYesodExample site m, FromJSON a) => m a Source #

Get the body of the most recent response and decode it as JSON

Dealing with the response

getResponse :: forall m site. MonadYesodExample site m => m (Maybe SResponse) Source #

Get the most recently provided response value, if available

withResponse :: HasCallStack => (SResponse -> YesodExample site a) -> YesodExample site a #

Performs a given action using the last response. Use this to create response-level assertions

data SResponse #

Instances

Instances details
Show SResponse 
Instance details

Defined in Network.Wai.Test

Eq SResponse 
Instance details

Defined in Network.Wai.Test

Assertions

Status

statusIs :: forall m site. (MonadYesodExample site m, HasCallStack) => Int -> m () Source #

Assert the last response status is as expected

If the status code doesn't match, a portion of the body is also printed to aid in debugging.

Header fields

assertHeader Source #

Arguments

:: forall m site. MonadYesodExample site m 
=> CI ByteString

Field name

-> ByteString

Expected field value

-> m () 

Assert the given header key/value pair was returned

assertHeaderContains Source #

Arguments

:: MonadYesodExample site m 
=> CI ByteString

Field name

-> ByteString

Substring that we expect to find anywhere within the field value

-> m () 

Assert that the given header field's value contains some particular byte string within it

assertHeaderSatisfies Source #

Arguments

:: forall m site. MonadYesodExample site m 
=> CI ByteString

Field name

-> String

Some description of the predicate; this is included in the error message if the assertion fails

-> (ByteString -> Bool)

Predicate applied to the field value which is expected to return True

-> m () 

Assert that the given header field's value satisfied some predicate

Body

bodyContains :: forall m site. MonadYesodExample site m => String -> m () Source #

Assert the last response has the given text

The check is performed using the response body in full text form.

Cookies

getRequestCookies :: HasCallStack => RequestBuilder site Cookies #

Returns the Cookies from the most recent request. If a request hasn't been made, an error is raised.

Examples

Expand
request $ do
  cookies <- getRequestCookies
  liftIO $ putStrLn $ "Cookies are: " ++ show cookies

Since 1.4.3.2

testSetCookie :: forall m site. MonadYesodExample site m => SetCookie -> m () Source #

Sets a cookie

testDeleteCookie :: forall m site. MonadYesodExample site m => ByteString -> m () Source #

Deletes the cookie of the given name

testClearCookies :: forall m site. MonadYesodExample site m => m () Source #

Clears the current cookies

Foundational details

data SIO s a #

State + IO

Since: yesod-test-1.6.0

Instances

Instances details
Yesod site => MonadYesodExample site (YesodExample site) Source # 
Instance details

Defined in Freckle.App.Test.Yesod

MonadState s (SIO s) 
Instance details

Defined in Yesod.Test.Internal.SIO

Methods

get :: SIO s s #

put :: s -> SIO s () #

state :: (s -> (a, s)) -> SIO s a #

MonadIO (SIO s) 
Instance details

Defined in Yesod.Test.Internal.SIO

Methods

liftIO :: IO a -> SIO s a #

Applicative (SIO s) 
Instance details

Defined in Yesod.Test.Internal.SIO

Methods

pure :: a -> SIO s a #

(<*>) :: SIO s (a -> b) -> SIO s a -> SIO s b #

liftA2 :: (a -> b -> c) -> SIO s a -> SIO s b -> SIO s c #

(*>) :: SIO s a -> SIO s b -> SIO s b #

(<*) :: SIO s a -> SIO s b -> SIO s a #

Functor (SIO s) 
Instance details

Defined in Yesod.Test.Internal.SIO

Methods

fmap :: (a -> b) -> SIO s a -> SIO s b #

(<$) :: a -> SIO s b -> SIO s a #

Monad (SIO s) 
Instance details

Defined in Yesod.Test.Internal.SIO

Methods

(>>=) :: SIO s a -> (a -> SIO s b) -> SIO s b #

(>>) :: SIO s a -> SIO s b -> SIO s b #

return :: a -> SIO s a #

MonadThrow (SIO s) 
Instance details

Defined in Yesod.Test.Internal.SIO

Methods

throwM :: (HasCallStack, Exception e) => e -> SIO s a #

MonadUnliftIO (SIO s) 
Instance details

Defined in Yesod.Test.Internal.SIO

Methods

withRunInIO :: ((forall a. SIO s a -> IO a) -> IO b) -> SIO s b #

YesodDispatch site => Example (SIO (YesodExampleData site) a) 
Instance details

Defined in Yesod.Test

Associated Types

type Arg (SIO (YesodExampleData site) a) #

type Arg (SIO (YesodExampleData site) a) 
Instance details

Defined in Yesod.Test

type Arg (SIO (YesodExampleData site) a) = TestApp site

type TestApp site = (site, Middleware) #

type YesodExample site = SIO (YesodExampleData site) #

A single test case, to be run with yit.

Since 1.2.0

data YesodExampleData site #

The state used in a single test case defined using yit

Since 1.2.4

Constructors

YesodExampleData 

Fields

Instances

Instances details
Yesod site => MonadYesodExample site (YesodExample site) Source # 
Instance details

Defined in Freckle.App.Test.Yesod

YesodDispatch site => Example (SIO (YesodExampleData site) a) 
Instance details

Defined in Yesod.Test

Associated Types

type Arg (SIO (YesodExampleData site) a) #

type Arg (SIO (YesodExampleData site) a) 
Instance details

Defined in Yesod.Test

type Arg (SIO (YesodExampleData site) a) = TestApp site

getTestYesod :: forall m site. MonadYesodExample site m => m site Source #

Get the foundation value used for the current test