packages feed

cardano-addresses-4.0.0: test/Command/Address/PaymentSpec.hs

{-# LANGUAGE FlexibleContexts #-}

module Command.Address.PaymentSpec
    ( spec
    ) where

import Prelude

import Test.Hspec
    ( Spec, SpecWith, it, shouldBe, shouldContain )
import Test.Utils
    ( cli, describeCmd )

spec :: Spec
spec = describeCmd [ "address", "payment" ] $ do
    specShelleyFromXPub defaultPhrase "1852H/1815H/0H/0/0" "0"
        "addr_test1vpu5vlrf4xkxv2qpwngf6cjhtw542ayty80v8dyr49rf5eg57c2qv"

    specShelleyFromXPub defaultPhrase "1852H/1815H/0H/0/0" "3"
        "addr1vdu5vlrf4xkxv2qpwngf6cjhtw542ayty80v8dyr49rf5eg0m9a08"

    specShelleyFromXPub defaultPhrase "1852H/1815H/0H/0/0" "testnet"
        "addr_test1vpu5vlrf4xkxv2qpwngf6cjhtw542ayty80v8dyr49rf5eg57c2qv"

    specShelleyFromXPub defaultPhrase "1852H/1815H/0H/0/0" "mainnet"
        "addr1v9u5vlrf4xkxv2qpwngf6cjhtw542ayty80v8dyr49rf5eg0kvk0f"

    specShelleyFromPub defaultPhrase "1852H/1815H/0H/0/0" "0"
        "addr_test1vpu5vlrf4xkxv2qpwngf6cjhtw542ayty80v8dyr49rf5eg57c2qv"

    specShelleyFromPub defaultPhrase "1852H/1815H/0H/0/0" "3"
        "addr1vdu5vlrf4xkxv2qpwngf6cjhtw542ayty80v8dyr49rf5eg0m9a08"

    specShelleyFromPub defaultPhrase "1852H/1815H/0H/0/0" "testnet"
        "addr_test1vpu5vlrf4xkxv2qpwngf6cjhtw542ayty80v8dyr49rf5eg57c2qv"

    specShelleyFromPub defaultPhrase "1852H/1815H/0H/0/0" "mainnet"
        "addr1v9u5vlrf4xkxv2qpwngf6cjhtw542ayty80v8dyr49rf5eg0kvk0f"

    specShelleyFromKeyHash defaultPhrase "1852H/1815H/0H/0/0" "0"
        "addr_test1vpu5vlrf4xkxv2qpwngf6cjhtw542ayty80v8dyr49rf5eg57c2qv"

    specShelleyFromKeyHash defaultPhrase "1852H/1815H/0H/0/0" "3"
        "addr1vdu5vlrf4xkxv2qpwngf6cjhtw542ayty80v8dyr49rf5eg0m9a08"

    specShelleyFromKeyHash defaultPhrase "1852H/1815H/0H/0/0" "testnet"
        "addr_test1vpu5vlrf4xkxv2qpwngf6cjhtw542ayty80v8dyr49rf5eg57c2qv"

    specShelleyFromKeyHash defaultPhrase "1852H/1815H/0H/0/0" "mainnet"
        "addr1v9u5vlrf4xkxv2qpwngf6cjhtw542ayty80v8dyr49rf5eg0kvk0f"

    specMalformedNetwork "💩"

    specInvalidNetwork "42"
    specInvalidNetwork "staging"

specShelleyFromXPub :: [String] -> String -> String -> String -> SpecWith ()
specShelleyFromXPub phrase path networkTag want = it ("golden shelley (payment) " <> path) $ do
    out <- cli [ "key", "from-recovery-phrase", "shelley" ] (unwords phrase)
       >>= cli [ "key", "child", path ]
       >>= cli [ "key", "public", "--with-chain-code" ]
       >>= cli [ "address", "payment", "--network-tag", networkTag ]
    out `shouldBe` want

specShelleyFromPub :: [String] -> String -> String -> String -> SpecWith ()
specShelleyFromPub phrase path networkTag want = it ("golden shelley (payment) " <> path) $ do
    out <- cli [ "key", "from-recovery-phrase", "shelley" ] (unwords phrase)
       >>= cli [ "key", "child", path ]
       >>= cli [ "key", "public", "--without-chain-code" ]
       >>= cli [ "address", "payment", "--network-tag", networkTag ]
    out `shouldBe` want

specShelleyFromKeyHash :: [String] -> String -> String -> String -> SpecWith ()
specShelleyFromKeyHash phrase path networkTag want = it ("golden shelley (payment) " <> path) $ do
    out <- cli [ "key", "from-recovery-phrase", "shelley" ] (unwords phrase)
       >>= cli [ "key", "child", path ]
       >>= cli [ "key", "public", "--with-chain-code" ]
       >>= cli [ "key", "hash" ]
       >>= cli [ "address", "payment", "--network-tag", networkTag ]
    out `shouldBe` want

specMalformedNetwork :: String -> SpecWith ()
specMalformedNetwork networkTag = it ("malformed network " <> networkTag) $ do
    (out, err) <- cli [ "key", "from-recovery-phrase", "shelley" ] (unwords defaultPhrase)
        >>= cli [ "key", "public", "--with-chain-code" ]
        >>= cli [ "address", "payment", "--network-tag", networkTag ]
    out `shouldBe` ""
    err `shouldContain` "Invalid network tag. Must be an integer value or one of the allowed keywords:"
    err `shouldContain` "Usage"

specInvalidNetwork :: String -> SpecWith ()
specInvalidNetwork networkTag = it ("invalid network " <> networkTag) $ do
    (out, err) <- cli [ "key", "from-recovery-phrase", "shelley" ] (unwords defaultPhrase)
        >>= cli [ "key", "public", "--with-chain-code" ]
        >>= cli [ "address", "payment", "--network-tag", networkTag ]
    out `shouldBe` ""
    err `shouldContain` "Invalid network tag."

defaultPhrase :: [String]
defaultPhrase =
    [ "art", "forum", "devote", "street", "sure"
    , "rather", "head", "chuckle", "guard", "poverty"
    , "release", "quote", "oak", "craft", "enemy"
    ]