packages feed

hasql-2.0.0.0: src/library-tests/Integration/Sharing/Decoders/CitextSpec.hs

module Integration.Sharing.Decoders.CitextSpec (spec) where

import Hasql.Connection qualified as Connection
import Hasql.Decoders qualified as Decoders
import Hasql.Encoders qualified as Encoders
import Hasql.Session qualified as Session
import Hasql.Statement qualified as Statement
import Helpers.Scripts qualified as Scripts
import Prelude
import Test.Hspec

spec :: SpecWith Scripts.ScopeParams
spec = do
  describe "Citext Decoders" do
    it "decodes a citext value" \config -> do
      Scripts.onPreparableConnection config \connection -> do
        result <- Connection.use connection do
          catchError
            ( Session.statement ()
                $ Statement.unpreparable
                  "CREATE EXTENSION IF NOT EXISTS citext"
                  Encoders.noParams
                  Decoders.noResult
            )
            (const (pure ()))
          Session.statement ()
            $ Statement.preparable
              "select 'Hello World'::citext"
              mempty
              (Decoders.singleRow (Decoders.column (Decoders.nonNullable Decoders.citext)))
        result `shouldBe` Right "Hello World"

    it "decodes a citext value preserving case" \config -> do
      Scripts.onPreparableConnection config \connection -> do
        result <- Connection.use connection do
          catchError
            ( Session.statement ()
                $ Statement.unpreparable
                  "CREATE EXTENSION IF NOT EXISTS citext"
                  Encoders.noParams
                  Decoders.noResult
            )
            (const (pure ()))
          Session.statement ()
            $ Statement.preparable
              "select 'HeLLo WoRLd'::citext"
              mempty
              (Decoders.singleRow (Decoders.column (Decoders.nonNullable Decoders.citext)))
        result `shouldBe` Right "HeLLo WoRLd"

    it "decodes a nullable citext value" \config -> do
      Scripts.onPreparableConnection config \connection -> do
        result <- Connection.use connection do
          catchError
            ( Session.statement ()
                $ Statement.unpreparable
                  "CREATE EXTENSION IF NOT EXISTS citext"
                  Encoders.noParams
                  Decoders.noResult
            )
            (const (pure ()))
          Session.statement ()
            $ Statement.preparable
              "select null::citext"
              mempty
              (Decoders.singleRow (Decoders.column (Decoders.nullable Decoders.citext)))
        result `shouldBe` Right (Nothing :: Maybe Text)

    it "decodes citext case-insensitive comparison in SQL" \config -> do
      Scripts.onPreparableConnection config \connection -> do
        result <- Connection.use connection do
          catchError
            ( Session.statement ()
                $ Statement.unpreparable
                  "CREATE EXTENSION IF NOT EXISTS citext"
                  Encoders.noParams
                  Decoders.noResult
            )
            (const (pure ()))
          Session.statement ()
            $ Statement.preparable
              "select 'hello'::citext = 'HELLO'::citext"
              mempty
              (Decoders.singleRow (Decoders.column (Decoders.nonNullable Decoders.bool)))
        result `shouldBe` Right True