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