module Signet.Unstable.Type.SecretTest where

import qualified Data.ByteArray as ByteArray
import qualified Data.ByteString.Char8 as Ascii
import qualified Signet.Unstable.Exception.InvalidSecret as InvalidSecret
import qualified Signet.Unstable.Extra.Tasty as Tasty
import qualified Signet.Unstable.Type.Secret as Secret
import Test.Tasty.HUnit ((@?=))

spec :: Tasty.Spec
spec :: Spec
spec = TestName -> Spec -> Spec
Tasty.describe TestName
"Signet.Unstable.Type.Secret" (Spec -> Spec) -> Spec -> Spec
forall a b. (a -> b) -> a -> b
$ do
  TestName -> Spec -> Spec
Tasty.describe TestName
"parse" (Spec -> Spec) -> Spec -> Spec
forall a b. (a -> b) -> a -> b
$ do
    TestName -> Assertion -> Spec
Tasty.it TestName
"fails with invalid prefix" (Assertion -> Spec) -> Assertion -> Spec
forall a b. (a -> b) -> a -> b
$ do
      let byteString :: ByteString
byteString = TestName -> ByteString
Ascii.pack TestName
"invalid"
      let result :: Either InvalidSecret Secret
result = ByteString -> Either InvalidSecret Secret
Secret.parse ByteString
byteString
      Either InvalidSecret Secret
result Either InvalidSecret Secret
-> Either InvalidSecret Secret -> Assertion
forall a. (Eq a, Show a, HasCallStack) => a -> a -> Assertion
@?= InvalidSecret -> Either InvalidSecret Secret
forall a b. a -> Either a b
Left (ByteString -> InvalidSecret
InvalidSecret.MkInvalidSecret ByteString
byteString)

    TestName -> Assertion -> Spec
Tasty.it TestName
"fails with invalid input" (Assertion -> Spec) -> Assertion -> Spec
forall a b. (a -> b) -> a -> b
$ do
      let byteString :: ByteString
byteString = TestName -> ByteString
Ascii.pack TestName
"whsec_invalid"
      let result :: Either InvalidSecret Secret
result = ByteString -> Either InvalidSecret Secret
Secret.parse ByteString
byteString
      Either InvalidSecret Secret
result Either InvalidSecret Secret
-> Either InvalidSecret Secret -> Assertion
forall a. (Eq a, Show a, HasCallStack) => a -> a -> Assertion
@?= InvalidSecret -> Either InvalidSecret Secret
forall a b. a -> Either a b
Left (ByteString -> InvalidSecret
InvalidSecret.MkInvalidSecret ByteString
byteString)

    TestName -> Assertion -> Spec
Tasty.it TestName
"succeeds with valid input" (Assertion -> Spec) -> Assertion -> Spec
forall a b. (a -> b) -> a -> b
$ do
      let result :: Either InvalidSecret Secret
result = ByteString -> Either InvalidSecret Secret
Secret.parse (ByteString -> Either InvalidSecret Secret)
-> ByteString -> Either InvalidSecret Secret
forall a b. (a -> b) -> a -> b
$ TestName -> ByteString
Ascii.pack TestName
"whsec_MDEyMzQ1Njc4OQ=="
      let secret :: Secret
secret = ScrubbedBytes -> Secret
Secret.MkSecret (ScrubbedBytes -> Secret)
-> (ByteString -> ScrubbedBytes) -> ByteString -> Secret
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ByteString -> ScrubbedBytes
forall bin bout.
(ByteArrayAccess bin, ByteArray bout) =>
bin -> bout
ByteArray.convert (ByteString -> Secret) -> ByteString -> Secret
forall a b. (a -> b) -> a -> b
$ TestName -> ByteString
Ascii.pack TestName
"0123456789"
      Either InvalidSecret Secret
result Either InvalidSecret Secret
-> Either InvalidSecret Secret -> Assertion
forall a. (Eq a, Show a, HasCallStack) => a -> a -> Assertion
@?= Secret -> Either InvalidSecret Secret
forall a b. b -> Either a b
Right Secret
secret

  TestName -> Spec -> Spec
Tasty.describe TestName
"render" (Spec -> Spec) -> Spec -> Spec
forall a b. (a -> b) -> a -> b
$ do
    TestName -> Assertion -> Spec
Tasty.it TestName
"works" (Assertion -> Spec) -> Assertion -> Spec
forall a b. (a -> b) -> a -> b
$ do
      let secret :: Secret
secret = ScrubbedBytes -> Secret
Secret.MkSecret (ScrubbedBytes -> Secret)
-> (ByteString -> ScrubbedBytes) -> ByteString -> Secret
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ByteString -> ScrubbedBytes
forall bin bout.
(ByteArrayAccess bin, ByteArray bout) =>
bin -> bout
ByteArray.convert (ByteString -> Secret) -> ByteString -> Secret
forall a b. (a -> b) -> a -> b
$ TestName -> ByteString
Ascii.pack TestName
"0123456789"
      Secret -> ByteString
Secret.render Secret
secret ByteString -> ByteString -> Assertion
forall a. (Eq a, Show a, HasCallStack) => a -> a -> Assertion
@?= TestName -> ByteString
Ascii.pack TestName
"whsec_MDEyMzQ1Njc4OQ=="