packages feed

hasql-1.9.3.2: testing-kit/Hasql/TestingKit/Testcontainers.hs

module Hasql.TestingKit.Testcontainers where

import Control.Exception
import Hasql.Connection qualified
import Hasql.Connection.Setting qualified
import Hasql.Connection.Setting.Connection qualified
import Hasql.Connection.Setting.Connection.Param qualified
import TestcontainersPostgresql qualified
import Prelude

withConnectionSettings :: ([Hasql.Connection.Setting.Setting] -> IO ()) -> IO ()
withConnectionSettings action = do
  TestcontainersPostgresql.run config \(host, port) -> do
    action
      [ Hasql.Connection.Setting.connection
          ( Hasql.Connection.Setting.Connection.params
              [ Hasql.Connection.Setting.Connection.Param.host host,
                Hasql.Connection.Setting.Connection.Param.port (fromIntegral port),
                Hasql.Connection.Setting.Connection.Param.user "postgres",
                Hasql.Connection.Setting.Connection.Param.password "",
                Hasql.Connection.Setting.Connection.Param.dbname "postgres"
              ]
          )
      ]
  where
    config =
      TestcontainersPostgresql.Config
        { forwardLogs = False,
          distro = TestcontainersPostgresql.Distro17,
          auth = TestcontainersPostgresql.TrustAuth
        }

withConnection :: (Hasql.Connection.Connection -> IO ()) -> IO ()
withConnection action = withConnectionSettings $ \settings -> do
  connection <- Hasql.Connection.acquire settings
  case connection of
    Left err -> fail ("Connection failed: " <> show err)
    Right conn -> finally (action conn) (Hasql.Connection.release conn)