diff --git a/README.md b/README.md index ef91e04..ab1ff6b 100644 --- a/README.md +++ b/README.md @@ -418,6 +418,10 @@ Each group of these assertions records a coverage key and a final case demands the exact set, so a section that silently stopped running reddens the suite instead of quietly shrinking it. +It also covers the red banner on the Settings screen: switching the network +there to Sepolia must put up the `[TESTNET]` banner, and switching back to +mainnet must take it down, both while Settings is still on screen. + It also covers the confirmation screen, for both a native ETH send and an ERC-20 send: Send disabled while the fee estimate is in flight, enabled once it lands, the fee block quoting the expected cost and the reserve separately, the distinct diff --git a/src/popup/views/helpers.js b/src/popup/views/helpers.js index dba54d6..f2585c2 100644 --- a/src/popup/views/helpers.js +++ b/src/popup/views/helpers.js @@ -128,7 +128,8 @@ function showView(name) { } // Create or update the debug/insecure warning banner. -// Called on every view switch and after the settings debug toggle changes. +// Called on every view switch, after the settings debug toggle changes, and +// after a network switch in Settings. // The banner is shown when the compile-time DEBUG constant is true OR when // the user has enabled runtime debug mode via the settings easter egg, OR // when the active network is a testnet. diff --git a/src/popup/views/settings.js b/src/popup/views/settings.js index cefde1c..c5a727d 100644 --- a/src/popup/views/settings.js +++ b/src/popup/views/settings.js @@ -343,11 +343,13 @@ function init(ctx) { // switch request. notify({ type: "AUTISTMASK_NETWORK_CHANGED", chainId: net.chainId }); resetRenderedViews(); - // Settings itself is brought up to date for the new network here. + // Settings itself, and the testnet banner above it, are brought up + // to date for the new network here. markViewRendered("settings"); $("settings-rpc").value = state.rpcUrl; $("settings-blockscout").value = state.blockscoutUrl; renderTrackedTokens(); + updateDebugBanner(state.currentView); showFlash("Switched to " + net.name + "."); }); diff --git a/tests/e2e/run.js b/tests/e2e/run.js index 24d2aec..2fdd9ad 100644 --- a/tests/e2e/run.js +++ b/tests/e2e/run.js @@ -1824,6 +1824,65 @@ test("the Settings assertions above all ran (#229)", async (env) => { ); }); +// ------------------------------------------------ testnet banner (#511) + +// This suite runs a release build, so the red banner at the top reads +// "[TESTNET]" on Sepolia and is absent on mainnet. A network switch in +// Settings must change it while Settings is still on screen; it used to +// change only when the next screen came up +// (https://git.eeqj.de/sneak/AutistMask/issues/511). + +// The banner's text, or null when there is none, once the switch to `net` +// has finished. The switch's flash is the last thing its handler does, and +// showView() clears the flash, so the banner read while that flash is up is +// the one the switch left on the screen it was made from. +async function bannerAfterSwitch(page, net) { + await page.waitForFunction( + (text) => document.getElementById("flash-msg").textContent === text, + "Switched to " + net.name + ".", + ); + return page.evaluate(() => { + const banner = document.getElementById("debug-banner"); + return { + text: banner === null ? null : banner.textContent, + onSettings: !document + .getElementById("view-settings") + .classList.contains("hidden"), + }; + }); +} + +test("a network switch in Settings shows and removes the testnet banner at once (#511)", async (env) => { + const { mainnet, sepolia } = NETWORKS; + await openSettings(env.page); + assert( + (await env.page.locator("#debug-banner").count()) === 0, + "a banner is up on mainnet before the switch", + ); + + await env.page.selectOption("#settings-network", "sepolia"); + let after = await bannerAfterSwitch(env.page, sepolia); + assert(after.onSettings, "Settings left the screen on the switch"); + assert( + after.text === "[TESTNET]", + "after the switch to Sepolia, Settings shows the banner " + + JSON.stringify(after.text) + + ', expected "[TESTNET]"', + ); + + await env.page.selectOption("#settings-network", "mainnet"); + after = await bannerAfterSwitch(env.page, mainnet); + assert(after.onSettings, "Settings left the screen on the switch back"); + assert( + after.text === null, + "after the switch back to mainnet, Settings still shows the banner " + + JSON.stringify(after.text), + ); + + await env.page.click("#btn-settings-back"); + await visible(env.page, "#view-main"); +}); + // ------------------------------------------------ dust threshold (#233) // The popup size README documents the UI as designed for. Pages in this