packages feed

eventful-memory-0.2.0: tests/Eventful/ProjectionCache/MemorySpec.hs

module Eventful.ProjectionCache.MemorySpec (spec) where

import Control.Concurrent.STM
import Control.Monad.State.Strict
import Test.Hspec

import Eventful.ProjectionCache.Memory
import Eventful.Store.Memory
import Eventful.TestHelpers

import MemoryTestImport

spec :: Spec
spec = do
  describe "TVar projection cache" $ do
    versionedProjectionCacheSpec tvarVersionedProjectionCacheRunner
    globalStreamProjectionCacheSpec tvarGlobalStreamProjectionCacheRunner

  describe "MonadState embedded memory projection cache" $ do
    versionedProjectionCacheSpec stateVersionedProjectionCacheRunner
    globalStreamProjectionCacheSpec stateGlobalStreamProjectionCacheRunner

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

tvarGlobalStreamProjectionCacheRunner :: GlobalStreamProjectionCacheRunner STM
tvarGlobalStreamProjectionCacheRunner = GlobalStreamProjectionCacheRunner $ \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 embeddedEventMap setEventMap
    reader = embeddedStateEventStoreReader embeddedEventMap
    cache = embeddedStateProjectionCache embeddedProjectionMap setProjectionMap

stateGlobalStreamProjectionCacheRunner :: GlobalStreamProjectionCacheRunner (StateT (GlobalStreamEmbeddedState Counter CounterEvent Text) IO)
stateGlobalStreamProjectionCacheRunner =
  GlobalStreamProjectionCacheRunner $ \action -> evalStateT (action writer globalReader cache) emptyEmbeddedState
  where
    writer = embeddedStateEventStoreWriter embeddedEventMap setEventMap
    globalReader = embeddedStateGlobalEventStoreReader embeddedEventMap
    cache = embeddedStateProjectionCache embeddedProjectionMap setProjectionMap