packages feed

pqi-conformance-0.0.1.0: src/library/Pqi/Conformance/Operation/PutCopyData.hs

-- | Coverage for 'Pqi.putCopyData': streaming rows into a
-- @COPY FROM STDIN@, including malformed data that the server rejects at end.
module Pqi.Conformance.Operation.PutCopyData
  ( spec,
  )
where

import Pqi (IsConnection (..))
import Pqi.Conformance.Harness
import Pqi.Conformance.Prelude
import Pqi.Conformance.Scenario (drainResults, execScenario)
import Test.Hspec

spec :: (IsConnection c) => Proxy c -> SpecWith ByteString
spec proxy =
  describe "putCopyData" do
    it "streams rows into a COPY FROM STDIN" \conninfo ->
      differential proxy conninfo \connection -> do
        _ <- exec connection "create temporary table conformance_copy (id int4, label text)"
        started <- execScenario "copy conformance_copy from stdin" connection
        firstRow <- putCopyData connection "1\thello\n"
        secondRow <- putCopyData connection "2\tworld\n"
        ended <- putCopyEnd connection Nothing
        outcome <- drainResults connection
        check <-
          execScenario "select count(*), min(label), max(label) from conformance_copy" connection
        pure (started, firstRow, secondRow, ended, outcome, check)

    it "feeds malformed data that the server rejects" \conninfo ->
      differential proxy conninfo \connection -> do
        _ <- exec connection "create temporary table conformance_copy_bad (id int4)"
        started <- execScenario "copy conformance_copy_bad from stdin" connection
        row <- putCopyData connection "not-a-number\n"
        ended <- putCopyEnd connection Nothing
        outcome <- drainResults connection
        pure (started, row, ended, outcome)