{-# 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) loggerTypes :: Spec loggerTypes = describe "verify that the built-in logger types work" $ do it "outputs to stdout" $ pendingWith "how does one even verify this?" it "outputs to a file buffer" $ do logRef <- IORef.newIORef T.empty withLogger (Buffer logRef LogInfo) $ \l -> do logMsgStd l LogInfo [("name", "value")] "message" logMsgStd l LogDebug [("name", "value")] "message2" logMsgJs l LogDebug [("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 >>= putStrLn . T.unpack spec :: Spec spec = do basicLogger jsonLogger loggerTypes