{-# LANGUAGE OverloadedStrings #-}
module PersistenceSpec (spec) where

import Data.Foldable
import Test.Hspec
import Test.Hspec.QuickCheck (prop)
import Test.QuickCheck.Instances ()

import qualified Data.Aeson as Aeson
import qualified Data.ByteString.Lazy.Char8 as LBS8

import OrphanInstances ()
import Store (Modification (..))
import qualified Store

spec :: Spec
spec = do
  describe "Store.Modification" $ do
    prop "does not contain new lines when serialized" $ \op ->
      let jsonStr = Aeson.encode (op :: Modification)
      in '\n' `LBS8.notElem` jsonStr

    prop "round trips serialization" $ \op ->
      let jsonStr = Aeson.encode (op :: Modification)
          decoded = Aeson.decode jsonStr
      in Just op == decoded

  describe "Journaling" $ do
    prop "journal is idempotent" $ \ops initial ->
      let replay value = foldl' (flip Store.applyModification) value (ops :: [Modification])
      in replay initial == replay (replay initial)