packages feed

webcrank-0.2.0.1: test/HandleRequestTests.hs

{-# LANGUAGE OverloadedStrings #-}

module HandleRequestTests where

import qualified Data.HashMap.Strict as HashMap
import Test.Tasty
import Test.Tasty.HUnit

import Webcrank
import TestServerAPI

handleRequestTests :: TestTree
handleRequestTests = testGroup "handleRequest"
  [ getTest
  , postTest
  , putTest
  , deleteTest
  , notModifiedTest
  , serviceUnavailableTest
  ]

getTest :: TestTree
getTest = testCase "GET" $
  let r = resource { contentTypesProvided = return [("plain" // "text", return "webcrank")] }
  in handleTestReq r req @?=
    Res ok200
      (HashMap.singleton hContentType ["plain/text"])
      (Just "webcrank")

postTest :: TestTree
postTest = testCase "POST" $
  let
    r = resource
      { contentTypesAccepted =
          return [("plain" // "text", putResponseHeader hContentType "plain/text" >> writeLBS "webcrank")]
      , postAction = return . PostCreate $ ["new"]
      , allowedMethods = return [methodGet, methodHead, methodPost]
      }
    rq = req
      { reqMethod = methodPost
      , reqHeaders = HashMap.singleton hContentType ["plain/text"]
      }
  in handleTestReq r rq @?=
    Res created201
      (HashMap.fromList [(hLocation, ["http://example.com/new"]), (hContentType, ["plain/text"])])
      (Just "webcrank")

putTest :: TestTree
putTest = testCase "PUT" $
  let
    r = resource
      { contentTypesAccepted =
          return [("plain" // "text", putResponseHeader hContentType "plain/text" >> writeLBS "webcrank")]
      , allowedMethods = return [methodGet, methodHead, methodPut]
      }
    rq = req
      { reqMethod = methodPut
      , reqHeaders = HashMap.singleton hContentType ["plain/text"]
      }
  in handleTestReq r rq @?=
    Res ok200
      (HashMap.singleton hContentType ["plain/text"])
      (Just "webcrank")

deleteTest :: TestTree
deleteTest = testCase "DELETE" $
  let
    r = resource
      { allowedMethods = return [methodGet, methodHead, methodDelete]
      , deleteResource = return True
      }
    rq = req { reqMethod = methodDelete }
  in handleTestReq r rq @?=
    Res noContent204
      (HashMap.singleton hContentType ["application/octet-stream"])
      Nothing

notModifiedTest :: TestTree
notModifiedTest = testCase "Not modified" $
  let
    r = resource
      { lastModified = return defaultHTTPDate
      , generateETag = return $ StrongETag "webcrank"
      , expires = return defaultHTTPDate
      }
    rq = req { reqHeaders = HashMap.singleton hIfModifiedSince [ formatHTTPDate defaultHTTPDate ] }
  in handleTestReq r rq @?=
    Res notModified304
      (HashMap.fromList [(hETag, ["webcrank"]), (hExpires, [formatHTTPDate defaultHTTPDate])])
      Nothing

serviceUnavailableTest :: TestTree
serviceUnavailableTest = testCase "Service unavailable" $
  let r = resource { serviceAvailable = return False }
  in resStatus (handleTestReq r req) @?= serviceUnavailable503