eventful-sqlite-0.1.3: tests/Eventful/Store/SqliteSpec.hs
{-# LANGUAGE OverloadedStrings #-}
module Eventful.Store.SqliteSpec (spec) where
import Database.Persist.Sqlite
import Test.Hspec
import Eventful.Store.Sqlite
import Eventful.TestHelpers
spec :: Spec
spec = do
describe "Sqlite event store" $ do
eventStoreSpec sqliteStoreRunner
sequencedEventStoreSpec sqliteStoreGlobalRunner
-- This is really a test for runEventStoreUsing and
-- runGloballyOrderedEventStoreUsing. This is just a good place to put it.
describe "runEventStoreUsing and runGloballyOrderedEventStoreUsing for the sqlite store" $ do
eventStoreSpec sqliteIOStoreRunner
sequencedEventStoreSpec sqliteIOStoreGlobalRunner
makeStore :: IO (EventStore CounterEvent (SqlPersistT IO), ConnectionPool)
makeStore = do
pool <- liftIO $ runNoLoggingT (createSqlitePool ":memory:" 1)
let store = serializedEventStore jsonStringSerializer $ sqliteEventStore defaultSqlEventStoreConfig
initializeSqliteEventStore defaultSqlEventStoreConfig pool
return (store, pool)
sqliteStoreRunner :: EventStoreRunner (SqlPersistT IO)
sqliteStoreRunner = EventStoreRunner $ \action -> do
(store, pool) <- makeStore
runSqlPool (action store) pool
sqliteStoreGlobalRunner :: GloballyOrderedEventStoreRunner (SqlPersistT IO)
sqliteStoreGlobalRunner = GloballyOrderedEventStoreRunner $ \action -> do
(store, pool) <- makeStore
let globalStore = serializedGloballyOrderedEventStore jsonStringSerializer (sqlGloballyOrderedEventStore defaultSqlEventStoreConfig)
runSqlPool (action store globalStore) pool
makeIOStore :: IO (EventStore CounterEvent IO, ConnectionPool)
makeIOStore = do
(store, pool) <- makeStore
let store' = runEventStoreUsing (flip runSqlPool pool) store
return (store', pool)
sqliteIOStoreRunner :: EventStoreRunner IO
sqliteIOStoreRunner = EventStoreRunner $ \action -> do
(store, _) <- makeIOStore
action store
sqliteIOStoreGlobalRunner :: GloballyOrderedEventStoreRunner IO
sqliteIOStoreGlobalRunner = GloballyOrderedEventStoreRunner $ \action -> do
(store, pool) <- makeIOStore
let
globalStore = serializedGloballyOrderedEventStore jsonStringSerializer (sqlGloballyOrderedEventStore defaultSqlEventStoreConfig)
globalStore' = runGloballyOrderedEventStoreUsing (flip runSqlPool pool) globalStore
action store globalStore'