module Data.CQRS.Test.Internal.SnapshotTest
( mkSnapshotStoreSpec
) where
import Control.Monad.IO.Class (liftIO)
import Data.ByteString (ByteString)
import Data.CQRS.Test.Internal.Scope (ScopeM, verify, ask, randomUUID)
import qualified Data.CQRS.Test.Internal.Scope as S
import Data.CQRS.Test.Internal.TestKitSettings
import Data.CQRS.Types.Snapshot
import Data.CQRS.Types.SnapshotStore
import Data.UUID.Types (UUID)
import Test.Hspec (Spec, describe, shouldBe)
import qualified Test.Hspec as Hspec
writeSnapshot :: UUID -> Snapshot a -> ScopeM (SnapshotStore a) ()
writeSnapshot aggregateId snapshot = do
snapshotStore <- ask
liftIO $ ssWriteSnapshot snapshotStore aggregateId snapshot
readSnapshot :: UUID -> ScopeM (SnapshotStore a) (Maybe (Snapshot a))
readSnapshot aggregateId = do
snapshotStore <- ask
liftIO $ ssReadSnapshot snapshotStore aggregateId
mkSnapshotStoreSpec :: TestKitSettings a (SnapshotStore ByteString) -> Spec
mkSnapshotStoreSpec testKitSettings = do
describe "SnapshotStore" $ do
it "writing first snapshot works" $ do
aggregateId <- randomUUID
let rs = (Snapshot 3 "Hello, world")
writeSnapshot aggregateId rs
rs' <- readSnapshot aggregateId
verify $ rs' `shouldBe` Just rs
it "updating snapshot overwrites existing one" $ do
aggregateId <- randomUUID
let rs1 = (Snapshot 3 "Hello")
let rs2 = (Snapshot 4 "Goodbye")
writeSnapshot aggregateId rs1
writeSnapshot aggregateId rs2
rs' <- readSnapshot aggregateId
verify $ rs' `shouldBe` Just rs2
where
runScope = S.mkRunScope testKitSettings (tksMakeContext testKitSettings)
it msg = Hspec.it msg . runScope