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