-- Hoogle documentation, generated by Haddock
-- See Hoogle, http://www.haskell.org/hoogle/

-- | integration testing for WAI/Yesod Applications
--   
--   API docs and the README are available at
--   http://www.stackage.org/package/yesod-test
@package yesod-test
@version 1.6.19

-- | Parsing CSS selectors into queries.
module Yesod.Test.CssQuery
data SelectorGroup
DirectChildren :: [Selector] -> SelectorGroup
DeepChildren :: [Selector] -> SelectorGroup
data Selector
ById :: Text -> Selector
ByClass :: Text -> Selector
ByTagName :: Text -> Selector
ByAttrExists :: Text -> Selector
ByAttrEquals :: Text -> Text -> Selector
ByAttrContains :: Text -> Text -> Selector
ByAttrStarts :: Text -> Text -> Selector
ByAttrEnds :: Text -> Text -> Selector

-- | Parses a query into an intermediate format which is easy to feed to
--   HXT
--   
--   
--   
- The top-level lists represent the top level comma separated
--   queries.
--   
- SelectorGroup is a group of qualifiers which are separated with
--   spaces or > like these three: table.main.odd tr.even >
--   td.big
--   
- A SelectorGroup as a list of Selector items, following the above
--   example the selectors in the group are: table, .main and
--   .odd
--   
parseQuery :: Text -> Either String [[SelectorGroup]]
instance GHC.Classes.Eq Yesod.Test.CssQuery.Selector
instance GHC.Classes.Eq Yesod.Test.CssQuery.SelectorGroup
instance GHC.Internal.Show.Show Yesod.Test.CssQuery.Selector
instance GHC.Internal.Show.Show Yesod.Test.CssQuery.SelectorGroup

-- | This module exposes functions that are used internally by yesod-test.
--   The functions exposed here are _not_ a stable API—they may be changed
--   or removed without any major version bump.
--   
--   That said, you may find them useful if your application can accept API
--   breakage.
module Yesod.Test.Internal

-- | Helper function to get the first 1024 characters of the body, assuming
--   it is UTF-8. This function is used to preview the body in case of an
--   assertion failure.
getBodyTextPreview :: ByteString -> Text

-- | Helper function to determine if we can print a body as plain text, for
--   debugging purposes.
contentTypeHeaderIsUtf8 :: ByteString -> Bool

-- | List of Content-Types that are assumed to be UTF-8 (e.g. JSON).
assumedUTF8ContentTypes :: Set ByteString

-- | The SIO type is used by Yesod.Test to provide
--   exception-safe environment between requests and assertions.
--   
--   This module is internal. Breaking changes to this module will not be
--   reflected in the major version of this package.
module Yesod.Test.Internal.SIO

-- | State + IO
newtype SIO s a
SIO :: ReaderT (IORef s) IO a -> SIO s a

-- | Retrieve the current state in the SIO type.
--   
--   Equivalent to get
getSIO :: SIO s s

-- | Put the given s into the SIO state for later
--   retrieval.
--   
--   Equivalent to put, but the value is evaluated to weak head
--   normal form.
putSIO :: s -> SIO s ()

-- | Modify the underlying s state.
--   
--   This is strict in the function used, and is equivalent to
--   modify'.
modifySIO :: (s -> s) -> SIO s ()

-- | Run an SIO action with the intial state s provided,
--   returning the result, and discard the final state.
evalSIO :: SIO s a -> s -> IO a

-- | Run an SIO action with the initial state s provided,
--   returning the final state, and discarding the result.
execSIO :: SIO s () -> s -> IO s

-- | Run an SIO action with the initial state provided, returning
--   both the result of the computation as well as the final state.
runSIO :: SIO s a -> s -> IO (s, a)
instance GHC.Internal.Base.Applicative (Yesod.Test.Internal.SIO.SIO s)
instance GHC.Internal.Base.Functor (Yesod.Test.Internal.SIO.SIO s)
instance Control.Monad.IO.Class.MonadIO (Yesod.Test.Internal.SIO.SIO s)
instance GHC.Internal.Base.Monad (Yesod.Test.Internal.SIO.SIO s)
instance Control.Monad.State.Class.MonadState s (Yesod.Test.Internal.SIO.SIO s)
instance Control.Monad.Catch.MonadThrow (Yesod.Test.Internal.SIO.SIO s)
instance Control.Monad.IO.Unlift.MonadUnliftIO (Yesod.Test.Internal.SIO.SIO s)

