postgresql-pure-0.1.0.0: test/Database/HDBC/PostgreSQL/PureSpec.hs
{-# LANGUAGE NamedFieldPuns #-}
{-# LANGUAGE TypeApplications #-}
module Database.HDBC.PostgreSQL.PureSpec (spec) where
import Database.HDBC
import Database.HDBC.PostgreSQL.Pure
import Test.Hspec
import Control.Exception.Safe (try)
import Control.Monad (void)
import Data.Default.Class (Default (def))
import Data.Maybe (fromMaybe)
import System.Environment (lookupEnv)
{-# ANN module ("HLint: ignore Redundant do" :: String) #-}
{-# ANN module ("HLint: ignore Reduce duplication" :: String) #-}
spec :: Spec
spec = do
beforeAll
( do
hostString <- getEnvDef "PURE_HOST" "127.0.0.1"
portString <- getEnvDef "PURE_PORT" "5432"
user <- getEnvDef "PURE_USER" "postgres"
password <- getEnvDef "PURE_PASSWORD" ""
database <- getEnvDef "PURE_DATABASE" "postgres"
let
config =
def
{ address = AddressNotResolved hostString portString
, user
, password
, database
}
connect config
)
$ afterAll
disconnect
$ do
describe "CREATE TABLE/DROP TABLE" $ do
it "prepare/execute" $ \conn -> do
statement <- prepare conn "CREATE TABLE test (value INT NOT NULL)"
n <- execute statement []
n `shouldBe` 0
statement <- prepare conn "DROP TABLE IF EXISTS test"
n <- execute statement []
n `shouldBe` 0
commit conn
pure ()
it "run" $ \conn -> do
run conn "CREATE TABLE test (value INT NOT NULL)" [] `shouldReturn` 0
run conn "DROP TABLE IF EXISTS test" [] `shouldReturn` 0
commit conn
it "runRaw" $ \conn -> do
let
query =
"CREATE TABLE test (value INT NOT NULL);\
\DROP TABLE IF EXISTS test"
runRaw conn query
commit conn
beforeWith
( \conn -> do
let
query =
"CREATE TABLE test (value INT NOT NULL);\
\INSERT INTO test (value) VALUES (0), (1), (2)"
runRaw conn query
commit conn
pure conn
)
$ after
( \conn -> do
void $ try @IO @SqlError $ do
runRaw conn "DROP TABLE IF EXISTS test"
commit conn
)
$ do
describe "table: test (value INT NOT NULL)" $ do
it "DELETE FROM test WHERE value = 0" $ \conn -> do
run conn "DELETE FROM test WHERE value = 0" [] `shouldReturn` 1
commit conn
it "UPDATE test SET value = 10 WHERE value = 1" $ \conn -> do
run conn "UPDATE test SET value = 10 WHERE value = 1" [] `shouldReturn` 1
commit conn
it "SELECT value FROM test ORDER BY value (reuse portal)" $ \conn -> do
s <- prepare conn "SELECT value FROM test ORDER BY value"
executeRaw s
fetchRow s `shouldReturn` Just [SqlInt32 0]
fetchRow s `shouldReturn` Just [SqlInt32 1]
fetchRow s `shouldReturn` Just [SqlInt32 2]
fetchRow s `shouldReturn` Nothing
finish s
it "SELECT value FROM test WHERE value = $1 (reuse prepared statement)" $ \conn -> do
s <- prepare conn "SELECT value FROM test WHERE value = ?"
void $ execute s [SqlInt32 0]
fetchRow s `shouldReturn` Just [SqlInt32 0]
void $ execute s [SqlInt32 1]
fetchRow s `shouldReturn` Just [SqlInt32 1]
void $ execute s [SqlInt32 2]
fetchRow s `shouldReturn` Just [SqlInt32 2]
finish s
it "BEGIN/ROLLBACK" $ \conn -> do
begin conn
rollback conn
it "BEGIN/COMMIT" $ \conn -> do
begin conn
commit conn
getEnvDef :: String -> String -> IO String
getEnvDef name value = fromMaybe value <$> lookupEnv name