packages feed

snap-predicates-0.1.0: test/Tests/Snap/Predicates.hs

{-# LANGUAGE OverloadedStrings, FlexibleContexts, TypeFamilies #-}
module Tests.Snap.Predicates (tests) where

import Test.Framework
import Test.Framework.Providers.HUnit
import Test.HUnit hiding (Test)
import Data.Predicate
import Snap.Predicates
import Snap.Test
import qualified Data.Map.Strict as M

tests :: [Test]
tests =
    [ testAccept
    , testParam
    , testAcceptJson
    , testAcceptThrift
    ]

testAccept :: Test
testAccept = testCase "Accept Predicate" $ do
    rq0 <- buildRequest $ addHeader "Accept" "x/y"
    assertEqual "Matching Accept" (T ()) (apply (Accept "x/y") rq0)

    rq1 <- buildRequest $ get "/" M.empty
    assertEqual "Status Code 406"
        (F $ Just (406, Just "Expected 'Accept: x/y'."))
        (apply (Accept "x/y") rq1)

testAcceptJson :: Test
testAcceptJson = testCase "AcceptJson Predicate" $ do
    rq0 <- buildRequest $ addHeader "Accept" "application/json"
    assertEqual "Matching AcceptJson" (T AcceptJson) (apply AcceptJson rq0)

    rq1 <- buildRequest $ addHeader "Accept" "foo"
    assertEqual "Status Code 406"
        (F $ Just (406, Just "Expected 'Accept: application/json'."))
        (apply AcceptJson rq1)

testAcceptThrift :: Test
testAcceptThrift = testCase "AcceptThrift Predicate" $ do
    rq0 <- buildRequest $ addHeader "Accept" "application/x-thrift"
    assertEqual "Matching AcceptThrift" (T AcceptThrift) (apply AcceptThrift rq0)

    rq1 <- buildRequest $ addHeader "Accept" "application/json"
    assertEqual "Status Code 406"
        (F $ Just (406, Just "Expected 'Accept: application/x-thrift'."))
        (apply AcceptThrift rq1)

testParam :: Test
testParam = testCase "Param Predicate" $ do
    rq0 <- buildRequest $ get "/" (M.fromList [("x", ["y", "z"])])
    assertEqual "Matching Param" (T "y") (apply (Param "x") rq0)

    rq1 <- buildRequest $ get "/" M.empty
    assertEqual "Status Code 400"
        (F $ Just (400, Just "Expected parameter 'x'."))
        (apply (Param "x") rq1)