{-# 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)