packages feed

hasql-1.10: src/library-tests/Sharing/ByUnit/Encoders/UuidSpec.hs

module Sharing.ByUnit.Encoders.UuidSpec (spec) where

import Data.UUID qualified as UUID
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 Test.Hspec
import Prelude

spec :: SpecWith (Text, Word16)
spec = do
  describe "UUID Encoders" do
    it "encodes UUID correctly" \config -> do
      Scripts.onPreparableConnection config \connection -> do
        let statement =
              Statement.preparable
                "select $1 = '550e8400-e29b-41d4-a716-446655440000'::uuid"
                (Encoders.param (Encoders.nonNullable Encoders.uuid))
                (Decoders.singleRow (Decoders.column (Decoders.nonNullable Decoders.bool)))
        case UUID.fromString "550e8400-e29b-41d4-a716-446655440000" of
          Just testUuid -> do
            result <- Connection.use connection (Session.statement testUuid statement)
            result `shouldBe` Right True
          Nothing -> expectationFailure "Failed to parse test UUID"

    it "roundtrips UUID correctly" \config -> do
      Scripts.onPreparableConnection config \connection -> do
        let statement =
              Statement.preparable
                "select $1"
                (Encoders.param (Encoders.nonNullable Encoders.uuid))
                (Decoders.singleRow (Decoders.column (Decoders.nonNullable Decoders.uuid)))
        case UUID.fromString "a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a11" of
          Just testUuid -> do
            result <- Connection.use connection (Session.statement testUuid statement)
            result `shouldBe` Right testUuid
          Nothing -> expectationFailure "Failed to parse test UUID"

    it "encodes nil UUID correctly" \config -> do
      Scripts.onPreparableConnection config \connection -> do
        let statement =
              Statement.preparable
                "select $1"
                (Encoders.param (Encoders.nonNullable Encoders.uuid))
                (Decoders.singleRow (Decoders.column (Decoders.nonNullable Decoders.uuid)))
        result <- Connection.use connection (Session.statement UUID.nil statement)
        result `shouldBe` Right UUID.nil