-- | Coverage for 'Pqi.sendQuery': submitting a command without waiting,
-- then collecting its results, including multi-statement scripts, a mid-script
-- error, and the empty query.
module Pqi.Conformance.Operation.SendQuery
  ( spec,
  )
where

import qualified Pqi
import Pqi.Conformance.Harness
import Pqi.Conformance.Prelude
import Pqi.Conformance.Scenario (drainResults)
import Test.Hspec

spec :: Pqi.Adapter -> SpecWith ByteString
spec :: Adapter -> SpecWith ByteString
spec Adapter
adapter =
  String -> SpecWith ByteString -> SpecWith ByteString
forall a. HasCallStack => String -> SpecWith a -> SpecWith a
describe String
"sendQuery" do
    let sendAndDrain :: ByteString -> ByteString -> Expectation
sendAndDrain ByteString
sql ByteString
conninfo =
          Adapter
-> ByteString
-> (Connection -> IO (Bool, [ResultObservation]))
-> Expectation
forall a.
(Eq a, Show a, HasCallStack) =>
Adapter -> ByteString -> (Connection -> IO a) -> Expectation
differential Adapter
adapter ByteString
conninfo \Connection
connection -> do
            sent <- Connection -> ByteString -> IO Bool
Pqi.sendQuery Connection
connection ByteString
sql
            results <- drainResults connection
            pure (sent, results)
    String
-> (ByteString -> Expectation)
-> SpecWith (Arg (ByteString -> Expectation))
forall a.
(HasCallStack, Example a) =>
String -> a -> SpecWith (Arg a)
it String
"sends a query and collects its result"
      ((ByteString -> Expectation)
 -> SpecWith (Arg (ByteString -> Expectation)))
-> (ByteString -> Expectation)
-> SpecWith (Arg (ByteString -> Expectation))
forall a b. (a -> b) -> a -> b
$ ByteString -> ByteString -> Expectation
sendAndDrain ByteString
"select i, i * 10 from generate_series (1, 3) as i"
    String
-> (ByteString -> Expectation)
-> SpecWith (Arg (ByteString -> Expectation))
forall a.
(HasCallStack, Example a) =>
String -> a -> SpecWith (Arg a)
it String
"yields multiple results for multiple statements"
      ((ByteString -> Expectation)
 -> SpecWith (Arg (ByteString -> Expectation)))
-> (ByteString -> Expectation)
-> SpecWith (Arg (ByteString -> Expectation))
forall a b. (a -> b) -> a -> b
$ ByteString -> ByteString -> Expectation
sendAndDrain ByteString
"select 1; select 2, 3; select 4"
    String
-> (ByteString -> Expectation)
-> SpecWith (Arg (ByteString -> Expectation))
forall a.
(HasCallStack, Example a) =>
String -> a -> SpecWith (Arg a)
it String
"ends the results at a mid-script error"
      ((ByteString -> Expectation)
 -> SpecWith (Arg (ByteString -> Expectation)))
-> (ByteString -> Expectation)
-> SpecWith (Arg (ByteString -> Expectation))
forall a b. (a -> b) -> a -> b
$ ByteString -> ByteString -> Expectation
sendAndDrain ByteString
"select 1; select 1 / 0; select 3"
    String
-> (ByteString -> Expectation)
-> SpecWith (Arg (ByteString -> Expectation))
forall a.
(HasCallStack, Example a) =>
String -> a -> SpecWith (Arg a)
it String
"handles an empty string"
      ((ByteString -> Expectation)
 -> SpecWith (Arg (ByteString -> Expectation)))
-> (ByteString -> Expectation)
-> SpecWith (Arg (ByteString -> Expectation))
forall a b. (a -> b) -> a -> b
$ ByteString -> ByteString -> Expectation
sendAndDrain ByteString
""