Files
console-dev/tests/review-theme.e2e.test.mjs

73 lines
2.3 KiB
JavaScript

/**
* 认证页复用全站三态主题协议;按钮必须如实说明当前模式,不能承诺下一次一定变深/浅色。
*/
import assert from "node:assert/strict";
import { test } from "node:test";
import { appOrigin, scenario } from "./helpers/console-browser.mjs";
test(
"auth theme control describes and persists the shared three-mode cycle",
{ timeout: 20000 },
(t) =>
scenario(t, {}, async (page) => {
await page.emulateMedia({ colorScheme: "light" });
await page.goto(`${appOrigin}/login`);
const themeButton = page.getByRole("button", {
name: "切换主题,当前跟随系统",
exact: true,
});
await themeButton.waitFor();
assert.equal(
await page
.locator("html")
.evaluate((html) => html.classList.contains("app-dark")),
false,
);
await themeButton.click();
await page
.getByRole("button", { name: "切换主题,当前浅色", exact: true })
.waitFor();
assert.equal(
await page.evaluate(() => localStorage.getItem("theme")),
"light",
);
await page
.getByRole("button", { name: "切换主题,当前浅色", exact: true })
.click();
await page
.getByRole("button", { name: "切换主题,当前深色", exact: true })
.waitFor();
assert.equal(
await page
.locator("html")
.evaluate((html) => html.classList.contains("app-dark")),
true,
);
await page.reload();
await page
.getByRole("button", { name: "切换主题,当前深色", exact: true })
.waitFor();
await page
.getByRole("button", { name: "切换主题,当前深色", exact: true })
.click();
await page
.getByRole("button", { name: "切换主题,当前跟随系统", exact: true })
.waitFor();
assert.equal(
await page
.locator("html")
.evaluate((html) => html.classList.contains("app-dark")),
false,
);
await page.emulateMedia({ colorScheme: "dark" });
await page.waitForFunction(() =>
document.documentElement.classList.contains("app-dark"),
);
return {
currentModeDescribed: true,
explicitModePersisted: true,
automaticModeTracksSystem: true,
};
}),
);