packages feed

postgresql-types-0.1: src/unit-tests/PostgresqlTypes/UuidSpec.hs

module PostgresqlTypes.UuidSpec (spec) where

import Data.Data (Proxy (Proxy))
import qualified Data.UUID as UUID
import qualified PostgresqlTypes.Uuid as Uuid
import Test.Hspec
import Test.QuickCheck
import qualified UnitTests.Scripts as Scripts

spec :: Spec
spec = do
  describe "Show/Read laws" do
    Scripts.testShowRead (Proxy @Uuid.Uuid)

  describe "IsScalar laws" do
    Scripts.testIsScalar (Proxy @Uuid.Uuid)

  describe "Constructors" do
    describe "fromUUID" do
      it "creates Uuid from UUID" do
        let uuid = UUID.nil
            pgUuid = Uuid.fromUUID uuid
        Uuid.toUUID pgUuid `shouldBe` uuid

  describe "Accessors" do
    describe "toUUID" do
      it "extracts UUID value" do
        let uuid = UUID.nil
            pgUuid = Uuid.fromUUID uuid
        Uuid.toUUID pgUuid `shouldBe` uuid

  describe "Property Tests" do
    it "roundtrips through toUUID and fromUUID" do
      property \(uuid :: UUID.UUID) ->
        let pgUuid = Uuid.fromUUID uuid
         in Uuid.toUUID pgUuid === uuid

    it "roundtrips through fromUUID and toUUID" do
      property \(pgUuid :: Uuid.Uuid) ->
        let uuid = Uuid.toUUID pgUuid
            pgUuid' = Uuid.fromUUID uuid
         in pgUuid' === pgUuid