packages feed

servant-db-postgresql-0.2.0.0: test/DB.hs

{-# 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