{-# LANGUAGE GeneralizedNewtypeDeriving #-}
module DB(
PostgresM
, runDB
) where
import Control.Monad.Base
import Control.Monad.Logger
import Data.ByteString (ByteString)
import qualified Data.ByteString.Char8 as BS
import Data.Maybe
import Database.PostgreSQL.Query
import Options.Applicative
newtype PostgresM a = PostgresM { runPostgresM :: PgMonadT (LoggingT IO) a }
deriving (Functor, HasPostgres, MonadLogger, Monad, Applicative, MonadBase IO)
dbConnection :: ByteString
dbConnection = "host=localhost dbname=servant_db_postgresql_test port=5432"
cliConnection :: IO (Maybe ByteString)
cliConnection = execParser opts
where
opts = info (helper <*> cliParser)
( fullDesc
<> progDesc "Test suite for servant-db-postgresql package"
<> header "Runs integration tests for servant-db-postgresql package" )
cliParser :: Parser (Maybe ByteString)
cliParser = optional $ BS.pack
<$> strOption (
long "connection"
<> help "Custom connection string to PostgreSQL"
)
-- | Run tests with DB connection
runDB :: PostgresM a -> IO a
runDB m = do
mconf <- cliConnection
let conf = fromMaybe dbConnection mconf
con <- connectPostgreSQL conf
runStderrLoggingT . runPgMonadT con . runPostgresM $ m