packages feed

valiant-0.1.0.0: test/Valiant/Binary/UUIDSpec.hs

{-# OPTIONS_GHC -Wno-incomplete-uni-patterns #-}
module Valiant.Binary.UUIDSpec (spec) where

import Data.ByteString qualified as BS
import Data.UUID.Types qualified as UUID
import PgWire.Binary.Types (PgDecode (..), PgEncode (..))
import Valiant.Binary.UUID ()
import Test.Hspec

spec :: Spec
spec = do
  describe "UUID round-trip" $ do
    it "nil UUID" $ do
      let u = UUID.nil
      pgDecode (pgEncode u) `shouldBe` Right u

    it "known UUID" $ do
      let Just u = UUID.fromString "550e8400-e29b-41d4-a716-446655440000"
      pgDecode (pgEncode u) `shouldBe` Right u

    it "another UUID" $ do
      let Just u = UUID.fromString "6ba7b810-9dad-11d1-80b4-00c04fd430c8"
      pgDecode (pgEncode u) `shouldBe` Right u

  describe "UUID encode" $ do
    it "produces exactly 16 bytes" $ do
      let Just u = UUID.fromString "550e8400-e29b-41d4-a716-446655440000"
      BS.length (pgEncode u) `shouldBe` 16

    it "nil UUID encodes to 16 zero bytes" $
      pgEncode UUID.nil `shouldBe` BS.replicate 16 0

  describe "UUID decode errors" $ do
    it "fails on wrong byte count (15 bytes)" $ do
      let result = pgDecode (BS.replicate 15 0) :: Either String UUID.UUID
      result `shouldSatisfy` isLeft

    it "fails on wrong byte count (17 bytes)" $ do
      let result = pgDecode (BS.replicate 17 0) :: Either String UUID.UUID
      result `shouldSatisfy` isLeft

    it "fails on empty input" $ do
      let result = pgDecode BS.empty :: Either String UUID.UUID
      result `shouldSatisfy` isLeft

isLeft :: Either a b -> Bool
isLeft (Left _) = True
isLeft _ = False