Skip to content

Commit

Permalink
fix variant error messages
Browse files Browse the repository at this point in the history
add full suite of menmonic malformed parsing test
  • Loading branch information
paolino committed May 24, 2022
1 parent 7b7ee32 commit 5521871
Show file tree
Hide file tree
Showing 4 changed files with 118 additions and 17 deletions.
4 changes: 2 additions & 2 deletions lib/core/src/Cardano/Wallet/Api/Aeson/Variant.hs
Expand Up @@ -56,9 +56,9 @@ variants
variants ctx xs v = withObject ctx run v
where
run obj = case xs >>= mkParser obj of
[] -> fail "not enough fields to select a variant"
[] -> fail "no variant selection criteria matching"
[p] -> p
_ -> fail "multiple variants are possible"
_ -> fail "multiple variant selection criteria matching"
mkParser :: Object -> Variant a -> [Parser a]
mkParser obj (Variant v_ctx s p)
| s obj =
Expand Down
4 changes: 2 additions & 2 deletions lib/core/src/Cardano/Wallet/Api/Types.hs
Expand Up @@ -2643,10 +2643,10 @@ instance ToJSON WalletPutPassphraseOldPassphraseData where
instance FromJSON WalletPutPassphraseData where
parseJSON =
fmap WalletPutPassphraseData . variants "PutPassphrase data"
[ variant "OldPassphrase"
[ variant "old passphrase"
(HM.member "old_passphrase")
$ fmap Left <$> parseJSON
, variant "Mnemonic"
, variant "mnemonic"
(HM.member "mnemonic_sentence")
$ fmap Right <$> parseJSON
]
Expand Down
125 changes: 113 additions & 12 deletions lib/core/test/unit/Cardano/Wallet/Api/Malformed.hs
Expand Up @@ -912,61 +912,162 @@ instance Malformed (BodyParam WalletPutPassphraseData) where
{ "old_passphrase": #{wPassphrase}
, "new_passphrase" : 100
}|]
, "Error in $['new_passphrase']: parsing Passphrase failed, expected String, but encountered Number, OldPassphrase variant"
, "Error in $['new_passphrase']: parsing Passphrase failed, expected String, but encountered Number, old passphrase variant"
)
, ( [aesonQQ|
{ "old_passphrase": []
, "new_passphrase" : #{wPassphrase}
}|]
, "Error in $['old_passphrase']: parsing Passphrase failed, expected String, but encountered Array, OldPassphrase variant"
, "Error in $['old_passphrase']: parsing Passphrase failed, expected String, but encountered Array, old passphrase variant"
)
, ( [aesonQQ|
{ "old_passphrase": ""
, "new_passphrase" : #{wPassphrase}
}|]
, "Error in $['old_passphrase']: passphrase is too short: expected at least 10 characters, OldPassphrase variant"
, "Error in $['old_passphrase']: passphrase is too short: expected at least 10 characters, old passphrase variant"
)
, ( [aesonQQ|
{ "old_passphrase": #{wPassphrase}
, "new_passphrase" : "123456789"
}|]
, "Error in $['new_passphrase']: passphrase is too short: expected at least 10 characters, OldPassphrase variant"
, "Error in $['new_passphrase']: passphrase is too short: expected at least 10 characters, old passphrase variant"
)
, ( [aesonQQ|
{ "old_passphrase": #{wPassphrase}
, "new_passphrase" : #{nameTooLong}
}|]
, "Error in $['new_passphrase']: passphrase is too long: expected at most 255 characters, OldPassphrase variant"
, "Error in $['new_passphrase']: passphrase is too long: expected at most 255 characters, old passphrase variant"
)
, ( [aesonQQ|
{ "old_passphrase": #{nameTooLong}
, "new_passphrase" : #{wPassphrase}
}|]
, "Error in $['old_passphrase']: passphrase is too long: expected at most 255 characters, OldPassphrase variant"
, "Error in $['old_passphrase']: passphrase is too long: expected at most 255 characters, old passphrase variant"
)
, ( [aesonQQ|
{ "old_passphrase": #{wPassphrase}
}|]
, "Error in $: parsing Cardano.Wallet.Api.Types.WalletPutPassphraseOldPassphraseData(WalletPutPassphraseOldPassphraseData) failed, key 'new_passphrase' not found, OldPassphrase variant"
, "Error in $: parsing Cardano.Wallet.Api.Types.WalletPutPassphraseOldPassphraseData(WalletPutPassphraseOldPassphraseData) failed, key 'new_passphrase' not found, old passphrase variant"
)
, ( [aesonQQ|
{ "new_passphrase": #{wPassphrase}
}|]
, "Error in $: not enough fields to select a variant"
, "Error in $: no variant selection criteria matching"
)
, ( [aesonQQ|
{ "mnemonic_sentence": #{mnemonics15}
}|]
, "Error in $: parsing Cardano.Wallet.Api.Types.WalletPutPassphraseMnemonicData(WalletPutPassphraseMnemonicData) failed, key 'new_passphrase' not found, Mnemonic variant"
, "Error in $: parsing Cardano.Wallet.Api.Types.WalletPutPassphraseMnemonicData(WalletPutPassphraseMnemonicData) failed, key 'new_passphrase' not found, mnemonic variant"
)
, ( [aesonQQ|
{ "mnemonic_sentence": #{mnemonics15}
, "old_passphrase": #{wPassphrase}
}|]
, "Error in $: multiple variants are possible"

, "Error in $: multiple variant selection criteria matching"
)
, ( [aesonQQ|
{ "mnemonic_sentence": []
, "new_passphrase": #{wPassphrase}
}|]
, "Error in $['mnemonic_sentence']: Invalid number of words: 15, 18, 21 or 24 words are expected., mnemonic variant"
)

