module Main where
import qualified Hasql.Connection as Connection
import qualified Hasql.Decoders as Decoders
import qualified Hasql.Encoders as Encoders
import Hasql.Pool
import qualified Hasql.Session as Session
import qualified Hasql.Statement as Statement
import Test.Hspec
import Prelude
main = hspec $ do
describe "" $ do
it "Releases a spot in the pool when there is a query error" $ do
pool <- acquire 1 connectionSettings
use pool badQuerySession `shouldNotReturn` (Right ())
use pool selectOneSession `shouldReturn` (Right 1)
it "Simulation of connection error works" $ do
pool <- acquire 3 connectionSettings
res <- use pool $ closeConnSession >> selectOneSession
shouldSatisfy res $ \case
Left (SessionUsageError (Session.QueryError _ _ (Session.ClientError _))) -> True
_ -> False
it "Connection errors cause eviction of connection" $ do
pool <- acquire 3 connectionSettings
res <- use pool $ closeConnSession >> selectOneSession
res <- use pool $ closeConnSession >> selectOneSession
res <- use pool $ closeConnSession >> selectOneSession
res <- use pool $ selectOneSession
shouldSatisfy res $ isRight
it "Connection gets returned to the pool after normal use" $ do
pool <- acquire 3 connectionSettings
res <- use pool $ selectOneSession
res <- use pool $ selectOneSession
res <- use pool $ selectOneSession
res <- use pool $ selectOneSession
res <- use pool $ selectOneSession
shouldSatisfy res $ isRight
it "Connection gets returned to the pool after non-connection error" $ do
pool <- acquire 3 connectionSettings
res <- use pool $ badQuerySession
res <- use pool $ badQuerySession
res <- use pool $ badQuerySession
res <- use pool $ badQuerySession
res <- use pool $ selectOneSession
shouldSatisfy res $ isRight
connectionSettings :: Connection.Settings
connectionSettings =
"host=localhost port=5432 user=postgres dbname=postgres"
selectOneSession :: Session.Session Int64
selectOneSession =
Session.statement () statement
where
statement = Statement.Statement "SELECT 1" Encoders.noParams decoder True
decoder = Decoders.singleRow (Decoders.column (Decoders.nonNullable Decoders.int8))
badQuerySession :: Session.Session ()
badQuerySession =
Session.statement () statement
where
statement = Statement.Statement "" Encoders.noParams Decoders.noResult True
closeConnSession :: Session.Session ()
closeConnSession = do
conn <- ask
liftIO $ Connection.release conn