packages feed

paseto-0.1.0.0: test/Test/Crypto/Paseto/Token/Claim/Gen.hs

{-# LANGUAGE DataKinds #-}
{-# LANGUAGE GADTs #-}

module Test.Crypto.Paseto.Token.Claim.Gen
  ( genUnregisteredClaimKey
  , genCustomClaimKey
  , genClaimKey
  , genIssuer
  , genSubject
  , genAudience
  , genExpiration
  , genNotBefore
  , genIssuedAt
  , genTokenIdentifier
  , genClaim
  , genAesonString
  , genUTCTime
  ) where

import Crypto.Paseto.Token.Claim
  ( Audience (..)
  , Claim (..)
  , ClaimKey (..)
  , Expiration (..)
  , IssuedAt (..)
  , Issuer (..)
  , NotBefore (..)
  , Subject (..)
  , TokenIdentifier (..)
  , UnregisteredClaimKey
  , mkUnregisteredClaimKey
  , parseClaimKey
  , registeredClaimKeys
  )
import qualified Data.Set as Set
import Data.Text ( Text )
import Hedgehog ( Gen )
import qualified Hedgehog.Gen as Gen
import qualified Hedgehog.Range as Range
import Prelude
import Test.Gen ( genAesonString, genUTCTime )

genUnregisteredClaimKey :: Gen UnregisteredClaimKey
genUnregisteredClaimKey =
  Gen.mapMaybe
    (mkUnregisteredClaimKey)
    (Gen.text (Range.constant 0 1024) Gen.unicodeAll)

genCustomClaimKey :: Gen ClaimKey
genCustomClaimKey = Gen.filter isNotRegistered (parseClaimKey <$> genText)
  where
    isNotRegistered :: ClaimKey -> Bool
    isNotRegistered k = Set.notMember k registeredClaimKeys

    genText :: Gen Text
    genText = Gen.text (Range.constant 0 1024) Gen.unicodeAll

genClaimKey :: Gen ClaimKey
genClaimKey =
  Gen.choice (genCustomClaimKey : map pure (Set.toList registeredClaimKeys))

genIssuer :: Gen Issuer
genIssuer = Issuer <$> Gen.text (Range.constant 0 1024) Gen.unicodeAll

genSubject :: Gen Subject
genSubject = Subject <$> Gen.text (Range.constant 0 1024) Gen.unicodeAll

genAudience :: Gen Audience
genAudience = Audience <$> Gen.text (Range.constant 0 1024) Gen.unicodeAll

genExpiration :: Gen Expiration
genExpiration = Expiration <$> genUTCTime

genNotBefore :: Gen NotBefore
genNotBefore = NotBefore <$> genUTCTime

genIssuedAt :: Gen IssuedAt
genIssuedAt = IssuedAt <$> genUTCTime

genTokenIdentifier :: Gen TokenIdentifier
genTokenIdentifier = TokenIdentifier <$> Gen.text (Range.constant 0 1024) Gen.unicodeAll

genClaim :: Gen Claim
genClaim =
  Gen.choice
    [ IssuerClaim <$> genIssuer
    , SubjectClaim <$> genSubject
    , AudienceClaim <$> genAudience
    , ExpirationClaim <$> genExpiration
    , NotBeforeClaim <$> genNotBefore
    , IssuedAtClaim <$> genIssuedAt
    , TokenIdentifierClaim <$> genTokenIdentifier
    , CustomClaim <$> genUnregisteredClaimKey <*> genAesonString
    ]