packages feed

polysemy-hasql-0.0.1.0: integration/Polysemy/Hasql/Test/RetryTest.hs

module Polysemy.Hasql.Test.RetryTest where

import qualified Hasql.Connection as Hasql
import Hasql.Decoders (column, int8, nonNullable)
import Polysemy.Db.Data.DbConnectionError (DbConnectionError)
import qualified Polysemy.Db.Data.DbError as DbError
import Polysemy.Db.Data.DbError (DbError)
import Polysemy.Test (Hedgehog, UnitTest, assertEq)
import Time (Seconds (Seconds))
import Sqel.Statement (unprepared)

import qualified Polysemy.Hasql.Effect.Database as Database
import Polysemy.Hasql.Effect.Database (Databases, withDatabaseUnique)
import qualified Polysemy.Hasql.Effect.DbConnectionPool as DbConnectionPool
import Polysemy.Hasql.Effect.DbConnectionPool (DbConnectionPool)
import Polysemy.Hasql.Test.RunIntegration (integrationTest)

prog ::
  Members [Hedgehog IO, Databases, DbConnectionPool !! DbConnectionError, Stop DbError, Embed IO] r =>
  Sem r ()
prog = do
  withDatabaseUnique (Just "retry") do
    assertEq 1 =<< restop run
    conn <- stopNote "no connection" =<< resumeHoist DbError.Connection (DbConnectionPool.unsafeGet "retry")
    embed (Hasql.release conn)
    assertEq 1 =<< restop (Database.retry (Seconds 1) (Just 1) run)
  where
    run = Database.statement () stmt
    stmt = runIdentity <$> unprepared "select 1" (column (nonNullable int8)) mempty

test_retry :: UnitTest
test_retry =
  integrationTest do
    prog