Files
2026-07-13 13:39:12 +08:00

128 lines
4.7 KiB
TypeScript

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,
});
});
});