import { test, expect } from "@playwright/test"; import { gotoDashboardRoute } from "./helpers/dashboardAuth"; test.describe("Settings Toggles", () => { const waitForSettingsShell = async (page) => { await expect(page.getByRole("tab", { name: /general/i }).first()).toBeVisible({ timeout: 15000, }); }; const getDebugToggle = (page) => page .getByText(/enable debug mode/i) .locator('xpath=ancestor::div[contains(@class, "flex items-center justify-between")][1]') .getByRole("switch"); const getSidebarVisibilityToggle = (page, itemLabel: string) => page .getByRole("tabpanel", { name: /appearance/i }) .getByText(new RegExp(`^${itemLabel}$`, "i")) .locator('xpath=ancestor::div[contains(@class, "flex items-center justify-between")][1]') .getByRole("switch"); const waitForSettingsPatch = (page) => page.waitForResponse( (response) => response.url().includes("/api/settings") && response.request().method() === "PATCH" && response.ok() ); test("Debug mode toggle should work", async ({ page }) => { await gotoDashboardRoute(page, "/dashboard/settings"); await waitForSettingsShell(page); await page.getByRole("tab", { name: /general/i }).click(); const debugToggle = getDebugToggle(page); await expect(debugToggle).toBeVisible({ timeout: 15000 }); await expect(debugToggle).toBeEnabled({ timeout: 15000 }); const initialState = await debugToggle.getAttribute("aria-checked"); await Promise.all([waitForSettingsPatch(page), debugToggle.click()]); await expect(debugToggle).toHaveAttribute( "aria-checked", initialState === "true" ? "false" : "true", { timeout: 15000 } ); }); test("Sidebar visibility toggle should work", async ({ page }) => { await gotoDashboardRoute(page, "/dashboard/settings"); await waitForSettingsShell(page); await page.getByRole("tab", { name: /appearance/i }).click(); const sidebarToggle = getSidebarVisibilityToggle(page, "Health"); await expect(sidebarToggle).toBeVisible({ timeout: 15000 }); const initialState = await sidebarToggle.getAttribute("aria-checked"); await Promise.all([waitForSettingsPatch(page), sidebarToggle.click()]); await expect(sidebarToggle).toHaveAttribute( "aria-checked", initialState === "true" ? "false" : "true", { timeout: 15000 } ); }); test("Clear Cache button calls DELETE /api/cache", async ({ page }) => { await gotoDashboardRoute(page, "/dashboard/settings"); await waitForSettingsShell(page); await page.getByRole("tab", { name: /general/i }).click(); const clearBtn = page.getByRole("button", { name: /clear cache/i }); await expect(clearBtn).toBeVisible({ timeout: 15000 }); const [request] = await Promise.all([ page.waitForRequest((req) => req.url().includes("/api/cache") && req.method() === "DELETE"), clearBtn.click(), ]); expect(request).toBeTruthy(); }); test("Purge Expired Logs button calls POST /api/settings/purge-logs", async ({ page }) => { await gotoDashboardRoute(page, "/dashboard/settings"); await waitForSettingsShell(page); await page.getByRole("tab", { name: /general/i }).click(); const purgeBtn = page.getByRole("button", { name: /purge expired logs/i }); await expect(purgeBtn).toBeVisible({ timeout: 15000 }); const [request] = await Promise.all([ page.waitForRequest( (req) => req.url().includes("/api/settings/purge-logs") && req.method() === "POST" ), purgeBtn.click(), ]); expect(request).toBeTruthy(); }); test("Debug mode should persist after page reload", async ({ page }) => { await gotoDashboardRoute(page, "/dashboard/settings"); await waitForSettingsShell(page); await page.getByRole("tab", { name: /general/i }).click(); const debugToggle = getDebugToggle(page); await expect(debugToggle).toBeVisible({ timeout: 15000 }); await expect(debugToggle).toBeEnabled({ timeout: 15000 }); const initialState = await debugToggle.getAttribute("aria-checked"); await Promise.all([waitForSettingsPatch(page), debugToggle.click()]); const nextState = initialState === "true" ? "false" : "true"; await expect(debugToggle).toHaveAttribute("aria-checked", nextState, { timeout: 15000 }); await page.reload(); await page.waitForLoadState("domcontentloaded"); await waitForSettingsShell(page); await page.getByRole("tab", { name: /general/i }).click(); const reloadedToggle = getDebugToggle(page); await expect(reloadedToggle).toBeEnabled({ timeout: 15000 }); await expect(reloadedToggle).toHaveAttribute("aria-checked", nextState, { timeout: 15000, }); }); });