@hackage tasty-wai0.1.2.0
Test 'wai' endpoints via Test.Tasty
Categories
License
BSD-3-Clause
Maintainer
sean.chalmers@data61.csiro.au
Links
Versions
Installation
Tested Compilers
Dependencies (7)
- HUnit >=1.6 && <1.7
- base >=4.8 && <4.22
- bytestring >=0.10 && <0.13
- http-types >=0.9 && <0.13
- tasty >=0.8 && <1.6
- wai >=3.2 && <3.3 Show all…
Dependents (4)
@hackage/wai-middleware-clacks, @hackage/servant-waargonaut, @hackage/servant-multipart, @hackage/tasty-prelude

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