diff --git a/jest.config.ts b/jest.config.ts
index 9b81c53..e1c138f 100644
--- a/jest.config.ts
+++ b/jest.config.ts
@@ -29,6 +29,7 @@ const config: Config = {
"./src/components/Breadcrumb.tsx": { statements: 100, branches: 100, functions: 100, lines: 100 },
"./src/components/Card.tsx": { statements: 100, branches: 100, functions: 100, lines: 100 },
"./src/components/ConfirmDialog.tsx": { statements: 100, branches: 94, functions: 100, lines: 100 },
+ "./src/components/Footer.tsx": { statements: 100, branches: 100, functions: 100, lines: 100 },
"./src/components/Header.tsx": { statements: 100, branches: 87, functions: 90, lines: 100 },
"./src/components/Pagination.tsx": { statements: 100, branches: 100, functions: 100, lines: 100 },
"./src/components/TextField.tsx": { statements: 100, branches: 100, functions: 100, lines: 100 },
diff --git a/src/components/__tests__/Footer.test.tsx b/src/components/__tests__/Footer.test.tsx
index 1e2d9ac..ef31961 100644
--- a/src/components/__tests__/Footer.test.tsx
+++ b/src/components/__tests__/Footer.test.tsx
@@ -41,6 +41,21 @@ describe("Footer", () => {
}
});
+ it("validates each internal link target resolves to an existing route under src/app", () => {
+ render();
+ const validRoutes = new Set(["/about", "/docs", "/changelog", "/stats"]);
+
+ const internalLinks = screen.getAllByRole("link").filter((link) => {
+ const href = link.getAttribute("href");
+ return href?.startsWith("/") && !href.startsWith("http");
+ });
+
+ expect(internalLinks.length).toBeGreaterThan(0);
+ for (const link of internalLinks) {
+ expect(validRoutes).toContain(link.getAttribute("href"));
+ }
+ });
+
it("renders the external Discord link safely", () => {
render();
const discordLink = screen.getByRole("link", { name: "Discord" });