patrol-0.1.0.1: source/test-suite/Patrol/Type/EventIdSpec.hs
{-# LANGUAGE QuasiQuotes #-}
{-# LANGUAGE TypeApplications #-}
module Patrol.Type.EventIdSpec where
import qualified Data.Aeson as Aeson
import qualified Data.Aeson.QQ.Simple as Aeson
import qualified Data.Text as Text
import qualified Data.UUID as Uuid
import qualified Data.UUID.V4 as Uuid
import qualified Patrol.Type.EventId as EventId
import qualified Test.Hspec as Hspec
spec :: Hspec.Spec
spec = Hspec.describe "Patrol.Type.EventId" $ do
Hspec.describe "fromUuid" $ do
Hspec.it "converts from UUID" $ do
uuid <- Uuid.nextRandom
EventId.fromUuid uuid `Hspec.shouldBe` EventId.EventId uuid
Hspec.describe "intoUuid" $ do
Hspec.it "converts into UUID" $ do
uuid <- Uuid.nextRandom
EventId.intoUuid (EventId.fromUuid uuid) `Hspec.shouldBe` uuid
Hspec.describe "random" $ do
Hspec.it "generates a non-nil UUID" $ do
eventId <- EventId.random
eventId `Hspec.shouldNotBe` EventId.empty
Hspec.describe "intoText" $ do
Hspec.it "converts into text" $ do
let eventId = EventId.fromUuid $ Uuid.fromWords64 0x0011223344556677 0x8899aabbccddeeff
EventId.intoText eventId `Hspec.shouldBe` Text.pack "00112233445566778899aabbccddeeff"
Hspec.describe "fromText" $ do
Hspec.it "converts from text" $ do
let eventId = EventId.fromUuid $ Uuid.fromWords64 0x0011223344556677 0x8899aabbccddeeff
EventId.fromText (Text.pack "00112233445566778899aabbccddeeff") `Hspec.shouldBe` Just eventId
Hspec.it "succeeds with uppercase digits" $ do
let eventId = EventId.fromUuid $ Uuid.fromWords64 0x0011223344556677 0x8899aabbccddeeff
EventId.fromText (Text.pack "00112233445566778899AABBCCDDEEFF") `Hspec.shouldBe` Just eventId
Hspec.it "fails with not enough digits" $ do
EventId.fromText (Text.pack "0123456789abcdef0123456789abcde") `Hspec.shouldBe` Nothing
Hspec.it "fails with too many digits" $ do
EventId.fromText (Text.pack "0123456789abcdef0123456789abcdef0") `Hspec.shouldBe` Nothing
Hspec.it "fails with invalid hexadecimal" $ do
EventId.fromText (Text.pack "Z123456789abcdef0123456789abcdef") `Hspec.shouldBe` Nothing
EventId.fromText (Text.pack "0123456789Zbcdef0123456789abcdef") `Hspec.shouldBe` Nothing
EventId.fromText (Text.pack "0123456789abcdef0123456789Zbcdef") `Hspec.shouldBe` Nothing
Hspec.describe "FromJSON" $ do
Hspec.it "works" $ do
let json = [Aeson.aesonQQ| "00112233445566778899aabbccddeeff" |]
eventId = EventId.fromUuid $ Uuid.fromWords64 0x0011223344556677 0x8899aabbccddeeff
Aeson.fromJSON json `Hspec.shouldBe` Aeson.Success eventId
Hspec.it "fails with not enough digits" $ do
let json = [Aeson.aesonQQ| "" |]
Aeson.fromJSON @EventId.EventId json `Hspec.shouldBe` Aeson.Error "invalid EventId"
Hspec.it "fails with the wrong type" $ do
let json = [Aeson.aesonQQ| null |]
Aeson.fromJSON @EventId.EventId json `Hspec.shouldBe` Aeson.Error "parsing EventId failed, expected String, but encountered Null"
Hspec.describe "ToJSON" $ do
Hspec.it "works" $ do
let eventId = EventId.fromUuid $ Uuid.fromWords64 0x0011223344556677 0x8899aabbccddeeff
json = [Aeson.aesonQQ| "00112233445566778899aabbccddeeff" |]
Aeson.toJSON eventId `Hspec.shouldBe` json