packages feed

hspec-pg-transact-0.1.0.3: test/Hspec/DBSpec.hs

{-# LANGUAGE QuasiQuotes      #-}
{-# LANGUAGE TypeApplications #-}
{-# OPTIONS_GHC -Wno-deferred-type-errors #-}

module Hspec.DBSpec where

import           Control.Monad.IO.Class           (MonadIO (liftIO))
import           Data.Functor                     (void)
import           Data.Monoid                      (Last (Last))
import           Database.PostgreSQL.Simple       (Only (..))
import           Database.PostgreSQL.Simple.SqlQQ (sql)
import           Database.PostgreSQL.Transact     (DBT, execute, execute_,
                                                   query_, runDBTSerializable)
import           Database.Postgres.Temp           (Config (port, postgresConfig),
                                                   ProcessConfig (stdIn, stdOut),
                                                   defaultConfig)
import           System.IO                        (Handle)
import           Test.Hspec                       (SpecWith, shouldBe)
import           Test.Hspec.Core.Spec             (Spec)
import           Test.Hspec.DB                    (TestDB, describeDB,
                                                   describeDBWithConfig, itDB)

defaultSpec :: Spec
defaultSpec =
  describeDB (runDBTSerializable migrate) "with default config" test

customSpec :: Handle -> Handle -> Spec
customSpec i o =
  describeDBWithConfig
    ( defaultConfig
        { postgresConfig =
            (postgresConfig defaultConfig)
              { stdIn = Last $ Just i,
                stdOut = Last $ Just o
              }
        , port = Last $ Just $ Just 8999
        }
    )
    (runDBTSerializable migrate)
    "with custom config"
    test

migrate :: DBT IO ()
migrate = void $ execute_ [sql| CREATE TABLE things (n VARCHAR NOT NULL) |]

test :: SpecWith TestDB
test =
  itDB "basic insert/select" $ do
    execute [sql| INSERT INTO things (n) VALUES (?) |] (Only name)
    name' <- query_ [sql| SELECT n FROM things |]
    liftIO $ name' `shouldBe` [Only name]
  where
    name = "dupont"