128 lines
4.7 KiB
TypeScript
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,
|
|
});
|
|
});
|
|
});
|