packages feed

hasql-1.7: hspec/Hasql/PipelineSpec.hs

module Hasql.PipelineSpec (spec) where

import Hasql.TestingKit.Statements.BrokenSyntax qualified as BrokenSyntax
import Hasql.TestingKit.Statements.GenerateSeries qualified as GenerateSeries
import Hasql.TestingKit.Statements.WrongDecoder qualified as WrongDecoder
import Hasql.TestingKit.TestingDsl qualified as Dsl
import Test.Hspec
import Prelude

spec :: Spec
spec = do
  describe "Single-statement" do
    describe "Unprepared" do
      it "Collects results and sends params" do
        result <-
          Dsl.runPipelineOnLocalDb
            $ GenerateSeries.pipeline False GenerateSeries.Params {start = 0, end = 2}
        shouldBe result (Right [0 .. 2])

    describe "Prepared" do
      it "Collects results and sends params" do
        result <-
          Dsl.runPipelineOnLocalDb
            $ GenerateSeries.pipeline True GenerateSeries.Params {start = 0, end = 2}
        shouldBe result (Right [0 .. 2])

  describe "Multi-statement" do
    describe "On unprepared statements" do
      it "Collects results and sends params" do
        result <-
          Dsl.runPipelineOnLocalDb
            $ replicateM 2
            $ GenerateSeries.pipeline False GenerateSeries.Params {start = 0, end = 2}
        shouldBe result (Right [[0 .. 2], [0 .. 2]])

    describe "On prepared statements" do
      it "Collects results and sends params" do
        result <-
          Dsl.runPipelineOnLocalDb
            $ replicateM 2
            $ GenerateSeries.pipeline True GenerateSeries.Params {start = 0, end = 2}
        shouldBe result (Right [[0 .. 2], [0 .. 2]])

    describe "When a part in the middle fails" do
      describe "With query error" do
        it "Captures the error" do
          result <-
            Dsl.runPipelineOnLocalDb
              $ (,,)
              <$> GenerateSeries.pipeline True GenerateSeries.Params {start = 0, end = 2}
              <*> BrokenSyntax.pipeline True BrokenSyntax.Params {start = 0, end = 2}
              <*> GenerateSeries.pipeline True GenerateSeries.Params {start = 0, end = 2}
          case result of
            Left (Dsl.SessionError (Dsl.QueryError _ _ _)) -> pure ()
            _ -> expectationFailure $ "Unexpected result: " <> show result

        it "Leaves the connection usable" do
          result <-
            Dsl.runSessionOnLocalDb do
              tryError
                $ Dsl.runPipelineInSession
                $ (,,)
                <$> GenerateSeries.pipeline True GenerateSeries.Params {start = 0, end = 2}
                <*> BrokenSyntax.pipeline True BrokenSyntax.Params {start = 0, end = 2}
                <*> GenerateSeries.pipeline True GenerateSeries.Params {start = 0, end = 2}
              GenerateSeries.session True GenerateSeries.Params {start = 0, end = 0}
          shouldBe result (Right [0])

      describe "With decoding error" do
        it "Captures the error" do
          result <-
            Dsl.runPipelineOnLocalDb
              $ (,,)
              <$> GenerateSeries.pipeline True GenerateSeries.Params {start = 0, end = 2}
              <*> WrongDecoder.pipeline True WrongDecoder.Params {start = 0, end = 2}
              <*> GenerateSeries.pipeline True GenerateSeries.Params {start = 0, end = 2}
          case result of
            Left (Dsl.SessionError (Dsl.QueryError _ _ _)) -> pure ()
            _ -> expectationFailure $ "Unexpected result: " <> show result

        it "Leaves the connection usable" do
          result <-
            Dsl.runSessionOnLocalDb do
              tryError
                $ Dsl.runPipelineInSession
                $ (,,)
                <$> GenerateSeries.pipeline True GenerateSeries.Params {start = 0, end = 2}
                <*> WrongDecoder.pipeline True WrongDecoder.Params {start = 0, end = 2}
                <*> GenerateSeries.pipeline True GenerateSeries.Params {start = 0, end = 2}
              GenerateSeries.session True GenerateSeries.Params {start = 0, end = 0}
          shouldBe result (Right [0])