About

Metadata

  • Last updated , by jack
  • License BSD-3-Clause
  • Categories Web Development, Testing
  • Maintained by: sean.chalmers@data61.csiro.au

  • Lottery factor: 0

Links

Installation

Tested Compilers

  1. 9.12.2
  2. 9.10.2
  3. 9.8.4
  4. 9.6.7
  5. 9.0.1
  6. 8.10.1
  7. 8.8.3
  8. 8.6.5
  9. 8.4.4
  10. 8.2.2
  11. 8.0.2
  12. 7.10.3

Readme

CSIRO's Data61 Logo

Build Status

tasty-wai

This provides tasty integration for wai via the components provided by wai-extra.

This is a simple package, it does not provide any resource management for anything that your Application may require. Test databases and the like are not handled. This package provides a nicer interface to running tests again the endpoints and interrogating their results.

An example of usage

There is an example of usage in test/Test.hs and it is included here.

Given this trivial Application:

import           Network.Wai        (Application)
import qualified Network.Wai        as W

import qualified Network.HTTP.Types as H

testApp :: Application
testApp rq cb = do
  let
    mkresp s = W.responseLBS s []
    resp404 = mkresp H.status404
    resp200 = mkresp H.status200

  resp <- case (W.requestMethod rq, W.pathInfo rq) of

    -- Ye olde...
    ("GET", ["hello"]) -> pure $ resp200 "world!"

    -- Echo me this!
    ("POST", ["echo"]) -> resp200 <$> W.strictRequestBody rq

    -- Well, then...
    _ -> pure $ resp404 "no route"

  cb resp

We can write some tests to check the endpoints behave as we expect:

testWai testApp "Hello to World" $ do
  res <- get "hello"
  assertBody "world!" res

testWai testApp "Echo to thee" $ do
  res <- post "echo" "thus"
  assertStatus' H.status200 res -- Use functions from Network.HTTP.Types
  assertStatus 200 res          -- Use raw ints
  assertBody "thus" res

We can check that our fall-through route works as intended:

testWai testApp "Will die!" $ do
  res <- get "not-a-thing"
  assertStatus' H.status404 res
  assertBody "no route" res

These can be grouped up and run as per the tasty TestTree:

import           Test.Tasty         (defaultMain, testGroup)
import           Test.Tasty.Wai     (assertBody, assertStatus, assertStatus',
                                     get, post, testWai)

main :: IO ()
main = defaultMain $ testGroup "Tasty-Wai Tests"

  [ testWai testApp "Hello to World" $ do
      res <- get "hello"
      assertBody "wrld!" res

  , testWai testApp "Echo to thee" $ do
      res <- post "echo" "thus"
      assertStatus' H.status200 res -- Use functions from Network.HTTP.Types
      assertStatus 200 res          -- Use raw ints
      assertBody "thus" res

  , testWai testApp "Will die!" $ do
      res <- get "not-a-thing"
      assertStatus' H.status404 res
      assertBody "no route" res
  ]

Tasty then provides nicely formatted and grouped output, as you've come to expect:

Test suite tests: RUNNING...
Tasty-Wai Tests
  Hello to World: OK
  Echo to thee:   OK
  Will die!:      OK

With the errors from wai-extra helping us understanding where our tests went wrong:

Test suite tests: RUNNING...
Tasty-Wai Tests
  Hello to World: FAIL
    Expected response body "wrld!", but received "world!"
  Echo to thee:   OK
  Will die!:      OK