tasty-wai
Test 'wai' endpoints via Test.Tasty
| LTS Haskell 24.17: | 0.1.2.0@rev:3 | 
| Stackage Nightly 2025-10-31: | 0.1.2.0@rev:3 | 
| Latest on Hackage: | 0.1.2.0@rev:3 | 
tasty-wai-0.1.2.0@sha256:241a4afbfffb440c89c3c96f25494ce72f0065d3d7f19e1365216ae58985bb4b,2231Module documentation for 0.1.2.0
- Test- Test.Tasty
 

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
Changes
Revision history for tasty-wai
0.1.2.0 – 2022-07-27
- Add headandpostWithHeadersfunctions
0.1.1.1 – 2020-09-24
- Support wai-extra 3.1
0.1.1.0 – 2019-01-09
- Add buildRequestWithHeadersfunction.
0.1.0.1 – 2018-12-04
- Add README to the extra-source-files.
- remove bytestring from test dependencies
0.1.0.0 – 2018-12-04
- First version. Released on an unsuspecting world.
