module Data.CQRS.Test.EventStore.BackendTest
( testBackend
) where
import Data.Conduit (runResourceT, ($$))
import qualified Data.Conduit.List as CL
import Data.Conduit.Pool (Pool, withResource)
import Data.CQRS.GUID
import Data.CQRS.EventStore.Backend
import Data.CQRS.PersistedEvent
import Test.Hspec
withBackend :: (EventStoreBackend b) => IO (Pool b) -> (b -> IO a) -> IO a
withBackend mkPool a = do
mkPool >>= (flip withResource) a
testBackend :: (EventStoreBackend b) => IO (Pool b) -> IO () -> Spec
testBackend mkPool setup = do
let bracket run = do
setup
withBackend mkPool run
describe "Event store backend" $ do
it "should be able to retrieve stored events" $ bracket $ \b -> do
g <- newGUID
let expectedEvents = [ PersistedEvent g "test event 1" 0
, PersistedEvent g "test event 2" 1
]
(esbStoreEvents b) g 0 expectedEvents
actualEvents <- runResourceT (esbRetrieveEvents b g 0 $$ CL.consume)
actualEvents `shouldBe` expectedEvents
it "should be able to enumerate all stored events" $ bracket $ \b -> do
g1 <- newGUID
g2 <- newGUID
let pe1 = PersistedEvent g1 "test event 1" 0
let pe2 = PersistedEvent g2 "test event 2" 0
(esbStoreEvents b) g1 0 [ pe1 ]
(esbStoreEvents b) g2 0 [ pe2 ]
evs <- runResourceT (esbEnumerateAllEvents b $$ CL.consume)
length evs `shouldBe` 2
(pe1 `elem` evs) `shouldBe` True
(pe2 `elem` evs) `shouldBe` True
it "writing first snapshot works" $ bracket $ \b -> do
g <- newGUID
let rs = (RawSnapshot 3 "Hello, world")
esbWriteSnapshot b g rs
rs' <- esbGetLatestSnapshot b g
rs' `shouldBe` Just rs
it "updating snapshot overwrites existing one" $ bracket $ \b -> do
g <- newGUID
let rs1 = (RawSnapshot 3 "Hello")
let rs2 = (RawSnapshot 4 "Goodbye")
esbWriteSnapshot b g rs1
esbWriteSnapshot b g rs2
rs' <- esbGetLatestSnapshot b g
rs' `shouldBe` Just rs2