-- | This module uses HXT to transverse an HTML document using CSS
--   selectors.
--   
--   The most important function here is findBySelector, it takes a
--   CSS query and a string containing the HTML to look into, and it
--   returns a list of the HTML fragments that matched the given query.
--   
--   Only a subset of the CSS spec is currently supported:
--   
--   
--   
- By tag name: table td a
--   
- By class names: .container .content
--   
- By Id: #oneId
--   
- By attribute: [hasIt], [exact=match],
--   [contains*=text], [starts^=with],
--   [ends$=with]
--   
- Union: a, span, p
--   
- Immediate children: div > p
--   
- Get jiggy with it: div[data-attr=yeah] > .mon, .foo.bar div,
--   #oneThing
--   
module Yesod.Test.TransversingCSS

-- | Perform a css Query on Html. Returns Either
--   
--   
--   
- Left: Query parse error.
--   
- Right: List of matching Html fragments.
--   
findBySelector :: HtmlLBS -> Query -> Either String [String]

-- | Perform a css Query on Html. Returns Either
--   
--   
--   
- Left: Query parse error.
--   
- Right: List of matching Cursors
--   
findAttributeBySelector :: HtmlLBS -> Query -> Text -> Either String [[Text]]
type HtmlLBS = ByteString
type Query = Text

-- | Parses a query into an intermediate format which is easy to feed to
--   HXT
--   
--   
--   
- The top-level lists represent the top level comma separated
--   queries.
--   
- SelectorGroup is a group of qualifiers which are separated with
--   spaces or > like these three: table.main.odd tr.even >
--   td.big
--   
- A SelectorGroup as a list of Selector items, following the above
--   example the selectors in the group are: table, .main and
--   .odd
--   
parseQuery :: Text -> Either String [[SelectorGroup]]
runQuery :: Cursor -> [[SelectorGroup]] -> [Cursor]
data Selector
ById :: Text -> Selector
ByClass :: Text -> Selector
ByTagName :: Text -> Selector
ByAttrExists :: Text -> Selector
ByAttrEquals :: Text -> Text -> Selector
ByAttrContains :: Text -> Text -> Selector
ByAttrStarts :: Text -> Text -> Selector
ByAttrEnds :: Text -> Text -> Selector
data SelectorGroup
DirectChildren :: [Selector] -> SelectorGroup
DeepChildren :: [Selector] -> SelectorGroup

