packages feed

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

module Polysemy.Hasql.Test.WithInitTest where

import Conc (interpretAtomic)
import Hasql.Decoders (column, int8, nonNullable)
import Polysemy.Db.Data.DbError (DbError)
import Polysemy.Test (Hedgehog, UnitTest, assertEq)
import Sqel.Statement (unprepared)

import Polysemy.Hasql.Data.InitDb (InitDb (InitDb))
import qualified Polysemy.Hasql.Effect.Database as Database
import Polysemy.Hasql.Effect.Database (Database)
import Polysemy.Hasql.Test.RunIntegration (integrationTest)

prog ::
  Members [Hedgehog IO, Database, AtomicState Int] r =>
  Sem r Int
prog = do
  assertEq 1 =<< run
  Database.release
  assertEq 1 =<< run
  assertEq 1 =<< run
  pure ()
  atomicGet
  where
    run = Database.withInit initDb (Database.statement () stmt)
    stmt = runIdentity <$> unprepared "select 1" (column (nonNullable int8)) mempty
    initDb = (InitDb "test" False \ _ -> atomicModify' (1 +))

test_withInit :: UnitTest
test_withInit = do
  integrationTest do
    assertEq 2 =<< restop @DbError @Database (interpretAtomic 0 prog)