packages feed

waitra-0.0.4.0: test/Main.hs

{-# LANGUAGE OverloadedStrings #-}
module Main (main) where

import           Data.Aeson
import           Data.String (fromString)
import           Network.Wai
import           Network.Wai.Test
import           Network.Waitra
import           Test.Tasty
import           Network.HTTP.Types.Header
import           Test.Tasty.HUnit

echoRoute :: Route
echoRoute = routeGet (echoApp <$ string "/api/echo/" <*> many anySym)
  where echoApp msg _req respond = respond $ responseLBS status200 [] (fromString msg)

jsonRoute :: Route
jsonRoute = simpleGet "/api/json" $ jsonApp (return . f)
  where f (Object _) = (status200, [], "object" :: String)
        f (Array _)  = (status200, [], "array")
        f v          = (status404, [], show v)

emptyApp :: Application
emptyApp _ respond = respond $ responseLBS status404 [] (fromString "Fallback: Not found")

app :: Application
app = waitraMiddleware [echoRoute, jsonRoute] emptyApp

runApp :: Session a -> IO a
runApp s = runSession s app

echoCase1 :: IO ()
echoCase1 = runApp $ do
  let req = setPath defaultRequest "/api/echo/foobar"
  res <- request req
  assertStatus 200 res
  assertBody "foobar" res

echoCase2 :: IO ()
echoCase2 = runApp $ do
  let req = setPath defaultRequest "/not-found"
  res <- request req
  assertStatus 404 res

jsonCase1 :: IO ()
jsonCase1 = runApp $ do
  let req = setPath defaultRequest "/api/json"
  res <- srequest $ SRequest req "{}"
  assertStatus 200 res
  assertHeader hContentType "application/json" res
  assertBody "\"object\"" res

-- Cannot parse random string as json
jsonCase2 :: IO ()
jsonCase2 = runApp $ do
  let req = setPath defaultRequest "/api/json"
  res <- srequest $ SRequest req "foo"
  assertStatus 400 res

tests :: TestTree
tests = testGroup "Unit tests"
  [ testCase "echo case 1" echoCase1
  , testCase "echo case 2" echoCase2
  , testCase "json case 1" jsonCase1
  , testCase "json case 2" jsonCase2
  ]

main :: IO ()
main = defaultMain tests