packages feed

micrologger-0.5.0.0: test/LogSpec.hs

{-# 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        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 "test" []
    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 "test" []
    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 "test" []) $ \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