From a46f5e6638178c0b5d1c1c0198abf0a8d1d8b6fa Mon Sep 17 00:00:00 2001 From: Davide Grilli Date: Tue, 7 Jul 2026 16:25:33 +0200 Subject: [PATCH] test(wallet): cover WalletLoader's defensive branches for corrupted files MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ToAccount's InvalidDataException paths (corrupted mnemonic/xprv/xpub, a document with no key material at all) and the equivalent guards in NewFromXpub/NewFromXprv/NewFromWif had no coverage — these are the checks that turn a damaged wallet file into a clear error instead of an unhandled exception or, worse, a silently wrong account. --- .../Wallet/WalletLoaderTests.cs | 63 +++++++++++++++++++ 1 file changed, 63 insertions(+) diff --git a/tests/PalladiumWallet.Tests/Wallet/WalletLoaderTests.cs b/tests/PalladiumWallet.Tests/Wallet/WalletLoaderTests.cs index e126ce2..094e933 100644 --- a/tests/PalladiumWallet.Tests/Wallet/WalletLoaderTests.cs +++ b/tests/PalladiumWallet.Tests/Wallet/WalletLoaderTests.cs @@ -186,4 +186,67 @@ public class WalletLoaderTests AccountPath = "84'/0'/0'", AccountXpub = "xpub" }; Assert.Equal(expected, WalletLoader.ProfileOf(doc).Kind); } + + // ---- corrupted/incomplete documents (defensive branches of ToAccount) ---- + + private static WalletDocument EmptyDoc() => new() + { + Network = "mainnet", + ScriptKind = "NativeSegwit", + }; + + [Fact] + public void ToAccount_mnemonica_corrotta_nel_file_lancia_eccezione() + { + var doc = EmptyDoc(); + doc.Mnemonic = "not a valid mnemonic at all"; + var ex = Assert.Throws(() => WalletLoader.ToAccount(doc)); + Assert.Contains("mnemonic", ex.Message, StringComparison.OrdinalIgnoreCase); + } + + [Fact] + public void ToAccount_xprv_corrotta_nel_file_lancia_eccezione() + { + var doc = EmptyDoc(); + doc.AccountXprv = "zprvGarbageGarbageGarbage"; + var ex = Assert.Throws(() => WalletLoader.ToAccount(doc)); + Assert.Contains("Xprv", ex.Message); + } + + [Fact] + public void ToAccount_xpub_corrotta_nel_file_lancia_eccezione() + { + var doc = EmptyDoc(); + doc.AccountXpub = "zpubGarbageGarbageGarbage"; + var ex = Assert.Throws(() => WalletLoader.ToAccount(doc)); + Assert.Contains("Xpub", ex.Message); + } + + [Fact] + public void ToAccount_documento_senza_alcuna_chiave_lancia_eccezione() + { + var ex = Assert.Throws(() => WalletLoader.ToAccount(EmptyDoc())); + Assert.Contains("no xpub and no seed", ex.Message); + } + + [Fact] + public void NewFromXpub_chiave_invalida_lancia_eccezione() + { + Assert.Throws( + () => WalletLoader.NewFromXpub("zpubGarbage", ChainProfiles.Mainnet)); + } + + [Fact] + public void NewFromXprv_chiave_invalida_lancia_eccezione() + { + Assert.Throws( + () => WalletLoader.NewFromXprv("zprvGarbage", ChainProfiles.Mainnet)); + } + + [Fact] + public void NewFromWif_senza_chiavi_lancia_eccezione() + { + Assert.Throws( + () => WalletLoader.NewFromWif([], ScriptKind.NativeSegwit, ChainProfiles.Mainnet)); + } }