eventful-memory-0.1.3: tests/Eventful/Store/MemorySpec.hs
module Eventful.Store.MemorySpec (spec) where
import Control.Concurrent.STM
import Control.Monad.State.Strict
import Test.Hspec
import Eventful.Store.Memory
import Eventful.TestHelpers
import MemoryTestImport
spec :: Spec
spec = do
describe "TVar memory event store with actual event type" $ do
eventStoreSpec tvarRunner
sequencedEventStoreSpec tvarGlobalRunner
describe "TVar memory event store with Dynamic serialized type" $ do
eventStoreSpec tvarDynamicRunner
sequencedEventStoreSpec tvarDynamicGlobalRunner
describe "MonadState memory event store with actual event type" $ do
eventStoreSpec stateStoreRunner
sequencedEventStoreSpec stateStoreGlobalRunner
describe "MonadState embedded memory event store with actual event type" $ do
eventStoreSpec embeddedStateStoreRunner
sequencedEventStoreSpec embeddedStateStoreGlobalRunner
tvarRunner :: EventStoreRunner STM
tvarRunner = EventStoreRunner $ \action -> (tvarEventStore <$> eventMapTVar) >>= atomically . action
tvarGlobalRunner :: GloballyOrderedEventStoreRunner STM
tvarGlobalRunner = GloballyOrderedEventStoreRunner $ \action -> do
tvar <- eventMapTVar
let
store = tvarEventStore tvar
globalStore = tvarGloballyOrderedEventStore tvar
atomically $ action store globalStore
tvarDynamicRunner :: EventStoreRunner STM
tvarDynamicRunner = EventStoreRunner $ \action -> (fst <$> makeDynamicTVarStore) >>= atomically . action
tvarDynamicGlobalRunner :: GloballyOrderedEventStoreRunner STM
tvarDynamicGlobalRunner = GloballyOrderedEventStoreRunner $ \action -> makeDynamicTVarStore >>= atomically . uncurry action
stateStoreRunner :: EventStoreRunner (StateT (EventMap CounterEvent) IO)
stateStoreRunner = EventStoreRunner $ \action -> evalStateT (action stateEventStore) emptyEventMap
stateStoreGlobalRunner :: GloballyOrderedEventStoreRunner (StateT (EventMap CounterEvent) IO)
stateStoreGlobalRunner = GloballyOrderedEventStoreRunner $
\action -> evalStateT (action stateEventStore stateGloballyOrderedEventStore) emptyEventMap
embeddedStateStoreRunner :: EventStoreRunner (StateT (StreamEmbeddedState Counter CounterEvent) IO)
embeddedStateStoreRunner = EventStoreRunner $ \action -> evalStateT (action store) emptyEmbeddedState
where
store = embeddedStateEventStore embeddedEventMap setEventMap
embeddedStateStoreGlobalRunner :: GloballyOrderedEventStoreRunner (StateT (StreamEmbeddedState Counter CounterEvent) IO)
embeddedStateStoreGlobalRunner = GloballyOrderedEventStoreRunner $
\action -> evalStateT (action store globalStore) emptyEmbeddedState
where
store = embeddedStateEventStore embeddedEventMap setEventMap
globalStore = embeddedStateGloballyOrderedEventStore embeddedEventMap