packages feed

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)