packages feed

cqrs-postgresql-0.10.0: src-test/Data/CQRS/PostgreSQL/Internal/UtilsSpec.hs

{-# LANGUAGE OverloadedStrings #-}
module Data.CQRS.PostgreSQL.Internal.UtilsSpec
    ( mkUtilsSpec
    ) where

import           Control.Exception (bracket)
import           Data.ByteString (isInfixOf)
import           Data.CQRS.PostgreSQL.Internal.Utils (SqlValue(..), QueryError(..), runQuery)
import           Data.Pool (Pool, destroyAllResources)
import           Database.PostgreSQL.LibPQ (Connection)
import           Test.Hspec

-- Tests for Data.CQRS.PostgreSQL.Internal.Utils
mkUtilsSpec :: IO (Pool Connection) -> Spec
mkUtilsSpec mkConnectionPool = do
  describe "single-result query" $ do
    it "produces a result (non-parametric)" $ withConnectionPool $ \connectionPool -> do
      x <- runQuery connectionPool "SELECT TRUE" []
      length x `shouldBe` 1
    it "produces a result (parametric)" $ withConnectionPool $ \connectionPool -> do
      x <- runQuery connectionPool "SELECT TRUE WHERE $1" [SqlBool $ Just True]
      length x `shouldBe` 1
    it "produces no results if unsatisfiable" $ withConnectionPool $ \connectionPool -> do
      x <- runQuery connectionPool "SELECT TRUE WHERE FALSE" []
      length x `shouldBe` 0
    it "throws a QueryError when invalid SQL statement is executed" $ withConnectionPool $ \connectionPool -> do
      runQuery connectionPool "MY BAD QUERY" [] `shouldThrow` (\e ->
        case e of
          QueryError (Just "42601") "PGRES_FATAL_ERROR" (Just msg) | "MY BAD QUERY" `isInfixOf` msg ->
            True
          _ ->
            False)
  describe "multi-result query" $ do
    it "produces the correct number of rows" $ withConnectionPool $ \connectionPool -> do
      x <- runQuery connectionPool "SELECT GENERATE_SERIES(1,5)" []
      length x `shouldBe` 5
  where
    withConnectionPool test =
      bracket mkConnectionPool destroyAllResources test