packages feed

postgresql-libpq-0.10.1.0: test/Smoke.hs

{-# LANGUAGE OverloadedStrings #-}
module Main (main) where

import Control.Monad             (unless)
import Data.Foldable             (toList)
import Database.PostgreSQL.LibPQ
import System.Environment        (getEnvironment)
import System.Exit               (exitFailure)
import Test.Tasty                (defaultMain, testGroup)
import Test.Tasty.HUnit          (assertEqual, testCaseSteps)

import qualified Data.ByteString       as BS
import qualified Data.ByteString.Char8 as BS8

main :: IO ()
main = do
    libpqVersion >>= print
    withConnstring $ \connString -> defaultMain $ testGroup "postgresql-libpq"
        [ testCaseSteps "smoke" $ smoke connString
        , testCaseSteps "issue54" $ issue54 connString
        ]

withConnstring :: (BS8.ByteString -> IO ()) -> IO ()
withConnstring kont = do
    env <- getEnvironment
    case lookup "DATABASE_CONNSTRING" env of
        Just s  -> kont (BS8.pack (special s))
        Nothing -> case lookup "GITHUB_ACTIONS" env of
            Just "true" -> kont (BS8.pack gha)
            _           -> putStrLn "Set DATABASE_CONNSTRING environment variable"
   where
    -- https://www.appveyor.com/docs/services-databases/
    special "appveyor" = "dbname='TestDb' user='postgres' password='Password12!'"
    special "travis"   = ""
    special s          = s

    gha = unwords
        [ "dbname='postgres'"
        , "user='postgres'"
        , "password='postgres'"
        , "host='postgres'"
        , "port=5432"
        ]

smoke :: BS8.ByteString -> (String -> IO ()) -> IO ()
smoke connstring info = do
    let infoShow x = info (show x)

    conn <- connectdb connstring

    -- status functions
    db conn                >>= infoShow
    user conn              >>= infoShow
    host conn              >>= infoShow
    port conn              >>= infoShow
    status conn            >>= infoShow
    transactionStatus conn >>= infoShow
    protocolVersion conn   >>= infoShow
    serverVersion conn     >>= infoShow

    s <- status conn
    assertEqual "connection not ok" ConnectionOk s

    finish conn

issue54 :: BS8.ByteString -> (String -> IO ()) -> IO ()
issue54 connString info = do
    conn <- connectdb connString

    Just result <- execParams conn
        "SELECT ($1 :: bytea), ($2 :: bytea)"
        [Just (Oid 17,"",Binary), Just (Oid 17,BS.empty,Binary)]
        Binary
    s <- resultStatus result
    assertEqual "result status" TuplesOk s

    -- ntuples result >>= info . show
    -- nfields result >>= info . show

    null1 <- getisnull result 0 0
    null2 <- getisnull result 0 1
    assertEqual "fst not null" False null1
    assertEqual "snd not null" False null2

    Just val1 <- getvalue result 0 0
    Just val2 <- getvalue result 0 1

    assertEqual "fst not null" BS.empty val1
    assertEqual "snd not null" BS.empty val2