module Test.Expr.Count ( countTests ) where import qualified Data.Foldable as Fold import qualified Data.List as List import qualified Data.List.NonEmpty as NEL import Hedgehog ((===)) import qualified Hedgehog as HH import qualified Hedgehog.Range as Range import qualified Orville.PostgreSQL as Orville import qualified Orville.PostgreSQL.Expr as Expr import qualified Test.Entities.Foo as Foo import qualified Test.Property as Property countTests :: Orville.ConnectionPool -> Property.Group countTests pool = Property.group "Expr - Count" [ prop_count1 pool , prop_countColumn pool ] prop_count1 :: Property.NamedDBProperty prop_count1 = Property.singletonNamedDBProperty "SELECT COUNT(1)" $ \pool -> do let sql = Expr.queryExpr (Expr.selectClause (Expr.selectExpr Nothing)) ( Expr.selectDerivedColumns [ Expr.deriveColumnAs Expr.count1 (Expr.columnName "count") ] ) Nothing marshaller = Orville.annotateSqlMarshallerEmptyAnnotation $ Orville.marshallField id (Orville.integerField "count") result <- HH.evalIO $ Orville.runOrville pool $ Orville.executeAndDecode Orville.SelectQuery sql marshaller result === [1] prop_countColumn :: Property.NamedDBProperty prop_countColumn = Property.singletonNamedDBProperty "In transaction" $ \pool -> do let sql = Expr.queryExpr (Expr.selectClause (Expr.selectExpr Nothing)) ( Expr.selectDerivedColumns [ Expr.deriveColumnAs (Expr.countColumn (Orville.fieldColumnName Foo.fooIdField)) (Expr.columnName "count") ] ) (Just (Expr.tableExpr (Expr.referencesTable $ Orville.tableName Foo.table) Nothing Nothing Nothing Nothing Nothing)) marshaller = Orville.annotateSqlMarshallerEmptyAnnotation $ Orville.marshallField id (Orville.integerField "count") foos <- HH.forAll (Foo.generateList (Range.linear 0 5)) result <- Foo.withTable pool $ do Fold.traverse_ (Orville.insertEntities Foo.table) (NEL.nonEmpty foos) Orville.executeAndDecode Orville.SelectQuery sql marshaller result === [List.genericLength foos]