Skip to content

Commit 9a9305e

Browse files
committed
test: added new test case for the navigation
1 parent 9bd207c commit 9a9305e

File tree

2 files changed

+130
-0
lines changed

2 files changed

+130
-0
lines changed

client-src/overlay.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -647,6 +647,7 @@ const createOverlay = (options) => {
647647
applyStyle(navigationElement, navigationStyle);
648648

649649
currentErrorCountElement = doc.createElement("div");
650+
currentErrorCountElement.className = "error-counter";
650651
currentErrorCountElement.textContent = "ERROR 0/0";
651652
navigationElement.appendChild(currentErrorCountElement);
652653

@@ -794,6 +795,7 @@ const createOverlay = (options) => {
794795

795796
// Create message element
796797
const messageTextNode = document.createElement("div");
798+
messageTextNode.className = "error-message";
797799
const text = ansiHTML(encode(body));
798800
messageTextNode.innerHTML = overlayTrustedTypesPolicy
799801
? overlayTrustedTypesPolicy.createHTML(text)

test/e2e/overlay.test.js

Lines changed: 128 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1996,4 +1996,132 @@ describe("overlay", () => {
19961996
await server.stop();
19971997
}
19981998
});
1999+
2000+
it("should navigate between multiple errors using buttons and keyboard shortcuts", async () => {
2001+
const compiler = webpack(config);
2002+
2003+
// Create multiple distinct errors for navigation testing
2004+
new ErrorPlugin("First error message").apply(compiler);
2005+
new ErrorPlugin("Second error message").apply(compiler);
2006+
new ErrorPlugin("Third error message").apply(compiler);
2007+
2008+
const devServerOptions = {
2009+
port,
2010+
};
2011+
const server = new Server(devServerOptions, compiler);
2012+
2013+
await server.start();
2014+
2015+
const { page, browser } = await runBrowser();
2016+
2017+
try {
2018+
await page.goto(`http://localhost:${port}/`, {
2019+
waitUntil: "networkidle0",
2020+
});
2021+
2022+
// Delay for the overlay to appear
2023+
await delay(1000);
2024+
2025+
// Get the overlay iframe and its content frame
2026+
const overlayHandle = await page.$("#webpack-dev-server-client-overlay");
2027+
const overlayFrame = await overlayHandle.contentFrame();
2028+
2029+
// Check initial error counter display
2030+
let errorCounter = await overlayFrame.$eval(
2031+
".error-counter",
2032+
(el) => el.textContent,
2033+
);
2034+
expect(errorCounter).toBe("ERROR 1/3");
2035+
2036+
// Check initial error content
2037+
let errorContent = await overlayFrame.$eval(
2038+
".error-message",
2039+
(el) => el.textContent,
2040+
);
2041+
expect(errorContent).toContain("First error message");
2042+
2043+
// Test navigation button - next
2044+
const nextButton = await overlayFrame.$("button:nth-of-type(2)");
2045+
await nextButton.click();
2046+
await delay(100);
2047+
2048+
// Verify we moved to second error
2049+
errorCounter = await overlayFrame.$eval(
2050+
".error-counter",
2051+
(el) => el.textContent,
2052+
);
2053+
expect(errorCounter).toBe("ERROR 2/3");
2054+
errorContent = await overlayFrame.$eval(
2055+
".error-message",
2056+
(el) => el.textContent,
2057+
);
2058+
expect(errorContent).toContain("Second error message");
2059+
2060+
// Test navigation button - next (to third error)
2061+
await nextButton.click();
2062+
await delay(100);
2063+
2064+
// Verify we moved to third error
2065+
errorCounter = await overlayFrame.$eval(
2066+
".error-counter",
2067+
(el) => el.textContent,
2068+
);
2069+
expect(errorCounter).toBe("ERROR 3/3");
2070+
errorContent = await overlayFrame.$eval(
2071+
".error-message",
2072+
(el) => el.textContent,
2073+
);
2074+
expect(errorContent).toContain("Third error message");
2075+
2076+
// Test navigation button - next (should cycle back to first error)
2077+
await nextButton.click();
2078+
await delay(100);
2079+
2080+
// Verify we cycled back to first error
2081+
errorCounter = await overlayFrame.$eval(
2082+
".error-counter",
2083+
(el) => el.textContent,
2084+
);
2085+
expect(errorCounter).toBe("ERROR 1/3");
2086+
2087+
// Test keyboard navigation - ⌘/Ctrl + →
2088+
await page.keyboard.down(
2089+
process.platform === "darwin" ? "Meta" : "Control",
2090+
);
2091+
await page.keyboard.press("ArrowRight");
2092+
await page.keyboard.up(
2093+
process.platform === "darwin" ? "Meta" : "Control",
2094+
);
2095+
await delay(100);
2096+
2097+
// Verify keyboard navigation worked
2098+
errorCounter = await overlayFrame.$eval(
2099+
".error-counter",
2100+
(el) => el.textContent,
2101+
);
2102+
expect(errorCounter).toBe("ERROR 2/3");
2103+
2104+
// Test keyboard navigation - ⌘/Ctrl + ←
2105+
await page.keyboard.down(
2106+
process.platform === "darwin" ? "Meta" : "Control",
2107+
);
2108+
await page.keyboard.press("ArrowLeft");
2109+
await page.keyboard.up(
2110+
process.platform === "darwin" ? "Meta" : "Control",
2111+
);
2112+
await delay(100);
2113+
2114+
// Verify keyboard navigation worked
2115+
errorCounter = await overlayFrame.$eval(
2116+
".error-counter",
2117+
(el) => el.textContent,
2118+
);
2119+
expect(errorCounter).toBe("ERROR 1/3");
2120+
} catch (error) {
2121+
throw error;
2122+
} finally {
2123+
await browser.close();
2124+
await server.stop();
2125+
}
2126+
});
19992127
});

0 commit comments

Comments
 (0)