, ( [aesonQQ|
{ "mnemonic_sentence": #{mnemonics3}
, "new_passphrase": #{wPassphrase}
}|]
, "Error in $['mnemonic_sentence']: Invalid number of words: 15, 18, 21 or 24 words are expected., mnemonic variant"
)
, ( [aesonQQ|
{ "mnemonic_sentence": #{mnemonics6}
, "new_passphrase": #{wPassphrase}
}|]
, "Error in $['mnemonic_sentence']: Invalid number of words: 15, 18, 21 or 24 words are expected., mnemonic variant"
)
, ( [aesonQQ|
{ "mnemonic_sentence": #{mnemonics9}
, "new_passphrase": #{wPassphrase}
}|]
, "Error in $['mnemonic_sentence']: Invalid number of words: 15, 18, 21 or 24 words are expected., mnemonic variant"
)
, ( [aesonQQ|
{ "mnemonic_sentence": #{mnemonics12}
, "new_passphrase": #{wPassphrase}
}|]
, "Error in $['mnemonic_sentence']: Invalid number of words: 15, 18, 21 or 24 words are expected., mnemonic variant"
)
, ( [aesonQQ|
{ "mnemonic_sentence": #{invalidMnemonics15}
, "new_passphrase": #{wPassphrase}
}|]
, "Error in $['mnemonic_sentence']: Invalid entropy checksum: please double-check the last word of your mnemonic sentence., mnemonic variant"
)
, ( [aesonQQ|
{ "mnemonic_sentence": #{notInDictMnemonics15}
, "new_passphrase": #{wPassphrase}
}|]
, "Error in $['mnemonic_sentence']: Found an unknown word not present in the pre-defined dictionary. The full dictionary is available here: \
\https://github.com/input-output-hk/cardano-wallet/tree/master/specifications/mnemonic/english.txt, mnemonic variant"
)
, ( [aesonQQ|
{ "mnemonic_sentence": #{specMnemonicSentence}
, "new_passphrase": #{wPassphrase}
}|]
, "Error in $['mnemonic_sentence']: Invalid entropy checksum: please double-check the last word of your mnemonic sentence., mnemonic variant"
)
, ( [aesonQQ|
{ "mnemonic_sentence": #{japaneseMnemonics12}
, "new_passphrase": #{wPassphrase}
}|]
, "Error in $['mnemonic_sentence']: Invalid number of words: 15, 18, 21 or 24 words are expected., mnemonic variant"
)
, ( [aesonQQ|
{ "mnemonic_sentence": #{japaneseMnemonics15}
, "new_passphrase": #{wPassphrase}
}|]
, "Error in $['mnemonic_sentence']: Found an unknown word not present in the pre-defined dictionary. The full dictionary is available here: \
\https://github.com/input-output-hk/cardano-wallet/tree/master/specifications/mnemonic/english.txt, mnemonic variant"
)
, ( [aesonQQ|
{ "mnemonic_sentence": #{chineseMnemonics9}
, "new_passphrase": #{wPassphrase}
}|]
, "Error in $['mnemonic_sentence']: Invalid number of words: 15, 18, 21 or 24 words are expected., mnemonic variant"
)
, ( [aesonQQ|
{ "mnemonic_sentence": #{chineseMnemonics18}
, "new_passphrase": #{wPassphrase}
}|]
, "Error in $['mnemonic_sentence']: Found an unknown word not present in the pre-defined dictionary. The full dictionary is available here: \
\https://github.com/input-output-hk/cardano-wallet/tree/master/specifications/mnemonic/english.txt, mnemonic variant"
)
, ( [aesonQQ|
{ "mnemonic_sentence": #{frenchMnemonics12}
, "new_passphrase": #{wPassphrase}
}|]
, "Error in $['mnemonic_sentence']: Invalid number of words: 15, 18, 21 or 24 words are expected., mnemonic variant"
)
, ( [aesonQQ|
{ "mnemonic_sentence": #{frenchMnemonics21}
, "new_passphrase": #{wPassphrase}
}|]
, "Error in $['mnemonic_sentence']: Found an unknown word not present in the pre-defined dictionary. The full dictionary is available here: \
\https://github.com/input-output-hk/cardano-wallet/tree/master/specifications/mnemonic/english.txt, mnemonic variant"
)
, ( [aesonQQ|
{ "mnemonic_sentence": #{mnemonics15}
, "mnemonic_second_factor": []
, "new_passphrase": #{wPassphrase}
}|]
, "Error in $['mnemonic_second_factor']: Invalid number of words: 9 or 12 words are expected., mnemonic variant"
)
, ( [aesonQQ|
{ "mnemonic_sentence": #{mnemonics15}
, "mnemonic_second_factor": #{specMnemonicSecondFactor}
, "new_passphrase": #{wPassphrase}
}|]
, "Error in $['mnemonic_second_factor']: Invalid entropy checksum: please double-check the last word of your mnemonic sentence., mnemonic variant"
)

]

instance Malformed (BodyParam ByronWalletPutPassphraseData) where
Expand Down
2 changes: 1 addition & 1 deletion lib/core/test/unit/Cardano/Wallet/Api/TypesSpec.hs
Expand Up @@ -726,7 +726,7 @@ spec = parallel $ do

it "ApiMnemonicT '[12] (not enough words)" $ do
let msg = "Error in $: Invalid number of words: 12 words\
\ are expected."
\ are expected"
Aeson.parseEither parseJSON [aesonQQ|
["toilet", "toilet", "toilet"]
|] `shouldBe` (Left @String @(ApiMnemonicT '[12]) msg)
Expand Down

0 comments on commit 5521871

Please sign in to comment.