Skip to content

Commit 557fecf

Browse files
fix(web): render sidebar on settings route
Settings page was rendering Outlet directly, omitting the Sidebar nav. Adds a playwright e2e test asserting sidebar visibility on both dashboard and settings routes.
1 parent 784cbee commit 557fecf

6 files changed

Lines changed: 92 additions & 11 deletions

File tree

packages/web/.gitignore

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
test-results/
2+
playwright-report/

packages/web/e2e/sidebar.spec.ts

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
import { expect, test } from "@playwright/test";
2+
3+
const CONFIG_KEY = "openconcho:config";
4+
const CONFIG_VALUE = JSON.stringify({ baseUrl: "http://localhost:9999", token: "" });
5+
6+
test.describe("Sidebar", () => {
7+
test.beforeEach(async ({ context }) => {
8+
await context.addInitScript(
9+
([key, value]) => {
10+
window.localStorage.setItem(key, value);
11+
},
12+
[CONFIG_KEY, CONFIG_VALUE],
13+
);
14+
});
15+
16+
test("renders the sidebar nav on the dashboard route", async ({ page }) => {
17+
await page.goto("/");
18+
await expect(page.getByRole("complementary")).toBeVisible();
19+
await expect(page.getByRole("link", { name: /dashboard/i })).toBeVisible();
20+
await expect(page.getByRole("link", { name: /workspaces/i })).toBeVisible();
21+
await expect(page.getByRole("link", { name: /settings/i })).toBeVisible();
22+
});
23+
24+
test("renders the sidebar nav on the settings route", async ({ page }) => {
25+
await page.goto("/settings");
26+
await expect(page.getByRole("complementary")).toBeVisible();
27+
await expect(page.getByRole("link", { name: /dashboard/i })).toBeVisible();
28+
});
29+
});

packages/web/package.json

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,12 +10,10 @@
1010
"lint": "biome check src/",
1111
"lint:fix": "biome check --write src/",
1212
"test": "vitest run --passWithNoTests",
13+
"test:e2e": "playwright test",
1314
"generate:api": "openapi-typescript openapi.json -o src/api/schema.d.ts"
1415
},
1516
"dependencies": {
16-
"@tauri-apps/api": "^2",
17-
"@tauri-apps/plugin-http": "^2",
18-
"@tauri-apps/plugin-shell": "^2",
1917
"@fontsource/dm-mono": "^5.2.7",
2018
"@fontsource/dm-sans": "^5.2.8",
2119
"@radix-ui/react-collapsible": "^1.1.12",
@@ -27,6 +25,9 @@
2725
"@tailwindcss/vite": "^4.2.4",
2826
"@tanstack/react-query": "^5.74.4",
2927
"@tanstack/react-router": "^1.120.3",
28+
"@tauri-apps/api": "^2",
29+
"@tauri-apps/plugin-http": "^2",
30+
"@tauri-apps/plugin-shell": "^2",
3031
"class-variance-authority": "^0.7.1",
3132
"clsx": "^2.1.1",
3233
"framer-motion": "^12.38.0",
@@ -42,6 +43,7 @@
4243
"zod": "catalog:"
4344
},
4445
"devDependencies": {
46+
"@playwright/test": "^1.59.1",
4547
"@tanstack/router-plugin": "^1.120.3",
4648
"@testing-library/jest-dom": "catalog:",
4749
"@testing-library/react": "catalog:",

packages/web/playwright.config.ts

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
import { defineConfig, devices } from "@playwright/test";
2+
3+
export default defineConfig({
4+
testDir: "./e2e",
5+
fullyParallel: true,
6+
reporter: "list",
7+
use: {
8+
baseURL: "http://localhost:5173",
9+
},
10+
projects: [{ name: "chromium", use: { ...devices["Desktop Chrome"] } }],
11+
webServer: {
12+
command: "pnpm dev",
13+
url: "http://localhost:5173",
14+
reuseExistingServer: !process.env.CI,
15+
timeout: 60_000,
16+
},
17+
});

packages/web/src/routes/__root.tsx

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { createRootRoute, Outlet, redirect, useRouter } from "@tanstack/react-router";
1+
import { createRootRoute, Outlet, redirect } from "@tanstack/react-router";
22
import { useEffect } from "react";
33
import { Sidebar } from "@/components/layout/Sidebar";
44
import { loadConfig } from "@/lib/config";
@@ -7,17 +7,10 @@ import { applyTheme, getStoredTheme } from "@/lib/theme";
77
const SETTINGS_PATH = "/settings";
88

99
function RootLayout() {
10-
const router = useRouter();
11-
const isSettings = router.state.location.pathname === SETTINGS_PATH;
12-
1310
useEffect(() => {
1411
applyTheme(getStoredTheme());
1512
}, []);
1613

17-
if (isSettings) {
18-
return <Outlet />;
19-
}
20-
2114
return (
2215
<div
2316
className="flex h-screen w-full overflow-hidden"

pnpm-lock.yaml

Lines changed: 38 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)