{-# 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 Data.Text.Encoding as Encoding 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 conn <- Opium.connect $ Encoding.encodeUtf8 $ 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