wai-routing-0.1: test/Tests/Wai/Predicate.hs
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE TypeFamilies #-}
module Tests.Wai.Predicate (tests) where
import Data.ByteString (ByteString)
import Network.HTTP.Types.Status
import Network.Wai.Routing
import Test.Tasty
import Test.Tasty.HUnit
import Tests.Wai.Util
tests :: TestTree
tests = testGroup "Wai.Predicate"
[ testCase "Accept application/json" testAcceptJson
, testCase "Accept application/thrift " testAcceptThrift
, testCase "Accept application/*" testAcceptAll
, testCase "Content-Type text/plain" testContentTypePlain
, testCase "Content-Type text/*" testContentTypeAll
, testCase "Query" testQuery
, testCase "QueryOpt" testQueryOpt
]
testAcceptJson :: IO ()
testAcceptJson = do
let rq0 = fromWaiRequest [] . json $ request "/"
(T 0 $ Media "application" "json" 1.0 []) @=? (apply (Accept :: Accept "application" "json") rq0)
let rq1 = fromWaiRequest [] . withHeader "Accept" "foo/bar" $ request "/"
(F (err status406 ("Expected 'Accept: application/json'."))) @=? (apply (Accept :: Accept "application" "json") rq1)
testAcceptThrift :: IO ()
testAcceptThrift = do
let rq0 = fromWaiRequest [] . withHeader "Accept" "application/x-thrift" $ request "/"
(T 0 $ Media "application" "x-thrift" 1.0 []) @=? (apply (Accept :: Accept "application" "x-thrift") rq0)
let rq1 = fromWaiRequest [] . json $ request "/"
(F (err status406 ("Expected 'Accept: application/x-thrift'."))) @=? (apply (Accept :: Accept "application" "x-thrift") rq1)
testAcceptAll :: IO ()
testAcceptAll = do
let rq0 = fromWaiRequest [] . withHeader "Accept" "application/*" $ request "/"
(T 0 $ Media "application" "*" 1.0 []) @=? apply (Accept :: Accept "application" "*") rq0
(T 0 $ Media "application" "json" 1.0 []) @=? apply (Accept :: Accept "application" "json") rq0
testContentTypePlain :: IO ()
testContentTypePlain = do
let rq0 = fromWaiRequest [] . withHeader "Content-Type" "text/plain" $ request "/"
(T 0 $ Media "text" "plain" 1.0 []) @=? (apply (ContentType :: ContentType "text" "plain") rq0)
let rq1 = fromWaiRequest [] . withHeader "Content-Type" "text/html" $ request "/"
(F (err status415 ("Expected 'Content-Type: text/plain'."))) @=? (apply (ContentType :: ContentType "text" "plain") rq1)
testContentTypeAll :: IO ()
testContentTypeAll = do
let rq0 = fromWaiRequest [] . withHeader "Content-Type" "text/plain" $ request "/"
(T 0.5 $ Media "text" "plain" 0.5 []) @=? (apply (ContentType :: ContentType "text" "*") rq0)
testQuery :: IO ()
testQuery = do
let rq0 = fromWaiRequest [] . withQuery "x" "y" . withQuery "x" "z" $ request "/"
(T 0 "y") @=? (apply (Query "x" :: Query ByteString) rq0)
let rq1 = fromWaiRequest [] $ request "/"
(F (err status400 ("Missing query 'x'."))) @=? (apply (Query "x" :: Query ByteString) rq1)
testQueryOpt :: IO ()
testQueryOpt = do
let rq0 = fromWaiRequest [] . withQuery "x" "y" . withQuery "x" "z" $ request "/"
(T 0 (Just "y")) @=? (apply (Opt (Query "x" :: Query ByteString)) rq0)
let rq1 = fromWaiRequest [] $ request "/"
(T 0 Nothing) @=? (apply (Opt (Query "x" :: Query ByteString)) rq1)