packages feed

hasql-0.14.0.2: tasty/Main.hs

module Main where

import Main.Prelude hiding (assert, isRight, isLeft)
import Test.QuickCheck.Instances
import Test.Tasty
import qualified Main.Queries as Queries
import qualified Test.Tasty.HUnit as HUnit
import qualified Test.Tasty.SmallCheck as SmallCheck
import qualified Test.Tasty.QuickCheck as QuickCheck
import qualified Test.QuickCheck as QuickCheck
import qualified Main.DSL as DSL
import qualified Hasql.Query as Query
import qualified Hasql.Encoding as Encoding
import qualified Hasql.Decoding as Decoding

main =
  defaultMain tree

tree =
  testGroup "All tests"
  [
    HUnit.testCase "Enum" $
    HUnit.assertEqual "" (Right "ok") $
    let
      actual =
        unsafePerformIO $
        DSL.session $ do
          let
            query =
              Query.Query sql mempty Decoding.unit True
              where
                sql =
                  "drop type if exists mood"
            in DSL.query () query
          let
            query =
              Query.Query sql mempty Decoding.unit True
              where
                sql =
                  "create type mood as enum ('sad', 'ok', 'happy')"
            in DSL.query () query
          let
            query =
              Query.Query sql encoder decoder True
              where
                sql =
                  "select ($1 :: mood)"
                decoder =
                  (Decoding.singleRow (Decoding.value (Decoding.enum (Just . id))))
                encoder =
                  Encoding.value (Encoding.enum id)
            in DSL.query "ok" query
      in actual
    ,
    HUnit.testCase "The same prepared statement used on different types" $ 
    HUnit.assertEqual "" (Right ("ok", 1)) $
    let
      actual =
        unsafePerformIO $
        DSL.session $ do
          let
            effect1 =
              DSL.query "ok" query
              where
                query =
                  Query.Query sql encoder decoder True
                  where
                    sql =
                      "select $1"
                    encoder =
                      Encoding.value Encoding.text
                    decoder =
                      (Decoding.singleRow (Decoding.value (Decoding.text)))
            effect2 =
              DSL.query 1 query
              where
                query =
                  Query.Query sql encoder decoder True
                  where
                    sql =
                      "select $1"
                    encoder =
                      Encoding.value Encoding.int8
                    decoder =
                      (Decoding.singleRow (Decoding.value Decoding.int8))
            in (,) <$> effect1 <*> effect2
      in actual
    ,
    HUnit.testCase "Affected rows counting" $
    HUnit.assertEqual "" (Right 100) $
    let
      actual =
        unsafePerformIO $
        DSL.session $ do
          dropTable
          createTable
          replicateM_ 100 insertRow
          deleteRows <* dropTable
        where
          dropTable =
            DSL.query () $ Queries.plain $ 
            "drop table if exists a"
          createTable =
            DSL.query () $ Queries.plain $
            "create table a (id bigserial not null, name varchar not null, primary key (id))"
          insertRow =
            DSL.query () $ Queries.plain $
            "insert into a (name) values ('a')"  
          deleteRows =
            DSL.query () $ Query.Query sql def decoder False
            where
              sql =
                "delete from a"
              decoder =
                Decoding.rowsAffected
      in actual
    ,
    HUnit.testCase "Result of an auto-incremented column" $
    let
      actualIO =
        DSL.session $ do
          DSL.query () $ Queries.plain $ "drop table if exists a"
          DSL.query () $ Queries.plain $ "create table a (id serial not null, v char not null, primary key (id))"
          id1 <- DSL.query () $ Query.Query "insert into a (v) values ('a') returning id" def (Decoding.singleRow (Decoding.value Decoding.int4)) False
          id2 <- DSL.query () $ Query.Query "insert into a (v) values ('b') returning id" def (Decoding.singleRow (Decoding.value Decoding.int4)) False
          DSL.query () $ Queries.plain $ "drop table if exists a"
          pure (id1, id2)
      in HUnit.assertEqual "" (Right (1, 2)) =<< actualIO
    ,
    HUnit.testCase "List decoding" $
    let
      actualIO =
        DSL.session $ DSL.query () $ Queries.selectList
      in HUnit.assertEqual "" (Right [(1, 2), (3, 4), (5, 6)]) =<< actualIO
  ]