43 lines
1.7 KiB
Haskell
43 lines
1.7 KiB
Haskell
module Nuthatch.Test.Identity
|
||
( tests
|
||
) where
|
||
|
||
import Hedgehog (Property, assert, forAll, property, (===))
|
||
import qualified Hedgehog.Gen as Gen
|
||
import qualified Hedgehog.Range as Range
|
||
import Nuthatch.Paths (encodeUserId)
|
||
import Nuthatch.Types
|
||
import Test.Tasty (TestTree, testGroup)
|
||
import Test.Tasty.HUnit ((@?=), testCase)
|
||
import Test.Tasty.Hedgehog (testProperty)
|
||
|
||
tests :: TestTree
|
||
tests = testGroup "identities"
|
||
[ testProperty "root labels parse back to the same root" propRootLabels
|
||
, testProperty "mutation kind labels parse back to the same kind" propKindLabels
|
||
, testCase "issuer and subject identity encoding remains stable" $
|
||
encodeUserId "https://issuer.example" "subject-α"
|
||
@?= UserId "e0240ab33521a1882fb647a79f7fd3c74c9b6348b29bdb14e572204517882859"
|
||
, testProperty "issuer and subject inputs are separated" propUserIdentitySeparation
|
||
]
|
||
|
||
propRootLabels :: Property
|
||
propRootLabels = property $ do
|
||
root <- forAll (Gen.element [Personal, Shared])
|
||
parseRoot (rootLabel root) === Just root
|
||
|
||
propKindLabels :: Property
|
||
propKindLabels = property $ do
|
||
kind <- forAll (Gen.element [Put, Delete])
|
||
parseKind (kindLabel kind) === Just kind
|
||
|
||
propUserIdentitySeparation :: Property
|
||
propUserIdentitySeparation = property $ do
|
||
issuer <- forAll genIdentityPart
|
||
subject <- forAll genIdentityPart
|
||
otherIssuer <- forAll (Gen.filter (/= issuer) genIdentityPart)
|
||
other <- forAll (Gen.filter (/= subject) genIdentityPart)
|
||
assert (encodeUserId issuer subject /= encodeUserId otherIssuer subject)
|
||
assert (encodeUserId issuer subject /= encodeUserId issuer other)
|
||
where
|
||
genIdentityPart = Gen.text (Range.linear 1 32) Gen.alphaNum
|