test(wallet): cover WalletLoader's defensive branches for corrupted files
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.
This commit is contained in:
@@ -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<InvalidDataException>(() => 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<InvalidDataException>(() => 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<InvalidDataException>(() => WalletLoader.ToAccount(doc));
|
||||
Assert.Contains("Xpub", ex.Message);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void ToAccount_documento_senza_alcuna_chiave_lancia_eccezione()
|
||||
{
|
||||
var ex = Assert.Throws<InvalidDataException>(() => WalletLoader.ToAccount(EmptyDoc()));
|
||||
Assert.Contains("no xpub and no seed", ex.Message);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void NewFromXpub_chiave_invalida_lancia_eccezione()
|
||||
{
|
||||
Assert.Throws<InvalidDataException>(
|
||||
() => WalletLoader.NewFromXpub("zpubGarbage", ChainProfiles.Mainnet));
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void NewFromXprv_chiave_invalida_lancia_eccezione()
|
||||
{
|
||||
Assert.Throws<InvalidDataException>(
|
||||
() => WalletLoader.NewFromXprv("zprvGarbage", ChainProfiles.Mainnet));
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void NewFromWif_senza_chiavi_lancia_eccezione()
|
||||
{
|
||||
Assert.Throws<InvalidDataException>(
|
||||
() => WalletLoader.NewFromWif([], ScriptKind.NativeSegwit, ChainProfiles.Mainnet));
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user