packages feed

filter-logger-0.1.0.0: test/Spec.hs

{-# LANGUAGE OverloadedStrings #-}

import           Control.Monad
import qualified Data.ByteString                              as BS
import           Data.Monoid
import           Network.Wai.Middleware.FilterLogger.Internal
import           Test.HUnit.Base
import           Test.HUnit.Text

main :: IO ()
main = void . runTestTT . TestList $ basicTests ++ advancedTests

-- basic tests for log filtering functionality
basicTests :: [Test]
basicTests = map TestCase [
    noFilter
  , simpleFilterKeep
  , simpleFilterDiscard
  ]

-- slightly more complicated filters
advancedTests :: [Test]
advancedTests = map TestCase [
    doubleFilterKeep
  , doubleFilterDiscard
  ]

runFilterUnitTest :: Maybe BS.ByteString -> BS.ByteString -> LogFilter BS.ByteString -> Assertion
runFilterUnitTest expectation input lf = expectation @=? lf input

invert :: LogFilter a -> LogFilter a
invert lf a = maybe (Just a) (const Nothing) $ lf a

contains :: BS.ByteString -> BS.ByteString -> Bool
contains t = not . BS.null . snd . BS.breakSubstring t

simpleFilter :: BS.ByteString -> BS.ByteString -> Maybe BS.ByteString
simpleFilter t bs
  | contains t bs = Just bs
  | otherwise         = Nothing

noFilter :: Assertion
noFilter = runFilterUnitTest (Just "MyByteString") "MyByteString" return

simpleFilterKeep :: Assertion
simpleFilterKeep = runFilterUnitTest (Just "MyByteString") "MyByteString" testFilter
  where testFilter = simpleFilter "Str"

simpleFilterDiscard :: Assertion
simpleFilterDiscard = runFilterUnitTest Nothing "MyByteString" testFilter
  where testFilter = invert (simpleFilter "Str")

doubleFilter :: LogFilter BS.ByteString
doubleFilter = simpleFilter "Test" >=> lenCheck
  where lenCheck s
          | BS.length s > 4 = Just s
          | otherwise       = Nothing

doubleFilterKeep :: Assertion
doubleFilterKeep = runFilterUnitTest (Just "UnitTest") "UnitTest" doubleFilter

doubleFilterDiscard :: Assertion
doubleFilterDiscard = runFilterUnitTest Nothing "UnitTest" (invert doubleFilter)