packages feed

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'