module Test.Sequence
( sequenceTests
)
where
import qualified Control.Monad.IO.Class as MIO
import Hedgehog ((===))
import qualified Orville.PostgreSQL as Orville
import qualified Orville.PostgreSQL.Expr as Expr
import qualified Test.Property as Property
sequenceTests :: Orville.ConnectionPool -> Property.Group
sequenceTests pool =
Property.group
"Sequence"
[ prop_nextValue pool
, prop_currentValue pool
, prop_setValue pool
]
prop_nextValue :: Property.NamedDBProperty
prop_nextValue =
Property.singletonNamedDBProperty "Fetching the next value from a sequence" $ \pool -> do
result <-
MIO.liftIO $
Orville.runOrville pool $ do
createTestSequence
traverse (\() -> Orville.sequenceNextValue testSequence) [(), (), ()]
result === [1, 2, 3]
prop_currentValue :: Property.NamedDBProperty
prop_currentValue =
Property.singletonNamedDBProperty "Fetching the current value from a sequence" $ \pool -> do
result <-
MIO.liftIO $
Orville.runOrville pool $ do
createTestSequence
-- get the next value once to initialize the sequence so that we can
-- query the current value
_ <- Orville.sequenceNextValue testSequence
traverse (\() -> Orville.sequenceCurrentValue testSequence) [(), (), ()]
result === [1, 1, 1]
prop_setValue :: Property.NamedDBProperty
prop_setValue =
Property.singletonNamedDBProperty "Setting the current value of a sequence" $ \pool -> do
result <-
MIO.liftIO $
Orville.runOrville pool $ do
createTestSequence
_ <- Orville.sequenceSetValue testSequence 42
Orville.sequenceCurrentValue testSequence
result === 42
testSequence :: Orville.SequenceDefinition
testSequence =
Orville.mkSequenceDefinition sequenceNameString
sequenceNameString :: String
sequenceNameString =
"sequence_definition_test"
createTestSequence :: Orville.Orville ()
createTestSequence = do
Orville.executeVoid Orville.DDLQuery $ Expr.dropSequenceExpr (Just Expr.ifExists) (Orville.sequenceName testSequence)
Orville.executeVoid Orville.DDLQuery $ Orville.mkCreateSequenceExpr testSequence