{-# LANGUAGE OverloadedStrings #-} module SpecHook (hook) where import Control.Exception (bracket) import System.Environment (lookupEnv) import Test.Hspec (Spec, SpecWith, around) import Text.Printf (printf) import qualified Data.Text as Text import qualified Database.PostgreSQL.Opium as Opium setupConnection :: IO Opium.Connection setupConnection = do Just dbUser <- lookupEnv "DB_USER" Just dbPass <- lookupEnv "DB_PASS" Just dbName <- lookupEnv "DB_NAME" Just dbPort <- lookupEnv "DB_PORT" let dsn = printf "host=localhost user=%s password=%s dbname=%s port=%s" dbUser dbPass dbName dbPort Right conn <- Opium.connect $ Text.pack dsn Right _ <- Opium.execute_ "DROP TABLE IF EXISTS person" conn Right _ <- Opium.execute_ "CREATE TABLE person (name TEXT NOT NULL, age INT NOT NULL, score DOUBLE PRECISION NOT NULL, motto TEXT)" conn Right _ <- Opium.execute_ "INSERT INTO person VALUES ('paul', 25, 30), ('albus', 103, 50.42)" conn pure conn teardownConnection :: Opium.Connection -> IO () teardownConnection conn = do Opium.close conn hook :: SpecWith Opium.Connection -> Spec hook = around $ bracket setupConnection teardownConnection