packages feed

eventium-memory-0.2.1: tests/Eventium/ProjectionCache/MemorySpec.hs

module Eventium.ProjectionCache.MemorySpec (spec) where

import Control.Concurrent.STM
import Control.Monad.State.Strict
import Eventium.ProjectionCache.Memory
import Eventium.Store.Memory
import Eventium.Testkit
import MemoryTestImport
import Test.Hspec

spec :: Spec
spec = do
  describe "TVar projection cache" $ do
    versionedProjectionCacheSpec tvarVersionedProjectionCacheRunner
    globalProjectionCacheSpec tvarGlobalProjectionCacheRunner
    describe "snapshotEventHandler" $ snapshotEventHandlerSpec tvarVersionedProjectionCacheRunner
    describe "snapshotGlobalEventHandler" $ snapshotGlobalEventHandlerSpec tvarGlobalProjectionCacheRunner
    describe "applyCommandHandlerWithCache" $ applyCommandHandlerWithCacheSpec tvarVersionedProjectionCacheRunner

  describe "MonadState embedded memory projection cache" $ do
    versionedProjectionCacheSpec stateVersionedProjectionCacheRunner
    globalProjectionCacheSpec stateGlobalProjectionCacheRunner

tvarVersionedProjectionCacheRunner :: VersionedProjectionCacheRunner STM
tvarVersionedProjectionCacheRunner = VersionedProjectionCacheRunner $ \action -> do
  eventTVar <- eventMapTVar
  projTVar <- projectionMapTVar
  let writer = tvarEventStoreWriter eventTVar
      reader = tvarEventStoreReader eventTVar
      cache = tvarProjectionCache projTVar
  atomically $ action writer reader cache

tvarGlobalProjectionCacheRunner :: GlobalProjectionCacheRunner STM
tvarGlobalProjectionCacheRunner = GlobalProjectionCacheRunner $ \action -> do
  eventTVar <- eventMapTVar
  projTVar <- projectionMapTVar
  let writer = tvarEventStoreWriter eventTVar
      globalReader = tvarGlobalEventStoreReader eventTVar
      cache = tvarProjectionCache projTVar
  atomically $ action writer globalReader cache

stateVersionedProjectionCacheRunner :: VersionedProjectionCacheRunner (StateT (StreamEmbeddedState Counter CounterEvent) IO)
stateVersionedProjectionCacheRunner = VersionedProjectionCacheRunner $ \action -> evalStateT (action writer reader cache) emptyEmbeddedState
  where
    writer = embeddedStateEventStoreWriter (.eventMap) setEventMap
    reader = embeddedStateEventStoreReader (.eventMap)
    cache = embeddedStateProjectionCache (.projectionMap) setProjectionMap

stateGlobalProjectionCacheRunner :: GlobalProjectionCacheRunner (StateT (GlobalEmbeddedState Counter CounterEvent) IO)
stateGlobalProjectionCacheRunner =
  GlobalProjectionCacheRunner $ \action -> evalStateT (action writer globalReader cache) emptyEmbeddedState
  where
    writer = embeddedStateEventStoreWriter (.eventMap) setEventMap
    globalReader = embeddedStateGlobalEventStoreReader (.eventMap)
    cache = embeddedStateProjectionCache (.projectionMap) setProjectionMap