packages feed

polysemy-log-0.2.0.0: test/Polysemy/Log/Test/LocalTest.hs

module Polysemy.Log.Test.LocalTest where

import Polysemy.Test (UnitTest, assertEq, runTestAuto)

import Polysemy.Log.Atomic (interpretDataLogAtomic)
import qualified Polysemy.Log.Data.DataLog as DataLog
import Polysemy.Log.Data.DataLog (DataLog)
import Polysemy.Log.Data.LogMessage (LogMessage(LogMessage))
import Polysemy.Log.Data.Severity (Severity(Debug))

data Context =
  Context {
    context :: [Text],
    message :: LogMessage
  }
  deriving (Eq, Show)

log ::
  Member (DataLog Context) r =>
  Severity ->
  Text ->
  Sem r ()
log severity msg =
  DataLog.dataLog (Context [] (LogMessage severity msg))

pushContext ::
  Member (DataLog Context) r =>
  [Text] ->
  Sem r a ->
  Sem r a
pushContext ctx =
  DataLog.local push
  where
    push (Context c m) =
      Context (ctx <> c) m

prog ::
  Members [DataLog Context, AtomicState [Context]] r =>
  Sem r [Context]
prog = do
  log Debug "0"
  pushContext ["level2", "level1"] do
    log Debug "2"
    pushContext ["level3"] do
      log Debug "3"
  atomicGet

target :: [Context]
target =
  [
    Context ["level3", "level2", "level1"] (LogMessage Debug "3"),
    Context ["level2", "level1"] (LogMessage Debug "2"),
    Context [] (LogMessage Debug "0")
  ]

test_local :: UnitTest
test_local =
  runTestAuto do
    assertEq @_ @IO target =<< interpretDataLogAtomic @Context prog