module Test.Expr.Vacuum
( vacuumTests
)
where
import qualified Data.ByteString.Char8 as B8
import Data.List.NonEmpty (NonEmpty ((:|)))
import GHC.Stack (HasCallStack, withFrozenCallStack)
import qualified Hedgehog as HH
import qualified Orville.PostgreSQL.Expr as Expr
import qualified Orville.PostgreSQL.Raw.RawSql as RawSql
import qualified Test.Property as Property
vacuumTests :: Property.Group
vacuumTests =
Property.group
"Expr - Vacuum"
[ prop_vacuumNoOptionsSingleTable
, prop_vacuumNoOptionsTwoTables
, prop_vacuumOneOptionSingleTable
, prop_vacuumOneOptionTwoTables
, prop_vacuumTwoOptionsOneTable
, prop_vacuumTwoOptionsTwoTables
]
prop_vacuumNoOptionsSingleTable :: Property.NamedProperty
prop_vacuumNoOptionsSingleTable =
Property.singletonNamedProperty "vacuumExpr with empty options and a single table generates expected sql" $
assertVacuumEquals
"VACUUM \"foo\""
[]
singleTable
prop_vacuumNoOptionsTwoTables :: Property.NamedProperty
prop_vacuumNoOptionsTwoTables =
Property.singletonNamedProperty "vacuumExpr with empty options and a pair of tables generates expected sql" $
assertVacuumEquals
"VACUUM \"foo\", \"bar\""
[]
twoTables
prop_vacuumOneOptionSingleTable :: Property.NamedProperty
prop_vacuumOneOptionSingleTable =
Property.singletonNamedProperty "vacuumExpr with one option and a single table generates expected sql" $
assertVacuumEquals
"VACUUM (FULL TRUE) \"foo\""
[Expr.vacuumFull True]
singleTable
prop_vacuumOneOptionTwoTables :: Property.NamedProperty
prop_vacuumOneOptionTwoTables =
Property.singletonNamedProperty "vacuumExpr with one option and a pair of tables generates expected sql" $
assertVacuumEquals
"VACUUM (FULL TRUE) \"foo\", \"bar\""
[Expr.vacuumFull True]
twoTables
prop_vacuumTwoOptionsOneTable :: Property.NamedProperty
prop_vacuumTwoOptionsOneTable =
Property.singletonNamedProperty "vacuumExpr with two options and a single table generates expected sql" $
assertVacuumEquals
"VACUUM (FULL TRUE, VERBOSE TRUE) \"foo\""
[ Expr.vacuumFull True
, Expr.vacuumVerbose True
]
singleTable
prop_vacuumTwoOptionsTwoTables :: Property.NamedProperty
prop_vacuumTwoOptionsTwoTables =
Property.singletonNamedProperty "vacuumExpr with two options and a pair of tables generates expected sql" $
assertVacuumEquals
"VACUUM (FULL TRUE, VERBOSE TRUE) \"foo\", \"bar\""
[ Expr.vacuumFull True
, Expr.vacuumVerbose True
]
twoTables
assertVacuumEquals :: (HH.MonadTest m, HasCallStack) => String -> [Expr.VacuumOption] -> NonEmpty (Expr.QualifiedOrUnqualified Expr.TableName) -> m ()
assertVacuumEquals mbVacuum vacuumOptions vacuumTables =
withFrozenCallStack $
RawSql.toExampleBytes (Expr.vacuumExpr vacuumOptions vacuumTables) HH.=== B8.pack mbVacuum
singleTable :: NonEmpty (Expr.QualifiedOrUnqualified Expr.TableName)
singleTable = pure . Expr.unqualified $ Expr.tableName "foo"
twoTables :: NonEmpty (Expr.QualifiedOrUnqualified Expr.TableName)
twoTables =
(Expr.unqualified $ Expr.tableName "foo") :| [Expr.unqualified $ Expr.tableName "bar"]