module Signet.Unstable.Type.AsymmetricSignatureTest where

import qualified Crypto.Error as Error
import qualified Crypto.PubKey.Ed25519 as Ed25519
import qualified Data.ByteString.Char8 as Ascii
import qualified Signet.Unstable.Exception.InvalidAsymmetricSignature as InvalidAsymmetricSignature
import qualified Signet.Unstable.Extra.Tasty as Tasty
import qualified Signet.Unstable.Type.AsymmetricSignature as AsymmetricSignature
import Test.Tasty.HUnit ((@?=))

spec :: Tasty.Spec
spec :: Spec
spec = TestName -> Spec -> Spec
Tasty.describe TestName
"Signet.Unstable.Type.AsymmetricSignature" (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 input" (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 InvalidAsymmetricSignature AsymmetricSignature
result = ByteString -> Either InvalidAsymmetricSignature AsymmetricSignature
AsymmetricSignature.parse ByteString
byteString
      Either InvalidAsymmetricSignature AsymmetricSignature
result Either InvalidAsymmetricSignature AsymmetricSignature
-> Either InvalidAsymmetricSignature AsymmetricSignature
-> Assertion
forall a. (Eq a, Show a, HasCallStack) => a -> a -> Assertion
@?= InvalidAsymmetricSignature
-> Either InvalidAsymmetricSignature AsymmetricSignature
forall a b. a -> Either a b
Left (ByteString -> InvalidAsymmetricSignature
InvalidAsymmetricSignature.MkInvalidAsymmetricSignature 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 InvalidAsymmetricSignature AsymmetricSignature
result = ByteString -> Either InvalidAsymmetricSignature AsymmetricSignature
AsymmetricSignature.parse (ByteString
 -> Either InvalidAsymmetricSignature AsymmetricSignature)
-> ByteString
-> Either InvalidAsymmetricSignature AsymmetricSignature
forall a b. (a -> b) -> a -> b
$ TestName -> ByteString
Ascii.pack TestName
"QUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVotMDEyMzQ1Njc4OS1hYmNkZWZnaGlqa2xtbm9wcXJzdHV2cXh5eg=="
      Signature
signature <- CryptoFailable Signature -> IO Signature
forall a. CryptoFailable a -> IO a
Error.throwCryptoErrorIO (CryptoFailable Signature -> IO Signature)
-> (ByteString -> CryptoFailable Signature)
-> ByteString
-> IO Signature
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ByteString -> CryptoFailable Signature
forall ba. ByteArrayAccess ba => ba -> CryptoFailable Signature
Ed25519.signature (ByteString -> IO Signature) -> ByteString -> IO Signature
forall a b. (a -> b) -> a -> b
$ TestName -> ByteString
Ascii.pack TestName
"ABCDEFGHIJKLMNOPQRSTUVWXYZ-0123456789-abcdefghijklmnopqrstuvqxyz"
      Either InvalidAsymmetricSignature AsymmetricSignature
result Either InvalidAsymmetricSignature AsymmetricSignature
-> Either InvalidAsymmetricSignature AsymmetricSignature
-> Assertion
forall a. (Eq a, Show a, HasCallStack) => a -> a -> Assertion
@?= AsymmetricSignature
-> Either InvalidAsymmetricSignature AsymmetricSignature
forall a b. b -> Either a b
Right (Signature -> AsymmetricSignature
AsymmetricSignature.MkAsymmetricSignature Signature
signature)

  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
      AsymmetricSignature
asymmetricSignature <- (Signature -> AsymmetricSignature)
-> IO Signature -> IO AsymmetricSignature
forall a b. (a -> b) -> IO a -> IO b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap Signature -> AsymmetricSignature
AsymmetricSignature.MkAsymmetricSignature (IO Signature -> IO AsymmetricSignature)
-> (ByteString -> IO Signature)
-> ByteString
-> IO AsymmetricSignature
forall b c a. (b -> c) -> (a -> b) -> a -> c
. CryptoFailable Signature -> IO Signature
forall a. CryptoFailable a -> IO a
Error.throwCryptoErrorIO (CryptoFailable Signature -> IO Signature)
-> (ByteString -> CryptoFailable Signature)
-> ByteString
-> IO Signature
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ByteString -> CryptoFailable Signature
forall ba. ByteArrayAccess ba => ba -> CryptoFailable Signature
Ed25519.signature (ByteString -> IO AsymmetricSignature)
-> ByteString -> IO AsymmetricSignature
forall a b. (a -> b) -> a -> b
$ TestName -> ByteString
Ascii.pack TestName
"ABCDEFGHIJKLMNOPQRSTUVWXYZ-0123456789-abcdefghijklmnopqrstuvqxyz"
      AsymmetricSignature -> ByteString
AsymmetricSignature.render AsymmetricSignature
asymmetricSignature ByteString -> ByteString -> Assertion
forall a. (Eq a, Show a, HasCallStack) => a -> a -> Assertion
@?= TestName -> ByteString
Ascii.pack TestName
"QUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVotMDEyMzQ1Njc4OS1hYmNkZWZnaGlqa2xtbm9wcXJzdHV2cXh5eg=="