module Signet.UnstableTest where import qualified Control.Monad.Catch as Exception 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 :: (Exception.MonadThrow io, Monad tree) => Test.Test io tree -> tree () spec :: forall (io :: * -> *) (tree :: * -> *). (MonadThrow io, Monad tree) => Test io tree -> tree () spec Test io tree test = Test io tree -> String -> tree () -> tree () forall (io :: * -> *) (tree :: * -> *). Test io tree -> String -> tree () -> tree () Test.describe Test io tree test String "Signet.Unstable" (tree () -> tree ()) -> tree () -> tree () forall a b. (a -> b) -> a -> b $ do Test io tree -> String -> tree () -> tree () forall (io :: * -> *) (tree :: * -> *). Test io tree -> String -> tree () -> tree () Test.describe Test io 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 io tree -> String -> tree () -> tree () forall (io :: * -> *) (tree :: * -> *). Test io tree -> String -> tree () -> tree () Test.describe Test io 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 io tree -> String -> tree () -> tree () forall (io :: * -> *) (tree :: * -> *). Test io tree -> String -> tree () -> tree () Test.describe Test io 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 io tree -> String -> tree () -> tree () forall (io :: * -> *) (tree :: * -> *). Test io tree -> String -> tree () -> tree () Test.describe Test io tree test String "verifyWebhookWith" (tree () -> tree ()) -> tree () -> tree () forall a b. (a -> b) -> a -> b $ do Test io tree -> String -> io () -> tree () forall (io :: * -> *) (tree :: * -> *). Test io tree -> String -> io () -> tree () Test.it Test io 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 Signature signature <- Either UnknownSignature Signature -> io Signature forall e (m :: * -> *) a. (Exception e, MonadThrow m) => Either e a -> m a Either.throw (Either UnknownSignature Signature -> io Signature) -> io (Either UnknownSignature Signature) -> io Signature forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b =<< Either InvalidSignature (Either UnknownSignature Signature) -> io (Either UnknownSignature Signature) forall e (m :: * -> *) a. (Exception e, MonadThrow m) => Either e a -> m a Either.throw (ByteString -> Either InvalidSignature (Either UnknownSignature Signature) Signature.parse ByteString byteString) Test io tree -> Either SignetException Signature -> Either SignetException Signature -> io () forall (io :: * -> *) a (tree :: * -> *). (HasCallStack, Applicative io, Eq a, Show a) => Test io tree -> a -> a -> io () Test.assertEq Test io tree test Either SignetException Signature result (Signature -> Either SignetException Signature forall a b. b -> Either a b Right Signature signature) Test io tree -> String -> io () -> tree () forall (io :: * -> *) (tree :: * -> *). Test io tree -> String -> io () -> tree () Test.it Test io 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 io tree -> Either SignetException Signature -> Either SignetException Signature -> io () forall (io :: * -> *) a (tree :: * -> *). (HasCallStack, Applicative io, Eq a, Show a) => Test io tree -> a -> a -> io () Test.assertEq Test io 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 io tree -> String -> io () -> tree () forall (io :: * -> *) (tree :: * -> *). Test io tree -> String -> io () -> tree () Test.it Test io 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 io tree -> Either SignetException Signature -> Either SignetException Signature -> io () forall (io :: * -> *) a (tree :: * -> *). (HasCallStack, Applicative io, Eq a, Show a) => Test io tree -> a -> a -> io () Test.assertEq Test io 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))