module Signet.UnstableTest where import qualified Data.ByteString.Char8 as Ascii import qualified Data.Time as Time import qualified Signet.Unstable as Signet import qualified Signet.Unstable.Exception.SignetException as SignetException import qualified Signet.Unstable.Exception.ToleranceException as ToleranceException import qualified Signet.Unstable.Exception.VerificationException as VerificationException import qualified Signet.Unstable.Extra.Either as Either import qualified Signet.Unstable.Type.Message as Message import qualified Signet.Unstable.Type.Signature as Signature import qualified Signet.Unstable.Type.Signatures as Signatures import qualified Signet.Unstable.Type.Test as Test import qualified Signet.Unstable.Type.Tolerance as Tolerance import qualified Signet.Unstable.Type.Verifier as Verifier spec :: (Monad tree) => Test.Test tree -> tree () spec :: forall (tree :: * -> *). Monad tree => Test tree -> tree () spec Test tree test = Test tree -> String -> tree () -> tree () forall (spec :: * -> *). Test spec -> String -> spec () -> spec () Test.describe Test tree test String "Signet.Unstable" (tree () -> tree ()) -> tree () -> tree () forall a b. (a -> b) -> a -> b $ do Test tree -> String -> tree () -> tree () forall (spec :: * -> *). Test spec -> String -> spec () -> spec () Test.describe Test tree test String "verifyWebhookText" (tree () -> tree ()) -> tree () -> tree () forall a b. (a -> b) -> a -> b $ do () -> tree () forall a. a -> tree a forall (f :: * -> *) a. Applicative f => a -> f a pure () Test tree -> String -> tree () -> tree () forall (spec :: * -> *). Test spec -> String -> spec () -> spec () Test.describe Test tree test String "verifyWebhookByteString" (tree () -> tree ()) -> tree () -> tree () forall a b. (a -> b) -> a -> b $ do () -> tree () forall a. a -> tree a forall (f :: * -> *) a. Applicative f => a -> f a pure () Test tree -> String -> tree () -> tree () forall (spec :: * -> *). Test spec -> String -> spec () -> spec () Test.describe Test tree test String "verifyWebhook" (tree () -> tree ()) -> tree () -> tree () forall a b. (a -> b) -> a -> b $ do () -> tree () forall a. a -> tree a forall (f :: * -> *) a. Applicative f => a -> f a pure () Test tree -> String -> tree () -> tree () forall (spec :: * -> *). Test spec -> String -> spec () -> spec () Test.describe Test tree test String "verifyWebhookWith" (tree () -> tree ()) -> tree () -> tree () forall a b. (a -> b) -> a -> b $ do Test tree -> String -> IO () -> tree () forall (spec :: * -> *). Test spec -> String -> IO () -> spec () Test.it Test tree test String "succeeds with a valid symmetric signature" (IO () -> tree ()) -> IO () -> tree () forall a b. (a -> b) -> a -> b $ do let tolerance :: Tolerance tolerance = Tolerance Tolerance.typical let now :: UTCTime now = Day -> DiffTime -> UTCTime Time.UTCTime (Year -> MonthOfYear -> MonthOfYear -> Day Time.fromGregorian Year 1970 MonthOfYear 1 MonthOfYear 1) DiffTime 0 Verifier verifier <- Either InvalidVerifier Verifier -> IO Verifier forall e (m :: * -> *) a. (Exception e, MonadThrow m) => Either e a -> m a Either.throw (Either InvalidVerifier Verifier -> IO Verifier) -> (ByteString -> Either InvalidVerifier Verifier) -> ByteString -> IO Verifier forall b c a. (b -> c) -> (a -> b) -> a -> c . ByteString -> Either InvalidVerifier Verifier Verifier.parse (ByteString -> IO Verifier) -> ByteString -> IO Verifier forall a b. (a -> b) -> a -> b $ String -> ByteString Ascii.pack String "whsec_bXlzZWNyZXRrZXkxMjM0NQ==" Message message <- Either InvalidMessage Message -> IO Message forall e (m :: * -> *) a. (Exception e, MonadThrow m) => Either e a -> m a Either.throw (Either InvalidMessage Message -> IO Message) -> (ByteString -> Either InvalidMessage Message) -> ByteString -> IO Message forall b c a. (b -> c) -> (a -> b) -> a -> c . ByteString -> Either InvalidMessage Message Message.parse (ByteString -> IO Message) -> ByteString -> IO Message forall a b. (a -> b) -> a -> b $ String -> ByteString Ascii.pack String "i.0.Hello, world!" let byteString :: ByteString byteString = String -> ByteString Ascii.pack String "v1,IywpE5NXy+JdAScgR7j5Pt59GjmazD7iJuVsQoRZFyw=" ([UnknownSignature] _, Signatures signatures) <- Either InvalidSignature ([UnknownSignature], Signatures) -> IO ([UnknownSignature], Signatures) forall e (m :: * -> *) a. (Exception e, MonadThrow m) => Either e a -> m a Either.throw (Either InvalidSignature ([UnknownSignature], Signatures) -> IO ([UnknownSignature], Signatures)) -> Either InvalidSignature ([UnknownSignature], Signatures) -> IO ([UnknownSignature], Signatures) forall a b. (a -> b) -> a -> b $ ByteString -> Either InvalidSignature ([UnknownSignature], Signatures) Signatures.parse ByteString byteString let result :: Either SignetException Signature result = Tolerance -> UTCTime -> Verifier -> Message -> Signatures -> Either SignetException Signature Signet.verifyWebhookWith Tolerance tolerance UTCTime now Verifier verifier Message message Signatures signatures Right Signature signature <- Either InvalidSignature (Either UnknownSignature Signature) -> IO (Either UnknownSignature Signature) forall e (m :: * -> *) a. (Exception e, MonadThrow m) => Either e a -> m a Either.throw (Either InvalidSignature (Either UnknownSignature Signature) -> IO (Either UnknownSignature Signature)) -> Either InvalidSignature (Either UnknownSignature Signature) -> IO (Either UnknownSignature Signature) forall a b. (a -> b) -> a -> b $ ByteString -> Either InvalidSignature (Either UnknownSignature Signature) Signature.parse ByteString byteString Test tree -> Either SignetException Signature -> Either SignetException Signature -> IO () forall a (tree :: * -> *). (HasCallStack, Eq a, Show a) => Test tree -> a -> a -> IO () Test.assertEq Test tree test Either SignetException Signature result (Signature -> Either SignetException Signature forall a b. b -> Either a b Right Signature signature) Test tree -> String -> IO () -> tree () forall (spec :: * -> *). Test spec -> String -> IO () -> spec () Test.it Test tree test String "fails with an invalid timestamp" (IO () -> tree ()) -> IO () -> tree () forall a b. (a -> b) -> a -> b $ do let tolerance :: Tolerance tolerance = Tolerance Tolerance.typical let now :: UTCTime now = Day -> DiffTime -> UTCTime Time.UTCTime (Year -> MonthOfYear -> MonthOfYear -> Day Time.fromGregorian Year 1970 MonthOfYear 1 MonthOfYear 1) DiffTime 0 Verifier verifier <- Either InvalidVerifier Verifier -> IO Verifier forall e (m :: * -> *) a. (Exception e, MonadThrow m) => Either e a -> m a Either.throw (Either InvalidVerifier Verifier -> IO Verifier) -> (ByteString -> Either InvalidVerifier Verifier) -> ByteString -> IO Verifier forall b c a. (b -> c) -> (a -> b) -> a -> c . ByteString -> Either InvalidVerifier Verifier Verifier.parse (ByteString -> IO Verifier) -> ByteString -> IO Verifier forall a b. (a -> b) -> a -> b $ String -> ByteString Ascii.pack String "whsec_bXlzZWNyZXRrZXkxMjM0NQ==" Message message <- Either InvalidMessage Message -> IO Message forall e (m :: * -> *) a. (Exception e, MonadThrow m) => Either e a -> m a Either.throw (Either InvalidMessage Message -> IO Message) -> (ByteString -> Either InvalidMessage Message) -> ByteString -> IO Message forall b c a. (b -> c) -> (a -> b) -> a -> c . ByteString -> Either InvalidMessage Message Message.parse (ByteString -> IO Message) -> ByteString -> IO Message forall a b. (a -> b) -> a -> b $ String -> ByteString Ascii.pack String "i.301.Hello, world!" ([UnknownSignature] _, Signatures signatures) <- Either InvalidSignature ([UnknownSignature], Signatures) -> IO ([UnknownSignature], Signatures) forall e (m :: * -> *) a. (Exception e, MonadThrow m) => Either e a -> m a Either.throw (Either InvalidSignature ([UnknownSignature], Signatures) -> IO ([UnknownSignature], Signatures)) -> (ByteString -> Either InvalidSignature ([UnknownSignature], Signatures)) -> ByteString -> IO ([UnknownSignature], Signatures) forall b c a. (b -> c) -> (a -> b) -> a -> c . ByteString -> Either InvalidSignature ([UnknownSignature], Signatures) Signatures.parse (ByteString -> IO ([UnknownSignature], Signatures)) -> ByteString -> IO ([UnknownSignature], Signatures) forall a b. (a -> b) -> a -> b $ String -> ByteString Ascii.pack String "v1,IywpE5NXy+JdAScgR7j5Pt59GjmazD7iJuVsQoRZFyw=" let result :: Either SignetException Signature result = Tolerance -> UTCTime -> Verifier -> Message -> Signatures -> Either SignetException Signature Signet.verifyWebhookWith Tolerance tolerance UTCTime now Verifier verifier Message message Signatures signatures Test tree -> Either SignetException Signature -> Either SignetException Signature -> IO () forall a (tree :: * -> *). (HasCallStack, Eq a, Show a) => Test tree -> a -> a -> IO () Test.assertEq Test tree test Either SignetException Signature result (SignetException -> Either SignetException Signature forall a b. a -> Either a b Left (ToleranceException -> SignetException SignetException.ToleranceException (ToleranceException -> SignetException) -> (Timestamp -> ToleranceException) -> Timestamp -> SignetException forall b c a. (b -> c) -> (a -> b) -> a -> c . Timestamp -> ToleranceException ToleranceException.MkToleranceException (Timestamp -> SignetException) -> Timestamp -> SignetException forall a b. (a -> b) -> a -> b $ Message -> Timestamp Message.timestamp Message message)) Test tree -> String -> IO () -> tree () forall (spec :: * -> *). Test spec -> String -> IO () -> spec () Test.it Test tree test String "fails with an invalid symmetric signature" (IO () -> tree ()) -> IO () -> tree () forall a b. (a -> b) -> a -> b $ do let tolerance :: Tolerance tolerance = Tolerance Tolerance.typical let now :: UTCTime now = Day -> DiffTime -> UTCTime Time.UTCTime (Year -> MonthOfYear -> MonthOfYear -> Day Time.fromGregorian Year 1970 MonthOfYear 1 MonthOfYear 1) DiffTime 0 Verifier verifier <- Either InvalidVerifier Verifier -> IO Verifier forall e (m :: * -> *) a. (Exception e, MonadThrow m) => Either e a -> m a Either.throw (Either InvalidVerifier Verifier -> IO Verifier) -> (ByteString -> Either InvalidVerifier Verifier) -> ByteString -> IO Verifier forall b c a. (b -> c) -> (a -> b) -> a -> c . ByteString -> Either InvalidVerifier Verifier Verifier.parse (ByteString -> IO Verifier) -> ByteString -> IO Verifier forall a b. (a -> b) -> a -> b $ String -> ByteString Ascii.pack String "whsec_bXlzZWNyZXRrZXkxMjM0NQ==" Message message <- Either InvalidMessage Message -> IO Message forall e (m :: * -> *) a. (Exception e, MonadThrow m) => Either e a -> m a Either.throw (Either InvalidMessage Message -> IO Message) -> (ByteString -> Either InvalidMessage Message) -> ByteString -> IO Message forall b c a. (b -> c) -> (a -> b) -> a -> c . ByteString -> Either InvalidMessage Message Message.parse (ByteString -> IO Message) -> ByteString -> IO Message forall a b. (a -> b) -> a -> b $ String -> ByteString Ascii.pack String "i.0.Hello, world!" ([UnknownSignature] _, Signatures signatures) <- Either InvalidSignature ([UnknownSignature], Signatures) -> IO ([UnknownSignature], Signatures) forall e (m :: * -> *) a. (Exception e, MonadThrow m) => Either e a -> m a Either.throw (Either InvalidSignature ([UnknownSignature], Signatures) -> IO ([UnknownSignature], Signatures)) -> (ByteString -> Either InvalidSignature ([UnknownSignature], Signatures)) -> ByteString -> IO ([UnknownSignature], Signatures) forall b c a. (b -> c) -> (a -> b) -> a -> c . ByteString -> Either InvalidSignature ([UnknownSignature], Signatures) Signatures.parse (ByteString -> IO ([UnknownSignature], Signatures)) -> ByteString -> IO ([UnknownSignature], Signatures) forall a b. (a -> b) -> a -> b $ String -> ByteString Ascii.pack String "v1,0000000000000000000000000000000000000000000=" let result :: Either SignetException Signature result = Tolerance -> UTCTime -> Verifier -> Message -> Signatures -> Either SignetException Signature Signet.verifyWebhookWith Tolerance tolerance UTCTime now Verifier verifier Message message Signatures signatures Test tree -> Either SignetException Signature -> Either SignetException Signature -> IO () forall a (tree :: * -> *). (HasCallStack, Eq a, Show a) => Test tree -> a -> a -> IO () Test.assertEq Test tree test Either SignetException Signature result (SignetException -> Either SignetException Signature forall a b. a -> Either a b Left (VerificationException -> SignetException SignetException.VerificationException (VerificationException -> SignetException) -> (Id -> VerificationException) -> Id -> SignetException forall b c a. (b -> c) -> (a -> b) -> a -> c . Id -> VerificationException VerificationException.MkVerificationException (Id -> SignetException) -> Id -> SignetException forall a b. (a -> b) -> a -> b $ Message -> Id Message.id_ Message message))