Files
bitvid/tests/wallet-test-preserves-input.test.mjs
T
thePR0M3TH3ANandClaude Opus 4.8 c829a42a45 fix(wallet): testing the connection no longer wipes an unsaved typed URI
"Test connection" then "Save" removed the wallet. handleWalletTest re-rendered
the pane (refreshWalletPaneState) in its finally, which repopulates the form from
SAVED settings — empty for a URI you typed but hadn't saved — wiping the field.
The next Save then saw an empty field and took the "removed" branch.

Test must preserve what the user entered: refresh only the button state
(applyWalletControlState), not the whole form.

tests/wallet-test-preserves-input.test.mjs: a Test of an unsaved typed URI keeps
it in the field. Mutation-verified (restoring refreshWalletPaneState fails it).

Co-Authored-By: Claude Opus 4.8 <[email protected]>
2026-06-21 21:07:00 -04:00

57 lines
2.2 KiB
JavaScript

// Regression: testing the wallet connection must NOT wipe a URI the user typed
// but hasn't saved yet. handleWalletTest used to refreshWalletPaneState() in its
// finally, which re-renders the form from SAVED settings (empty for an unsaved
// URI) and cleared the field — so a subsequent Save saw an empty field and
// "removed" the wallet.
import "./test-helpers/setup-localstorage.mjs";
import assert from "node:assert/strict";
import test from "node:test";
import { ProfileWalletController } from "../js/ui/profileModal/ProfileWalletController.js";
const PUBKEY = "a".repeat(64);
const TYPED_URI = "nostr+walletconnect://abc?relay=wss://r.example&secret=def";
// isSecretInputElement accepts any object with a string `value`, so a plain
// object is a faithful stand-in for the input (no DOM needed).
function fakeInput(value = "", dataset = {}) {
return { value, dataset };
}
test("testing an unsaved typed URI preserves it (does not wipe the field)", async () => {
const controller = new ProfileWalletController({
normalizeHexPubkey: (v) => (typeof v === "string" ? v : ""),
getActivePubkey: () => PUBKEY,
showSuccess: () => {},
showStatus: () => {},
showError: () => {},
callbacks: { onWalletTest: () => {} },
services: {
nwcSettings: {
// The wallet has NOT been saved yet — saved settings are empty.
getActiveNwcSettings: () => ({ nwcUri: "" }),
createDefaultNwcSettings: () => ({ nwcUri: "" }),
},
},
});
// Simulate the user having typed (unmasked) a URI into the field.
controller.walletUriInput = fakeInput(TYPED_URI, { secretValue: TYPED_URI, secretMasked: "false" });
controller.walletDefaultZapInput = fakeInput("", {});
// Stub the network/test + busy state; let the real test() finally run.
controller.isWalletBusy = () => false;
controller.testWalletConnection = async () => ({ ok: true });
controller.setWalletPaneBusy = () => {};
controller.updateWalletStatus = () => {};
controller.applyWalletControlState = () => {}; // not under test
await controller.handleWalletTest();
assert.equal(
controller.getSecretInputValue(controller.walletUriInput),
TYPED_URI,
"the typed URI must survive a Test so the next Save persists it (not 'remove')",
);
});