packages feed

pqi-conformance-1.0.11.0: src/library/Pqi/Conformance/Operation/ConnectionUsedPassword.hs

-- | Coverage for 'Pqi.connectionUsedPassword': whether the server actually
-- challenged for a password during authentication (mirroring libpq's
-- @password_needed@ state, not merely whether a @password=@ field was
-- present in the conninfo).
module Pqi.Conformance.Operation.ConnectionUsedPassword
  ( spec,
  )
where

import Control.Exception (bracket)
import qualified Data.ByteString.Char8 as ByteString.Char8
import qualified Data.Text as Text
import qualified Pqi
import Pqi.Conformance.Harness
import Pqi.Conformance.Prelude
import qualified Pqi.Conformance.Reference as Reference
import Test.Hspec
import qualified TestcontainersPostgresql as TcPg

spec :: Pqi.Adapter -> SpecWith ByteString
spec adapter = do
  describe "connectionUsedPassword" do
    it "reports False under trust auth even when a password is supplied" \conninfo ->
      differential adapter (conninfo <> " password=irrelevant") Pqi.connectionUsedPassword

    it "reports True once SCRAM authentication was actually challenged for" \_ ->
      let scramConfig =
            TcPg.Config
              { TcPg.tagName = "postgres:17",
                TcPg.forwardLogs = False,
                TcPg.auth = TcPg.CredentialsAuth "scram" "secret"
              }
       in TcPg.run scramConfig \(host, port) -> do
            let conninfo = scramConninfo host port
            candidate <- bracket (Pqi.connectdb adapter conninfo) Pqi.finish Pqi.connectionUsedPassword
            reference <- bracket (Pqi.connectdb Reference.adapter conninfo) Pqi.finish Pqi.connectionUsedPassword
            candidate `shouldBe` reference

scramConninfo :: Text -> Word16 -> ByteString
scramConninfo host port =
  ByteString.Char8.pack
    ( "host="
        <> Text.unpack host
        <> " port="
        <> show port
        <> " user=scram password=secret dbname=scram"
    )