-- | Yesod.Test is a pragmatic framework for testing web applications built
--   using wai.
--   
--   By pragmatic I may also mean dirty. Its main goal is to
--   encourage integration and system testing of web applications by making
--   everything easy to test.
--   
--   Your tests are like browser sessions that keep track of cookies and
--   the last visited page. You can perform assertions on the content of
--   HTML responses, using CSS selectors to explore the document more
--   easily.
--   
--   You can also easily build requests using forms present in the current
--   page. This is very useful for testing web applications built in yesod,
--   for example, where your forms may have field names generated by the
--   framework or a randomly generated CSRF token input.
--   
--   
Example project
--   
--   The best way to see an example project using yesod-test is to create a
--   scaffolded Yesod project:
--   
--   
--   stack new projectname yesod-sqlite
--   
--   
--   (See
--   https://github.com/commercialhaskell/stack-templates/wiki#yesod
--   for the full list of Yesod templates)
--   
--   The scaffolded project makes your database directly available in
--   tests, so you can use runDB to set up backend pre-conditions,
--   or to assert that your session is having the desired effect. It also
--   handles wiping your database between each test.
--   
--   
Example code
--   
--   The code below should give you a high-level idea of yesod-test's
--   capabilities. Note that it uses helper functions like withApp
--   and runDB from the scaffolded project; these aren't provided
--   by yesod-test.
--   
--   
--   spec :: Spec
--   spec = withApp $ do
--     describe "Homepage" $ do
--       it "loads the homepage with a valid status code" $ do
--         get HomeR
--         statusIs 200
--     describe "Login Form" $ do
--       it "Only allows dashboard access after logging in" $ do
--         get DashboardR
--         statusIs 401
--   
--         get HomeR
--         -- Assert a <p> tag exists on the page
--         htmlAnyContain "p" "Login"
--   
--         -- yesod-test provides a RequestBuilder monad for building up HTTP requests
--         request $ do
--           -- Lookup the HTML <label> with the text Username, and set a POST parameter for that field with the value Felipe
--           byLabelExact "Username" "Felipe"
--           byLabelExact "Password" "pass"
--           setMethod "POST"
--           setUrl SignupR
--         statusIs 200
--   
--         -- The previous request will have stored a session cookie, so we can access the dashboard now
--         get DashboardR
--         statusIs 200
--   
--         -- Assert a user with the name Felipe was added to the database
--         [Entity userId user] <- runDB $ selectList [] []
--         assertEq "A single user named Felipe is created" (userUsername user) "Felipe"
--     describe "JSON" $ do
--       it "Can make requests using JSON, and parse JSON responses" $ do
--         -- Precondition: Create a user with the name "George"
--         runDB $ insert_ $ User "George" "pass"
--   
--         request $ do
--           -- Use the Aeson library to send JSON to the server
--           setRequestBody (encode $ LoginRequest "George" "pass")
--           addRequestHeader ("Accept", "application/json")
--           addRequestHeader ("Content-Type", "application/json")
--           setUrl LoginR
--         statusIs 200
--   
--         -- Parse the request's response as JSON
--         (signupResponse :: SignupResponse) <- requireJSONResponse
--   
--   
--   
HUnit / HSpec integration
--   
--   yesod-test is built on top of hspec, which is itself built on top of
--   HUnit. You can use existing assertion functions from those libraries,
--   but you'll need to use liftIO with them:
--   
--   
--   liftIO $ actualTimesCalled `shouldBe' expectedTimesCalled -- hspec assertion
--   
--   
--   
--   liftIO $ assertBool "a is greater than b" (a > b) -- HUnit assertion
--   
--   
--   yesod-test provides a handful of assertion functions that are already
--   lifted, such as assertEq, as well.
module Yesod.Test
yesodSpec :: YesodDispatch site => site -> YesodSpec site -> Spec

-- | Corresponds to hspec's Spec.
--   
--   Since 1.2.0
type YesodSpec site = Writer [YesodSpecTree site] ()

-- | Same as yesodSpec, but instead of taking already built site it takes
--   an action which produces site for each test.
yesodSpecWithSiteGenerator :: YesodDispatch site => IO site -> YesodSpec site -> Spec

-- | Same as yesodSpecWithSiteGenerator, but also takes an argument to
--   build the site and makes that argument available to the tests.
yesodSpecWithSiteGeneratorAndArgument :: YesodDispatch site => (a -> IO site) -> YesodSpec site -> SpecWith a

-- | Same as yesodSpec, but instead of taking a site it takes an action
--   which produces the Application for each test. This lets you use
--   your middleware from makeApplication
yesodSpecApp :: YesodDispatch site => site -> IO Application -> YesodSpec site -> Spec

-- | A single test case, to be run with yit.
--   
--   Since 1.2.0
type YesodExample site = SIO YesodExampleData site

-- | The state used in a single test case defined using yit
--   
--   Since 1.2.4
data YesodExampleData site
YesodExampleData :: !Application -> !site -> !Cookies -> !Maybe SResponse -> YesodExampleData site
[yedApp] :: YesodExampleData site -> !Application
[yedSite] :: YesodExampleData site -> !site
[yedCookies] :: YesodExampleData site -> !Cookies
[yedResponse] :: YesodExampleData site -> !Maybe SResponse
type TestApp site = (site, Middleware)
type YSpec site = SpecWith TestApp site
testApp :: site -> Middleware -> TestApp site

-- | Internal data structure, corresponding to hspec's SpecTree.
--   
--   Since 1.2.0
data YesodSpecTree site
YesodSpecGroup :: String -> [YesodSpecTree site] -> YesodSpecTree site
YesodSpecItem :: String -> YesodExample site () -> YesodSpecTree site

-- | Start describing a Tests suite keeping cookies and a reference to the
--   tested Application and ConnectionPool
ydescribe :: String -> YesodSpec site -> YesodSpec site

-- | Describe a single test that keeps cookies, and a reference to the last
--   response.
yit :: String -> YesodExample site () -> YesodSpec site

-- | Modifies the site (yedSite) of the test, and creates a new WAI
--   app (yedApp) for it.
--   
--   yesod-test allows sending requests to your application to test that it
--   handles them correctly. In rare cases, you may wish to modify that
--   application in the middle of a test. This may be useful if you wish
--   to, for example, test your application under a certain configuration,
--   then change that configuration to see if your app responds
--   differently.
--   
--   
Examples
--   
--   
--   post SendEmailR
--   -- Assert email not created in database
--   testModifySite (\site -> pure (site { siteSettingsStoreEmail = True }, id))
--   post SendEmailR
--   -- Assert email created in database
--   
--   
--   
--   testModifySite (\site -> do
--     middleware <- makeLogware site
--     pure (site { appRedisConnection = Nothing }, middleware)
--   )
--   
testModifySite :: YesodDispatch site => (site -> IO (site, Middleware)) -> YesodExample site ()

-- | Sets a cookie
--   
--   
Examples
--   
--   
--   import qualified Web.Cookie as Cookie
--   :set -XOverloadedStrings
--   testSetCookie Cookie.defaultSetCookie { Cookie.setCookieName = "name" }
--   
testSetCookie :: SetCookie -> YesodExample site ()

-- | Deletes the cookie of the given name
--   
--   
Examples
--   
--   
--   :set -XOverloadedStrings
--   testDeleteCookie "name"
--   
testDeleteCookie :: ByteString -> YesodExample site ()

-- | Modify the current cookies with the given mapping function
testModifyCookies :: (Cookies -> Cookies) -> YesodExample site ()

-- | Clears the current cookies
testClearCookies :: YesodExample site ()

-- | Perform a GET request to url.
--   
--   
Examples
--   
--   
--   get HomeR
--   
--   
--   
--   get ("http://google.com" :: Text)
--   
get :: (Yesod site, RedirectUrl site url) => url -> YesodExample site ()

-- | Perform a POST request to url.
--   
--   
Examples
--   
--   
--   post HomeR
--   
post :: (Yesod site, RedirectUrl site url) => url -> YesodExample site ()

-- | Perform a POST request to url with the given body.
--   
--   
Examples
--   
--   
--   postBody HomeR "foobar"
--   
--   
--   
--   import Data.Aeson
--   postBody HomeR (encode $ object ["age" .= (1 :: Integer)])
--   
postBody :: (Yesod site, RedirectUrl site url) => url -> ByteString -> YesodExample site ()

-- | Perform a request using a given method to url.
--   
--   
Examples
--   
--   
--   performMethod "DELETE" HomeR
--   
performMethod :: (Yesod site, RedirectUrl site url) => ByteString -> url -> YesodExample site ()

-- | Follow a redirect, if the last response was a redirect. (We consider a
--   request a redirect if the status is 301, 302, 303, 307 or 308, and the
--   Location header is set.)
--   
--   
Examples
--   
--   
--   get HomeR
--   followRedirect
--   
followRedirect :: Yesod site => YesodExample site (Either Text Text)

-- | Parse the Location header of the last response.
--   
--   
Examples
--   
--   
--   post ResourcesR
--   (Right (ResourceR resourceId)) <- getLocation
--   
getLocation :: ParseRoute site => YesodExample site (Either Text (Route site))

-- | 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.
--   
--   
Examples
--   
--   
--   request $ do
--     addToken
--     byLabel "First Name" "Felipe"
--     setMethod "PUT"
--     setUrl NameR
--   
request :: RequestBuilder site () -> YesodExample site ()

-- | Adds the given header to the request; see
--   Network.HTTP.Types.Header for creating Headers.
--   
--   
Examples
--   
--   
--   import Network.HTTP.Types.Header
--   request $ do
--     addRequestHeader (hUserAgent, "Chrome/41.0.2228.0")
--   
addRequestHeader :: Header -> RequestBuilder site ()

-- | Adds a header for HTTP Basic Authentication to the request
--   
--   
Examples
--   
--   
--   request $ do
--     addBasicAuthHeader "Aladdin" "OpenSesame"
--   
addBasicAuthHeader :: CI ByteString -> CI ByteString -> RequestBuilder site ()

-- | Sets the HTTP method used by the request.
--   
--   
Examples
--   
--   
--   request $ do
--     setMethod "POST"
--   
--   
--   
--   import Network.HTTP.Types.Method
--   request $ do
--     setMethod methodPut
--   
setMethod :: Method -> 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"
--   
addPostParam :: 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
--   
addGetParam :: Text -> Text -> RequestBuilder site ()

-- | Add a bare parameter with the given name and no value to the query
--   string. The parameter is added without an = sign.
--   
--   You can specify the entire query string literally by adding a single
--   bare parameter and no other parameters.
--   
--   
Examples
--   
--   
--   {-# LANGUAGE OverloadedStrings #-}
--   request $ do
--     addBareGetParam "key" -- Adds ?key to the URL
--   
addBareGetParam :: Text -> 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"
--   
addFile :: Text -> FilePath -> Text -> 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)]
--   
setRequestBody :: ByteString -> RequestBuilder 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.
type RequestBuilder site = SIO RequestBuilderData site

-- | State + IO
data SIO s a

-- | Sets the URL used by the request.
--   
--   
Examples
--   
--   
--   request $ do
--     setUrl HomeR
--   
--   
--   
--   request $ do
--     setUrl ("http://google.com/" :: Text)
--   
setUrl :: (Yesod site, RedirectUrl site url) => url -> RequestBuilder site ()

-- | Click on a link defined by a CSS query
--   
--   
 Examples
--   
--   
--   get "/foobar"
--   clickOn "a#idofthelink"
--   
clickOn :: (HasCallStack, Yesod site) => Query -> YesodExample site ()

-- | Finds the <label> with the given value, finds its
--   corresponding <input>, then adds a parameter for that
--   input to the request body.
--   
--   
Examples
--   
--   Given this HTML, we want to submit f1=Michael to the server:
--   
--   
--   <form method="POST">
--     <label for="user">Username</label>
--     <input id="user" name="f1" />
--   </form>
--   
--   
--   You can set this parameter like so:
--   
--   
--   request $ do
--     byLabel "Username" "Michael"
--   
--   
--   This function also supports the implicit label syntax, in which the
--   <input> is nested inside the <label>
--   rather than specified with for:
--   
--   
--   <form method="POST">
--     <label>Username <input name="f1"> </label>
--   </form>
--   
--   
--   Warning: This function looks for any label that contains the provided
--   text. If multiple labels contain that text, this function will throw
--   an error, as in the example below:
--   
--   
--   <form method="POST">
--     <label for="nickname">Nickname</label>
--     <input id="nickname" name="f1" />
--   
--   
--   
--     <label for="nickname2">Nickname2</label>
--     <input id="nickname2" name="f2" />
--   </form>
--   
--   
--   
--   request $ do
--     byLabel "Nickname" "Snoyberger"
--   
--   
--   Then, it throws "More than one label contained" error.
--   
--   Therefore, this function is deprecated. Please consider using
--   byLabelExact, which performs the exact match over the provided
--   text.

-- | Deprecated: This function seems to have multiple bugs (ref:
--   https://github.com/yesodweb/yesod/pull/1459). Use byLabelExact,
--   byLabelContain, byLabelPrefix or byLabelSuffix instead
byLabel :: Text -> Text -> RequestBuilder site ()

-- | Finds the <label> with the given value, finds its
--   corresponding <input>, then adds a parameter for that
--   input to the request body.
--   
--   
Examples
--   
--   Given this HTML, we want to submit f1=Michael to the server:
--   
--   
--   <form method="POST">
--     <label for="user">Username</label>
--     <input id="user" name="f1" />
--   </form>
--   
--   
--   You can set this parameter like so:
--   
--   
--   request $ do
--     byLabel "Username" "Michael"
--   
--   
--   This function also supports the implicit label syntax, in which the
--   <input> is nested inside the <label>
--   rather than specified with for:
--   
--   
--   <form method="POST">
--     <label>Username <input name="f1"> </label>
--   </form>
--   
byLabelExact :: Text -> Text -> RequestBuilder site ()

-- | Contain version of byLabelExact
--   
--   Note: Just like byLabel, this function throws an error if it
--   finds multiple labels
byLabelContain :: Text -> Text -> RequestBuilder site ()

-- | Prefix version of byLabelExact
--   
--   Note: Just like byLabel, this function throws an error if it
--   finds multiple labels
byLabelPrefix :: Text -> Text -> RequestBuilder site ()

-- | Suffix version of byLabelExact
--   
--   Note: Just like byLabel, this function throws an error if it
--   finds multiple labels
byLabelSuffix :: Text -> Text -> RequestBuilder site ()

-- | Note: This function throws an error if it finds multiple labels or if
--   the CSS selector fails to parse, doesn't match any fragment, or
--   matches multiple fragments.
bySelectorLabelContain :: Text -> Text -> Text -> RequestBuilder site ()

-- | Finds the <label> with the given value, finds its
--   corresponding <input>, then adds a file for that input
--   to the request body.
--   
--   
Examples
--   
--   Given this HTML, we want to submit a file with the parameter name
--   f1 to the server:
--   
--   
--   <form method="POST">
--     <label for="imageInput">Please submit an image</label>
--     <input id="imageInput" type="file" name="f1" accept="image/*">
--   </form>
--   
--   
--   You can set this parameter like so:
--   
--   
--   request $ do
--     fileByLabel "Please submit an image" "static/img/picture.png" "img/png"
--   
--   
--   This function also supports the implicit label syntax, in which the
--   <input> is nested inside the <label>
--   rather than specified with for:
--   
--   
--   <form method="POST">
--     <label>Please submit an image <input type="file" name="f1"> </label>
--   </form>
--   
--   
--   Warning: This function has the same issue as byLabel. Please
--   use fileByLabelExact instead.

-- | Deprecated: This function seems to have multiple bugs (ref:
--   https://github.com/yesodweb/yesod/pull/1459). Use
--   fileByLabelExact, fileByLabelContain, fileByLabelPrefix or
--   fileByLabelSuffix instead
fileByLabel :: Text -> FilePath -> Text -> RequestBuilder site ()

-- | Finds the <label> with the given value, finds its
--   corresponding <input>, then adds a file for that input
--   to the request body.
--   
--   
Examples
--   
--   Given this HTML, we want to submit a file with the parameter name
--   f1 to the server:
--   
--   
--   <form method="POST">
--     <label for="imageInput">Please submit an image</label>
--     <input id="imageInput" type="file" name="f1" accept="image/*">
--   </form>
--   
--   
--   You can set this parameter like so:
--   
--   
--   request $ do
--     fileByLabel "Please submit an image" "static/img/picture.png" "img/png"
--   
--   
--   This function also supports the implicit label syntax, in which the
--   <input> is nested inside the <label>
--   rather than specified with for:
--   
--   
--   <form method="POST">
--     <label>Please submit an image <input type="file" name="f1"> </label>
--   </form>
--   
fileByLabelExact :: Text -> FilePath -> Text -> RequestBuilder site ()

-- | Contain version of fileByLabelExact
--   
--   Note: Just like fileByLabel, this function throws an error if
--   it finds multiple labels
fileByLabelContain :: Text -> FilePath -> Text -> RequestBuilder site ()

-- | Prefix version of fileByLabelExact
--   
--   Note: Just like fileByLabel, this function throws an error if
--   it finds multiple labels
fileByLabelPrefix :: Text -> FilePath -> Text -> RequestBuilder site ()

-- | Suffix version of fileByLabelExact
--   
--   Note: Just like fileByLabel, this function throws an error if
--   it finds multiple labels
fileByLabelSuffix :: Text -> FilePath -> Text -> RequestBuilder site ()

-- | Finds the <label> with the given value, finds its
--   corresponding <input>, then make this input checked. It
--   is assumed the <input> has type=radio.
--   
--   
Examples
--   
--   Given this HTML, we want to submit f1=2 (i.e. radio button
--   with Blue label) to the server:
--   
--   
--   <form method="POST">
--     <label for="hident2">Color</label>
--     <div id="hident2">
--       <div class="radio">
--         <input id="hident2-none" type="radio" name="f1" value="none" checked>
--         <label for="hident2-none">&lt;None&gt;</label>
--       </div>
--       <div class="radio">
--         <input id="hident2-1" type="radio" name="f1" value="1">
--         <label for="hident2-1">Red</label>
--       </div>
--       <div class="radio">
--         <input id="hident2-2" type="radio" name="f1" value="2">
--         <label for="hident2-2">Blue</label>
--       </div>
--       <div class="radio">
--         <input id="hident2-3" type="radio" name="f1" value="3">
--         <label for="hident2-3">Gray</label>
--       </div>
--       <div class="radio">
--         <input id="hident2-4" type="radio" name="f1" value="4">
--         <label for="hident2-4">Black</label>
--       </div>
--     </div>
--   </form>
--   
--   
--   You can set this parameter like so:
--   
--   
--   request $ do
--     chooseByLabel "Blue"
--   
chooseByLabel :: Text -> RequestBuilder site ()

-- | Finds the <label> with the given value, finds its
--   corresponding <input>, then make this input checked. It
--   is assumed the <input> has type=checkbox.
--   
--   
Examples
--   
--   Given this HTML, we want to submit f1=2 and f1=4
--   (i.e. checked checkboxes are Blue and Black) to the
--   server:
--   
--   
--   <form method="POST">
--     <label for="hident2">Colors</label>
--     <span id="hident2">
--       <input id="hident2-1" type="checkbox" name="f1" value="1">
--       <label for="hident2-1">Red</label>
--       <input id="hident2-2" type="checkbox" name="f1" value="2" checked>
--       <label for="hident2-2">Blue</label>
--       <input id="hident2-3" type="checkbox" name="f1" value="3">
--       <label for="hident2-3">Gray</label>
--       <input id="hident2-4" type="checkbox" name="f1" value="4" checked>
--       <label for="hident2-4">Black</label>
--     </span>
--   </form>
--   
--   
--   You can set this parameter like so:
--   
--   
--   request $ do
--     checkByLabel "Blue"
--     checkByLabel "Black"
--   
checkByLabel :: Text -> RequestBuilder site ()

-- | Finds the <label> with the given value, finds its
--   corresponding <select>, then finds corresponding
--   <option> and make this options selected.
--   
--   
Examples
--   
--   Given this HTML, we want to submit f1=2 (i.e. selected option
--   is Blue) to the server:
--   
--   
--   <form method="post" action="labels-select">
--     <label for="hident2">Selection List</label>
--     <select id="hident2" name="f1">
--       <option value="1">Red</option>
--       <option value="2">Blue</option>
--       <option value="3">Gray</option>
--       <option value="4">Black</option>
--     </select>
--   </form>
--   
--   
--   You can set this parameter like so:
--   
--   
--   request $ do
--     setMethod "POST"
--     selectByLabel "Selection List" "Blue"
--   
selectByLabel :: Text -> Text -> RequestBuilder site ()

-- | For responses that display a single form, just lookup the only CSRF
--   token available.
--   
--   
Examples
--   
--   
--   request $ do
--     addToken
--   
addToken :: HasCallStack => RequestBuilder site ()

-- | Lookups the hidden input named "_token" and adds its value to the
--   params. Receives a CSS selector that should resolve to the form
--   element containing the token.
--   
--   
Examples
--   
--   
--   request $ do
--     addToken_ "#formID"
--   
addToken_ :: HasCallStack => Query -> RequestBuilder site ()

-- | Calls addTokenFromCookieNamedToHeaderNamed with the
--   defaultCsrfCookieName and defaultCsrfHeaderName.
--   
--   Use this function if you're using the CSRF middleware from
--   Yesod.Core and haven't customized the cookie or header name.
--   
--   
Examples
--   
--   
--   request $ do
--     addTokenFromCookie
--   
--   
--   Since 1.4.3.2
addTokenFromCookie :: HasCallStack => RequestBuilder site ()

-- | Looks up the CSRF token stored in the cookie with the given name and
--   adds it to the request headers. An error is thrown if the cookie can't
--   be found.
--   
--   Use this function if you're using the CSRF middleware from
--   Yesod.Core and have customized the cookie or header name.
--   
--   See Yesod.Core.Handler for details on this approach to CSRF
--   protection.
--   
--   
Examples
--   
--   
--   import Data.CaseInsensitive (CI)
--   request $ do
--     addTokenFromCookieNamedToHeaderNamed "cookieName" (CI "headerName")
--   
--   
--   Since 1.4.3.2
addTokenFromCookieNamedToHeaderNamed :: HasCallStack => ByteString -> CI ByteString -> RequestBuilder site ()

-- | Deprecated: Use assertEq instead
assertEqual :: (HasCallStack, Eq a) => String -> a -> a -> YesodExample site ()

-- | Asserts that the two given values are not equal.
--   
--   In case they are equal, the error message includes the values.
assertNotEq :: (HasCallStack, Eq a, Show a) => String -> a -> a -> YesodExample site ()

-- | Asserts that the two given values are equal.
assertEqualNoShow :: (HasCallStack, Eq a) => String -> a -> a -> YesodExample site ()

-- | Asserts that the two given values are equal.
--   
--   In case they are not equal, the error message includes the two values.
assertEq :: (HasCallStack, Eq a, Show a) => String -> a -> a -> YesodExample site ()

-- | Assert the given header key/value pair was returned.
--   
--   
Examples
--   
--   
--   {-# LANGUAGE OverloadedStrings #-}
--   get HomeR
--   assertHeader "key" "value"
--   
--   
--   
--   import qualified Data.CaseInsensitive as CI
--   import qualified Data.ByteString.Char8 as BS8
--   getHomeR
--   assertHeader (CI.mk (BS8.pack "key")) (BS8.pack "value")
--   
assertHeader :: HasCallStack => CI ByteString -> ByteString -> YesodExample site ()

-- | Assert the given header was not included in the response.
--   
--   
Examples
--   
--   
--   {-# LANGUAGE OverloadedStrings #-}
--   get HomeR
--   assertNoHeader "key"
--   
--   
--   
--   import qualified Data.CaseInsensitive as CI
--   import qualified Data.ByteString.Char8 as BS8
--   getHomeR
--   assertNoHeader (CI.mk (BS8.pack "key"))
--   
assertNoHeader :: HasCallStack => CI ByteString -> YesodExample site ()

-- | 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.
--   
--   
Examples
--   
--   
--   get HomeR
--   statusIs 200
--   
statusIs :: HasCallStack => Int -> YesodExample site ()

-- | Assert the last response is exactly equal to the given text. This is
--   useful for testing API responses.
--   
--   
Examples
--   
--   
--   get HomeR
--   bodyEquals "<html><body><h1>Hello, World</h1></body></html>"
--   
bodyEquals :: HasCallStack => String -> YesodExample site ()

-- | Assert the last response has the given text. The check is performed
--   using the response body in full text form.
--   
--   
Examples
--   
--   
--   get HomeR
--   bodyContains "<h1>Foo</h1>"
--   
bodyContains :: HasCallStack => String -> YesodExample site ()

-- | Assert the last response doesn't have the given text. The check is
--   performed using the response body in full text form.
--   
--   
Examples
--   
--   
--   get HomeR
--   bodyNotContains "<h1>Foo</h1>
--   
bodyNotContains :: HasCallStack => String -> YesodExample site ()

-- | Queries the HTML using a CSS selector, and all matched elements must
--   contain the given string.
--   
--   
Examples
--   
--   
--   {-# LANGUAGE OverloadedStrings #-}
--   get HomeR
--   htmlAllContain "p" "Hello" -- Every <p> tag contains the string "Hello"
--   
--   
--   
--   import qualified Data.Text as T
--   get HomeR
--   htmlAllContain (T.pack "h1#mainTitle") "Sign Up Now!" -- All <h1> tags with the ID mainTitle contain the string "Sign Up Now!"
--   
htmlAllContain :: HasCallStack => Query -> String -> YesodExample site ()

-- | Queries the HTML using a CSS selector, and passes if any matched
--   element contains the given string.
--   
--   
Examples
--   
--   
--   {-# LANGUAGE OverloadedStrings #-}
--   get HomeR
--   htmlAnyContain "p" "Hello" -- At least one <p> tag contains the string "Hello"
--   
--   
--   Since 0.3.5
htmlAnyContain :: HasCallStack => Query -> String -> YesodExample site ()

-- | Queries the HTML using a CSS selector, and fails if any matched
--   element contains the given string (in other words, it is the logical
--   inverse of htmlAnyContain).
--   
--   
Examples
--   
--   
--   {-# LANGUAGE OverloadedStrings #-}
--   get HomeR
--   htmlNoneContain ".my-class" "Hello" -- No tags with the class "my-class" contain the string "Hello"
--   
--   
--   Since 1.2.2
htmlNoneContain :: HasCallStack => Query -> String -> YesodExample site ()

-- | Performs a CSS query on the last response and asserts the matched
--   elements are as many as expected.
--   
--   
Examples
--   
--   
--   {-# LANGUAGE OverloadedStrings #-}
--   get HomeR
--   htmlCount "p" 3 -- There are exactly 3 <p> tags in the response
--   
htmlCount :: HasCallStack => Query -> Int -> YesodExample site ()

-- | Parses the response body from JSON into a Haskell value, throwing an
--   error if parsing fails.
--   
--   This function also checks that the Content-Type of the
--   response is application/json.
--   
--   
Examples
--   
--   
--   get CommentR
--   (comment :: Comment) <- requireJSONResponse
--   
--   
--   
--   post UserR
--   (json :: Value) <- requireJSONResponse
--   
requireJSONResponse :: (HasCallStack, FromJSON a) => YesodExample site a

-- | Get the foundation value used for the current test.
--   
--   Since 1.2.0
getTestYesod :: YesodExample site site

-- | Get the most recently provided response value, if available.
--   
--   Since 1.2.0
getResponse :: YesodExample site (Maybe SResponse)

-- | 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
getRequestCookies :: HasCallStack => RequestBuilder site Cookies

-- | Outputs the last response body to stderr (So it doesn't get captured
--   by HSpec). Useful for debugging.
--   
--   
Examples
--   
--   
--   get HomeR
--   printBody
--   
printBody :: YesodExample site ()

-- | Performs a CSS query and print the matches to stderr.
--   
--   
Examples
--   
--   
--   {-# LANGUAGE OverloadedStrings #-}
--   get HomeR
--   printMatches "h1" -- Prints all h1 tags
--   
printMatches :: HasCallStack => Query -> YesodExample site ()

-- | Query the last response using CSS selectors, returns a list of matched
--   fragments
htmlQuery :: HasCallStack => Query -> YesodExample site [HtmlLBS]

-- | Use HXT to parse a value from an HTML tag. Check for usage examples in
--   this module's source.
parseHTML :: HtmlLBS -> Cursor

-- | Performs a given action using the last response. Use this to create
--   response-level assertions
withResponse :: HasCallStack => (SResponse -> YesodExample site a) -> YesodExample site a
instance Yesod.Core.Class.Dispatch.YesodDispatch site => Test.Hspec.Core.Example.Example (Yesod.Test.Internal.SIO.SIO (Yesod.Test.YesodExampleData site) a)
