packages feed

pqi-conformance 1.0.7.0 → 1.0.8.0

raw patch · 4 files changed

+60/−1 lines, 4 filesPVP ok

version bump matches the API change (PVP)

API changes (from Hackage documentation)

Files

CHANGELOG.md view
@@ -1,3 +1,9 @@+# v1.0.8.0++## Non-breaking++- Added a `connectdb` spec covering a Unix-socket directory that doesn't exist, asserting `errorMessage` byte-for-byte against the reference. Found `pqi-native`'s failure message is the raw `Show`n `IOException`, which happens to contain `"could not connect to server"` - one of `Hasql.Connection`'s networking (transient) patterns - while libpq's message for the identical `ENOENT` doesn't, so the two adapters drive `Hasql.Connection.acquire` to opposite classifications of the same failure. Found via `hasql` issue #329.+ # v1.0.7.0  ## Non-breaking
pqi-conformance.cabal view
@@ -1,6 +1,6 @@ cabal-version: 3.0 name: pqi-conformance-version: 1.0.7.0+version: 1.0.8.0 category: Database, PostgreSQL, Testing synopsis: Differential conformance tests for pqi adapters description:@@ -94,6 +94,7 @@     Pqi.Conformance.Operation.CmdStatus     Pqi.Conformance.Operation.CmdTuples     Pqi.Conformance.Operation.Connectdb+    Pqi.Conformance.Operation.Connectdb.MissingUnixSocketDirectory     Pqi.Conformance.Operation.Connectdb.Rejection     Pqi.Conformance.Operation.Connectdb.UnixSocketUri     Pqi.Conformance.Operation.ConnectionNeedsPassword
src/library/Pqi/Conformance/Operation/Connectdb.hs view
@@ -14,6 +14,7 @@ import qualified Pqi import Pqi.Conformance.Harness import Pqi.Conformance.Observation+import qualified Pqi.Conformance.Operation.Connectdb.MissingUnixSocketDirectory as MissingUnixSocketDirectory import qualified Pqi.Conformance.Operation.Connectdb.Rejection as Rejection import qualified Pqi.Conformance.Operation.Connectdb.UnixSocketUri as UnixSocketUri import Pqi.Conformance.Prelude@@ -25,6 +26,7 @@ spec adapter = do   Rejection.spec adapter   UnixSocketUri.spec adapter+  MissingUnixSocketDirectory.spec adapter    describe "connectdb" do     it "opens a usable connection" \conninfo ->
+ src/library/Pqi/Conformance/Operation/Connectdb/MissingUnixSocketDirectory.hs view
@@ -0,0 +1,50 @@+-- | Coverage for @connectdb@ against a Unix-socket directory that doesn't+-- exist on disk (as opposed to one that exists but has nothing listening).+--+-- Both adapters fail at the very same syscall here - a @connect(2)@ on a+-- Unix-domain socket path whose containing directory is absent, i.e.+-- @ENOENT@ - so unlike+-- 'Pqi.Conformance.Operation.Connectdb.UnixSocketUri' (whose two adapters+-- fail via genuinely unrelated machinery: DNS resolution vs. a filesystem+-- check), this spec does compare 'Pqi.errorMessage' byte-for-byte. It's+-- expected to fail on @pqi-native@ right now, and deliberately left that+-- way: the mismatch it demonstrates is exactly what confuses downstream+-- string-matching classifiers.+--+-- Found in @pqi-native@+-- (<https://github.com/nikita-volkov/hasql/issues/329>): the candidate's+-- 'Pqi.errorMessage' is the raw 'Show'n form of the underlying+-- 'System.IO.Error.IOException' (@could not connect to server:+-- Network.Socket.connect: ...@), which happens to contain the substring+-- @"could not connect to server"@ - one of @Hasql.Connection@'s+-- /networking/ (transient) patterns. libpq's own message for the identical+-- failure (@connection to server on socket "..." failed: No such file or+-- directory@) does not contain that phrase, so it falls through to+-- @OtherConnectionError@ (permanent misconfiguration) instead. The two+-- adapters therefore drive @Hasql.Connection.acquire@ to opposite+-- classifications of the same failure.+module Pqi.Conformance.Operation.Connectdb.MissingUnixSocketDirectory+  ( spec,+  )+where++import qualified Pqi+import Pqi.Conformance.Harness+import Pqi.Conformance.Prelude+import Test.Hspec++spec :: Pqi.Adapter -> SpecWith ByteString+spec adapter =+  describe "connectdb" do+    describe "a Unix-socket directory that doesn't exist" do+      it "reports a failure message shaped like the reference's" \_ ->+        differentialConnect adapter conninfo \adapter' conninfo' -> do+          connection <- Pqi.connectdb adapter' conninfo'+          observedStatus <- Pqi.status connection+          observedError <- Pqi.errorMessage connection+          Pqi.finish connection+          pure (observedStatus, observedError)+  where+    -- A directory that is guaranteed not to exist: this test is only about+    -- the shape of the failure, not about a real connection succeeding.+    conninfo = "host=/tmp/pqi-conformance-nonexistent-socket-dir"