packages feed

hasql-0.20.1: tests/Main.hs

module Main where

import Prelude
import Bug
import Test.QuickCheck.Instances
import Test.Tasty
import Test.Tasty.Runners
import Test.Tasty.HUnit
import Test.Tasty.QuickCheck
import qualified Hasql.Connection as A
import qualified Hasql.Batch as J
import qualified Hasql.DecodeResult as B
import qualified Hasql.DecodeRow as C
import qualified Hasql.DecodePrimitive as D
import qualified Hasql.Statement as E
import qualified Data.Vector as H
import qualified Control.Foldl as I


main =
  connect >>= runTests

connect :: IO A.Connection
connect =
  do
    openingResult <- A.open (A.TCPConnectionSettings "localhost" 5432) "postgres" "" Nothing handleNotification
    case openingResult of
      Left error -> fail (showString "Can't connect: " (show error))
      Right connection -> return connection
  where
    handleNotification x =
      putStrLn ("Notification: " <> show x)

runTests :: A.Connection -> IO ()
runTests connection =
  defaultMain $
  testGroup "Tests with connection" $
  [
    let
      test :: (Eq result, Show result) => String -> Either A.Error result -> J.Batch result -> TestTree
      test name expectedResult query =
        testCase name $ do
          result <- A.batch connection query
          assertEqual "" expectedResult result 
      in
        testGroup "Batch" $
        [
          test "select 1" (Right 1) $
          J.statement (E.prepared "select 1" conquer (B.head (C.primitive D.int4))) ()
          ,
          test "select '1' and select 'true'" (Right (1, True)) $
          (,) <$>
          J.statement (E.prepared "select 1" conquer (B.head (C.primitive D.int4))) () <*>
          J.statement (E.prepared "select 'true' :: bool" conquer (B.head (C.primitive D.bool))) ()
          ,
          test "Error" (Left (A.BackendError "42703" "column \"abc\" does not exist")) $
          J.statement (E.prepared "select abc" conquer (B.head (C.primitive D.int4))) ()
          ,
          test "Errors in multiple queries" (Left (A.BackendError "42703" "column \"abc\" does not exist")) $
          J.statement (E.unprepared "select 1" conquer (B.head (C.primitive D.int4))) () *>
          J.statement (E.unprepared "select abc" conquer (B.head (C.primitive D.int4))) () *>
          J.statement (E.unprepared "select abc" conquer (B.head (C.primitive D.int4))) ()
          ,
          test "traverse" (Right [1,2,3]) $
          traverse (\template -> J.statement (E.prepared template conquer (B.head (C.primitive D.int4))) ()) $
          ["select 1", "select 2", "select 3"]
          ,
          test "Not a single row" (Left (A.DecodingError "Empty query")) $
          J.statement (E.prepared "" conquer (B.head (C.primitive D.int4))) ()
          ,
          testCaseInfo "Simultaneous result decoding and counting" $ pure "Pending"
        ]
    ,
    testCase "Failed prepared statement should be forgotten" $ do
      result1 <- A.batch connection $
        J.statement (E.prepared "fail 'Failed prepared statement 1'" conquer B.ignore) ()
      result2 <- A.batch connection $
        J.statement (E.prepared "fail 'Failed prepared statement 1'" conquer B.ignore) ()
      assertEqual "" (Left (A.BackendError "42601" "syntax error at or near \"fail\"")) result2
  ]