packages feed

signable-0.1: test/SignableSpec.hs

module SignableSpec
  ( spec,
  )
where

import Data.ProtoLens.Arbitrary
import Data.Signable
import Data.Signable.Import
import Lens.Micro
import Proto.Basic
import Proto.Basic_Fields
import Proto.SignableOrphan ()
import Test.Hspec
import Test.QuickCheck
import Test.QuickCheck.Instances ()

spec :: Spec
spec = before (newRandomPrvKey AlgSecp256k1) $ do
  it "is able to sign proto message" $
    \k -> property $ \x0 ->
      sign k (unArbitraryMessage x0 :: Payload)
        `shouldSatisfy` isJust
  it "is able to verify valid proto message signature" $
    \k -> property $ \x0 -> do
      let x :: Payload = unArbitraryMessage x0
      maybe
        False
        (\s -> verify (derivePubKey k) s x)
        (sign k x)
        `shouldBe` True
  it "is able to discard invalid proto message signature" $
    \k -> property $ \x0 -> do
      let x :: Payload = unArbitraryMessage x0
      let y = x & (amount . amount) +~ 1
      maybe
        False
        (\s -> verify (derivePubKey k) s y)
        (sign k x)
        `shouldBe` False