cardano-addresses-4.0.0: test/Command/Script/ValidationSpec.hs
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE LambdaCase #-}
{-# LANGUAGE QuasiQuotes #-}
module Command.Script.ValidationSpec
( spec
) where
import Prelude
import Cardano.Address.Script
( ErrRecommendedValidateScript (..)
, ErrValidateScript (..)
, ValidationLevel (..)
, prettyErrValidateScript
)
import Data.String.Interpolate
( iii )
import Test.Hspec
( Spec, SpecWith, it, shouldBe, shouldContain )
import Test.Utils
( cli, describeCmd )
spec :: Spec
spec = do
describeCmd [ "script", "validate"] $ do
specScriptValidated RequiredValidation
[iii|#{verKeyH1}|]
specScriptValidated RequiredValidation
[iii|at_least 2 [ #{verKeyH1}, #{verKeyH2}, #{verKeyH3} ]|]
specScriptValidated RequiredValidation
[iii|at_least 2 [ #{verKeyH1}, #{verKeyH2}, active_from 10, active_until 25]|]
specScriptValidated RequiredValidation
[iii|at_least 2 [ #{verKeyH1}, #{verKeyH2}, active_from 6, active_until 15]|]
specScriptValidated RequiredValidation
[iii|at_least 2 [ #{verKeyH1}, #{verKeyH2}, active_from 6, active_until 25]|]
specScriptValidated RequiredValidation
[iii|all []|]
specScriptNotValidated Malformed RequiredValidation
[iii|any [ #{verKeyH1}, #{verKeyH2}, active_from a]|]
specScriptNotValidated (NotRecommended EmptyList) RecommendedValidation
[iii|all []|]
specScriptValidated RequiredValidation
[iii|at_least 2 [ active_from 11, active_until 25]|]
specScriptValidated RequiredValidation
[iii|at_least 2 [ #{verKeyH1}, active_from 11, active_until 25]|]
specScriptNotValidated (NotRecommended ListTooSmall) RecommendedValidation
[iii|at_least 2 [ #{verKeyH1}, active_from 11, active_until 25]|]
specScriptValidated RequiredValidation
[iii|at_least 2 [ #{verKeyH1}, active_from 11, active_until 25, active_until 30]|]
specScriptNotValidated (NotRecommended RedundantTimelocks) RecommendedValidation
[iii|at_least 1 [ #{verKeyH1}, active_from 11, active_until 25, active_until 30]|]
specScriptValidated RequiredValidation
[iii|any [ #{verKeyH1}, #{verKeyH2}, #{verKeyH2}]|]
specScriptNotValidated (NotRecommended DuplicateSignatures) RecommendedValidation
[iii|any [ #{verKeyH1}, #{verKeyH2}, #{verKeyH2}]|]
specScriptValidated RequiredValidation
[iii|at_least 0 [ #{verKeyH1}, #{verKeyH2} ]|]
specScriptNotValidated (NotRecommended MZero) RecommendedValidation
[iii|at_least 0 [ #{verKeyH1}, #{verKeyH2} ]|]
specScriptNotValidated NotUniformKeyType RequiredValidation
[iii|any [ #{verKeyH1}, #{verKeyH4}]|]
specScriptNotValidated NotUniformKeyType RecommendedValidation
[iii|at_least 1 [ #{verKeyH1}, #{verKeyH4} ]|]
specScriptValidated RequiredValidation
[iii|all [ #{verKeyH5}, active_from 5001]|]
specScriptValidated RequiredValidation
[iii|all [ #{verKeyH6}, active_from 5001]|]
specScriptValidated RequiredValidation
[iii|all [ #{verKeyH7}, active_from 5001]|]
specScriptValidated RequiredValidation
[iii|any [ #{verKeyH5}, all [ active_from 5001, active_until 6001]]|]
specScriptValidated RequiredValidation
[iii|any [ #{verKeyH6}, all [ active_from 5001, active_until 6001]]|]
specScriptValidated RequiredValidation
[iii|any [ #{verKeyH7}, all [ active_from 5001, active_until 6001]]|]
levelStr :: ValidationLevel -> String
levelStr = \case
RequiredValidation -> "--required"
RecommendedValidation -> "--recommended"
specScriptValidated :: ValidationLevel -> String -> SpecWith ()
specScriptValidated level script = it (script <> " => Validated.") $ do
out <- cli (["script", "validate", levelStr level, script]) ""
out `shouldBe` "Validated.\n"
specScriptNotValidated :: ErrValidateScript -> ValidationLevel -> String -> SpecWith ()
specScriptNotValidated errMsg level script = it (script <> " => " <> show errMsg) $ do
(out, err) <- cli (["script", "validate", levelStr level, script]) ""
out `shouldBe` ("" :: String)
err `shouldContain` prettyErrValidateScript errMsg
verKeyH1 :: String
verKeyH1 = "addr_shared_vkh1zxt0uvrza94h3hv4jpv0ttddgnwkvdgeyq8jf9w30mcs6y8w3nq"
verKeyH2 :: String
verKeyH2 = "addr_shared_vkh1y3zl4nqgm96ankt96dsdhc86vd5geny0wr7hu8cpzdfcqskq2cp"
verKeyH3 :: String
verKeyH3 = "addr_shared_vkh175wsm9ckhm3snwcsn72543yguxeuqm7v9r6kl6gx57h8gdydcd9"
verKeyH4 :: String
verKeyH4 = "stake_shared_vkh1nqc00hvlc6cq0sfhretk0rmzw8dywmusp8retuqnnxzajtzhjg5"
verKeyH5 :: String
verKeyH5 = "drep1y2qxs6anwflkqfvpxzg30k8pesr6gy8pgdmd8zppq8ffnksapjznm"
verKeyH6 :: String
verKeyH6 = "cc_cold1zfhc368fgydj0hx38qal2yeh8596q59vf4z2cpk4k6yp4hqy3mpsx"
verKeyH7 :: String
verKeyH7 = "cc_hot1qg6ck5scr3y0wjzf9jjxjl7wcslpy4yfzjesxyw5qg4knyg9ckh0d"