{-# LANGUAGE OverloadedStrings #-} module LogSpec where import Control.Monad (forM_) import Data.Aeson (Value(..), toJSON) import Data.Monoid import qualified Data.IORef as IORef import qualified Data.Text.Lazy as T import Test.Hspec import LuminescentDreams.Logger writeBuffer :: IORef.IORef [T.Text] -> T.Text -> IO () writeBuffer buffer text = IORef.modifyIORef' buffer (\lst -> lst <> [text]) basicLogger :: Spec basicLogger = describe "demonstrate IO output" $ do it "outputs in the standard format" $ do logRef <- IORef.newIORef [] let l = Logger (writeBuffer logRef) LogDebug logMsgStd l LogInfo [("name", "value")] "message" logMsgStd l LogInfo [("name", "value")] "message2" IORef.readIORef logRef >>= flip forM_ (putStrLn . T.unpack) jsonLogger :: Spec jsonLogger = describe "demonstrate the JSON logger with IO output" $ do it "outputs in the JSON format" $ do logRef <- IORef.newIORef [] let l = Logger (writeBuffer logRef) LogDebug logMsgJs l LogInfo [("name", String "value"), ("timing", toJSON (0.5 :: Float)), ("msg", String "message")] logMsgJs l LogInfo [("name", String "value"), ("timing", toJSON (0.5 :: Float)), ("msg", String "message2")] IORef.readIORef logRef >>= flip forM_ (putStrLn . T.unpack) spec :: Spec spec = do basicLogger jsonLogger