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
""