eventium-memory-0.2.1: tests/Eventium/Store/MemorySpec.hs
module Eventium.Store.MemorySpec (spec) where
import Control.Concurrent.STM
import Control.Monad.State.Strict
import Eventium.Codec
import Eventium.Store.Memory
import Eventium.Testkit
import MemoryTestImport
import Test.Hspec
spec :: Spec
spec = do
describe "TVar memory event store with actual event type" $ do
eventStoreSpec tvarRunner
globalStreamEventStoreSpec tvarGlobalRunner
describe "TVar memory event store with Dynamic encoded type" $ do
eventStoreSpec tvarDynamicRunner
globalStreamEventStoreSpec tvarDynamicGlobalRunner
describe "MonadState memory event store with actual event type" $ do
eventStoreSpec stateStoreRunner
globalStreamEventStoreSpec stateStoreGlobalRunner
describe "MonadState embedded memory event store with actual event type" $ do
eventStoreSpec embeddedStateStoreRunner
globalStreamEventStoreSpec embeddedStateStoreGlobalRunner
tvarRunner :: EventStoreRunner STM
tvarRunner = EventStoreRunner $ \action -> do
eventTVar <- eventMapTVar
let writer = tvarEventStoreWriter eventTVar
reader = tvarEventStoreReader eventTVar
atomically $ action writer reader
tvarGlobalRunner :: GlobalStreamEventStoreRunner STM
tvarGlobalRunner = GlobalStreamEventStoreRunner $ \action -> do
eventTVar <- eventMapTVar
let writer = tvarEventStoreWriter eventTVar
globalReader = tvarGlobalEventStoreReader eventTVar
atomically $ action writer globalReader
tvarDynamicRunner :: EventStoreRunner STM
tvarDynamicRunner = EventStoreRunner $ \action -> do
eventTVar <- eventMapTVar
let writer = codecEventStoreWriter dynamicCodec $ tvarEventStoreWriter eventTVar
reader = codecVersionedEventStoreReader dynamicCodec $ tvarEventStoreReader eventTVar
atomically $ action writer reader
tvarDynamicGlobalRunner :: GlobalStreamEventStoreRunner STM
tvarDynamicGlobalRunner = GlobalStreamEventStoreRunner $ \action -> do
eventTVar <- eventMapTVar
let writer = codecEventStoreWriter dynamicCodec $ tvarEventStoreWriter eventTVar
globalReader = codecGlobalEventStoreReader dynamicCodec $ tvarGlobalEventStoreReader eventTVar
atomically $ action writer globalReader
stateStoreRunner :: EventStoreRunner (StateT (EventMap CounterEvent) IO)
stateStoreRunner = EventStoreRunner $ \action -> evalStateT (action stateEventStoreWriter stateEventStoreReader) emptyEventMap
stateStoreGlobalRunner :: GlobalStreamEventStoreRunner (StateT (EventMap CounterEvent) IO)
stateStoreGlobalRunner = GlobalStreamEventStoreRunner $
\action -> evalStateT (action stateEventStoreWriter stateGlobalEventStoreReader) emptyEventMap
embeddedStateStoreRunner :: EventStoreRunner (StateT (StreamEmbeddedState Counter CounterEvent) IO)
embeddedStateStoreRunner = EventStoreRunner $ \action -> evalStateT (action writer reader) emptyEmbeddedState
where
writer = embeddedStateEventStoreWriter (.eventMap) setEventMap
reader = embeddedStateEventStoreReader (.eventMap)
embeddedStateStoreGlobalRunner :: GlobalStreamEventStoreRunner (StateT (StreamEmbeddedState Counter CounterEvent) IO)
embeddedStateStoreGlobalRunner = GlobalStreamEventStoreRunner $
\action -> evalStateT (action writer globalReader) emptyEmbeddedState
where
writer = embeddedStateEventStoreWriter (.eventMap) setEventMap
globalReader = embeddedStateGlobalEventStoreReader (.eventMap)