Safe Haskell | None |
---|---|
Language | GHC2021 |
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
- class (MonadIO m, Yesod site) => MonadYesodExample site (m :: Type -> Type) | m -> site where
- liftYesodExample :: YesodExample site a -> m a
- request :: forall m site. MonadYesodExample site m => RequestBuilder site () -> m ()
- type RequestBuilder site = SIO (RequestBuilderData site)
- setMethod :: Method -> RequestBuilder site ()
- setUrl :: (Yesod site, RedirectUrl site url) => url -> RequestBuilder site ()
- setRequestBody :: ByteString -> RequestBuilder site ()
- addGetParam :: Text -> Text -> RequestBuilder site ()
- addPostParam :: Text -> Text -> RequestBuilder site ()
- addRequestHeader :: Header -> RequestBuilder site ()
- addJsonHeaders :: RequestBuilder site ()
- setLanguage :: BCP47 -> RequestBuilder site ()
- addAcceptLanguage :: [Text] -> RequestBuilder site ()
- addFile :: Text -> FilePath -> Text -> RequestBuilder site ()
- get :: forall url m site. (MonadYesodExample site m, RedirectUrl site url) => url -> m ()
- post :: forall url m site. (MonadYesodExample site m, RedirectUrl site url) => url -> m ()
- followRedirect :: forall m site. MonadYesodExample site m => m (Either Text Text)
- getRawBody :: forall m site. (MonadYesodExample site m, HasCallStack) => m ByteString
- getCsvBody :: forall a m site. (MonadYesodExample site m, FromNamedRecord a, HasCallStack) => m [a]
- getJsonBody :: forall a m site. (MonadYesodExample site m, FromJSON a, HasCallStack) => m a
- getResponse :: forall m site. MonadYesodExample site m => m (Maybe SResponse)
- withResponse :: HasCallStack => (SResponse -> YesodExample site a) -> YesodExample site a
- data SResponse = SResponse {}
- statusIs :: forall m site. (MonadYesodExample site m, HasCallStack) => Int -> m ()
- assertHeader :: forall m site. MonadYesodExample site m => CI ByteString -> ByteString -> m ()
- assertHeaderContains :: MonadYesodExample site m => CI ByteString -> ByteString -> m ()
- assertHeaderSatisfies :: forall m site. MonadYesodExample site m => CI ByteString -> String -> (ByteString -> Bool) -> m ()
- bodyContains :: forall m site. MonadYesodExample site m => String -> m ()
- getRequestCookies :: HasCallStack => RequestBuilder site Cookies
- testSetCookie :: forall m site. MonadYesodExample site m => SetCookie -> m ()
- testDeleteCookie :: forall m site. MonadYesodExample site m => ByteString -> m ()
- testClearCookies :: forall m site. MonadYesodExample site m => m ()
- data SIO s a
- type TestApp site = (site, Middleware)
- type YesodExample site = SIO (YesodExampleData site)
- data YesodExampleData site = YesodExampleData {
- yedApp :: !Application
- yedSite :: !site
- yedCookies :: !Cookies
- yedResponse :: !(Maybe SResponse)
- getTestYesod :: forall m site. MonadYesodExample site m => m site
Monad class
class (MonadIO m, Yesod site) => MonadYesodExample site (m :: Type -> Type) | m -> site where Source #
Methods
liftYesodExample :: YesodExample site a -> m a Source #
Instances
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
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
request $ do setUrl HomeR
request $ do setUrl ("http://google.com/" :: Text)
setRequestBody :: ByteString -> RequestBuilder site () #
Simple way to set HTTP request body
Examples
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
{-# 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
{-# 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 Header
s.
Examples
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.
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
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
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, HasCallStack) => 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, HasCallStack) => 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, HasCallStack) => 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
Constructors
SResponse | |
Fields |
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
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
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 |
-> 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
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
State + IO
Since: yesod-test-1.6.0
Instances
Yesod site => MonadYesodExample site (YesodExample site) Source # | |||||
Defined in Freckle.App.Test.Yesod Methods liftYesodExample :: YesodExample site a -> YesodExample site a Source # | |||||
MonadState s (SIO s) | |||||
MonadIO (SIO s) | |||||
Defined in Yesod.Test.Internal.SIO | |||||
Applicative (SIO s) | |||||
Functor (SIO s) | |||||
Monad (SIO s) | |||||
MonadThrow (SIO s) | |||||
Defined in Yesod.Test.Internal.SIO Methods throwM :: (HasCallStack, Exception e) => e -> SIO s a # | |||||
MonadUnliftIO (SIO s) | |||||
Defined in Yesod.Test.Internal.SIO | |||||
YesodDispatch site => Example (SIO (YesodExampleData site) a) | |||||
Defined in Yesod.Test Associated Types
Methods evaluateExample :: SIO (YesodExampleData site) a -> Params -> (ActionWith (Arg (SIO (YesodExampleData site) a)) -> IO ()) -> ProgressCallback -> IO Result # | |||||
type Arg (SIO (YesodExampleData site) a) | |||||
Defined in Yesod.Test |
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
Yesod site => MonadYesodExample site (YesodExample site) Source # | |||||
Defined in Freckle.App.Test.Yesod Methods liftYesodExample :: YesodExample site a -> YesodExample site a Source # | |||||
YesodDispatch site => Example (SIO (YesodExampleData site) a) | |||||
Defined in Yesod.Test Associated Types
Methods evaluateExample :: SIO (YesodExampleData site) a -> Params -> (ActionWith (Arg (SIO (YesodExampleData site) a)) -> IO ()) -> ProgressCallback -> IO Result # | |||||
type Arg (SIO (YesodExampleData site) a) | |||||
Defined in Yesod.Test |
getTestYesod :: forall m site. MonadYesodExample site m => m site Source #
Get the foundation value used for the current test