yesod-test

integration testing for WAI/Yesod Applications

http://www.yesodweb.com

Version on this page:1.6.16
LTS Haskell 22.39:1.6.16
Stackage Nightly 2024-10-29:1.6.16
Latest on Hackage:1.6.19

See all snapshots yesod-test appears in

MIT licensed by Nubis
Maintained by Michael Snoyman, Greg Weber, Nubis
This version can be pinned in stack with:yesod-test-1.6.16@sha256:bf3454e57770b3a6a827a76dafb267d57af91745180f75cc3941d7fd63ac5544,3003

yesod-test

Pragmatic integration tests for haskell web applications using WAI and optionally a database (Persistent).

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.

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” field.

Your database is also directly available so you can use runDB to set up backend pre-conditions, or to assert that your session is having the desired effect.

The testing facilities behind the scenes are HSpec (on top of HUnit).

The code sample below covers the core concepts of yesod-test. Check out the yesod-scaffolding for usage in a complete application.

spec :: Spec
spec = withApp $ do
    describe "Basic navigation and assertions" $ do
      it "Gets a page that has a form, with auto generated fields and token" $ do
        get ("url/to/page/with/form" :: Text) -- Load a page.
        statusIs 200 -- Assert the status was success.

        bodyContains "Hello Person" -- Assert any part of the document contains some text.
        
        -- Perform CSS queries and assertions.
        htmlCount "form .main" 1 -- It matches 1 element.
        htmlAllContain "h1#mainTitle" "Sign Up Now!" -- All matches have some text.

        -- Performs the POST using the current page to extract field values:
        request $ do
          setMethod "POST"
          setUrl SignupR
          addToken -- Add the CSRF _token field with the currently shown value.

          -- Lookup field by the text on the labels pointing to them.
          byLabelExact "Email:" "[email protected]"
          byLabelExact "Password:" "secret"
          byLabelExact "Confirm:" "secret"

      it "Sends another form, this one has a file" $ do
        request $ do
          setMethod "POST"
          setUrl ("url/to/post/file/to" :: Text)
          -- You can easily add files, though you still need to provide the MIME type for them.
          addFile "file_field_name" "path/to/local/file" "image/jpeg"
          
          -- And of course you can add any field if you know its name.
          addPostParam "answer" "42"

        statusIs 302

    describe "Database access" $ do
      it "selects the list" $ do
        -- See the Yesod scaffolding for the runDB implementation
        msgs <- runDB $ selectList ([] :: [Filter Message]) []
        assertEqual "One Message in the DB" 1 (length msgs)

Changes

ChangeLog for yesod-test

1.6.16

  • Add addBareGetParam to yesod-test. #1821

1.6.15

  • Add bySelectorLabelContain. #1781

1.6.14

  • Fix quotes not matching in htmlContain* functions #1768.
  • Add logging of the matches found of these functions #1768.
  • Improved failure messages from assertEq. #1767

1.6.13

  • Add Yesod.Test.Internal.SIO module to expose the SIO type.

1.6.12

  • Fix import in cookie example #1713
  • Add MonadState instance for SIO

1.6.11

  • Add missing HasCallStacks #1710

1.6.10

  • statusIs assertion failures now print a preview of the response body, if the response body is UTF-8 or ASCII. #1680
  • Adds an Yesod.Test.Internal, which exposes functions that yesod-test uses. These functions do not constitute a stable API.

1.6.9.1

  • Improve documentation #1676
  • Require GHC 8.2 (base >= 4.10)

1.6.9

Add requireJSONResponse function #1646

1.6.8

Add testModifySite function #1642

1.6.7

Add addBasicAuthHeader function #1632

1.6.6.2

addPostParam will now URL-encode keys and values to prevent corruption when special characters such as & are used #1617

1.6.6.1

  • Documentation fixes
  • Support for network 3

1.6.6

  • Add utility functions to modify cookies $1570

1.6.5.1

  • Make test suite build with GHC 8.6 #1561

1.6.5

bodyEquals prints out actual body in addition to expected body in failure msg #1525

1.6.4

Add yesodSpecWithSiteGeneratorAndArgument #1485

1.6.3

Add performMethod #1502

1.6.2

  • Add byLabel-related functions like byLabelContain #1482

1.6.1

  • Fix the build with base-4.11 (GHC 8.4).

1.6.0

  • Upgrade to yesod-core 1.6.0

1.5.9.1

  • Fixes a Haddock syntax error in 1.5.9 #1473

1.5.9

  • Add byLabelExact and related functions #1459

1.5.8

  • Added implicit parameter HasCallStack to assertions. #1421

1.5.7

1.5.6

1.5.5

  • Fix warnings

1.5.4.1

  • Compilation fix for GHC 7.8

1.5.4

  • yesod-test: add getLocation test helper. #1314

1.5.3

  • Added bodyNotContains #1271

1.5.2

  • Added assertEq, deprecated assertEqual #1259

1.5.1.1

  • Fix addToken_ needing a trailing space and allows multiples spaces in css selector.

1.5.1.0

  • Better error provenance for stuff invoking withResponse’ #1191

1.5.0.1

  • Fixed the application/x-www-form-urlencoded header being added to all requests, even those sending a binary POST body #1064
    • The application/x-www-form-urlencoded Content-Type header is now only added if key-value POST parameters are added
    • If no key-values pairs are added, or the request body is set with setRequestBody, no default Content-Type header is set

1.5

  • remove deprecated addNonce functions
  • You can now configure testing middleware

Configuring middleware makes it easy to add logging among other things. middleware is applied to the wai app before each test.

If you follow the yesod scaffold, you probably have a withApp function in TestImport.hs. This function should now return (foundation, middleware). id is an acceptable value for middleware.

1.4.4

test helpers for CRSF middleware such as addTokenFromCookie

1.4.3.2

  • Add addTokenFromCookie and addTokenFromCookieNamedToHeaderNamed, which support the new CSRF token middleware #1058
  • Add getRequestCookies, which returns the cookies from the most recent request #1058

1.4.3.1

  • Improved README

1.4.2

Provide Example instance for YesodExample.

1.4.1.1

Upgrade to hspec 2