111 lines
3.7 KiB
TypeScript
111 lines
3.7 KiB
TypeScript
import { createId } from "@paralleldrive/cuid2";
|
|
import { chromium, expect } from "@playwright/test";
|
|
import { eq } from "drizzle-orm";
|
|
import { stringify } from "superjson";
|
|
import { describe, test } from "vitest";
|
|
|
|
import * as sqliteSchema from "../packages/db/schema/sqlite";
|
|
import { createHomarrContainer } from "./shared/create-homarr-container";
|
|
import { createSqliteDbFileAsync } from "./shared/e2e-db";
|
|
import { seedAdminUserAsync } from "./shared/seed-admin-user";
|
|
|
|
const adminCredentials = {
|
|
username: "admin",
|
|
password: "Comp(exP4sswOrd",
|
|
};
|
|
|
|
describe("lazy widget application graph", () => {
|
|
test("renders an authenticated board and preserves first-use UI behavior after reload", async () => {
|
|
const { db, localMountPath } = await createSqliteDbFileAsync();
|
|
const { userId } = await seedAdminUserAsync(db, adminCredentials);
|
|
const boardId = createId();
|
|
const layoutId = createId();
|
|
const sectionId = createId();
|
|
const itemId = createId();
|
|
|
|
await db.insert(sqliteSchema.boards).values({
|
|
id: boardId,
|
|
name: "lazy-widget-board",
|
|
creatorId: userId,
|
|
});
|
|
await db.insert(sqliteSchema.layouts).values({
|
|
id: layoutId,
|
|
name: "Base",
|
|
boardId,
|
|
columnCount: 12,
|
|
});
|
|
await db.insert(sqliteSchema.sections).values({
|
|
id: sectionId,
|
|
boardId,
|
|
kind: "empty",
|
|
xOffset: 0,
|
|
yOffset: 0,
|
|
});
|
|
await db.insert(sqliteSchema.items).values({
|
|
id: itemId,
|
|
boardId,
|
|
kind: "clock",
|
|
options: stringify({ showSeconds: true }),
|
|
});
|
|
await db.insert(sqliteSchema.itemLayouts).values({
|
|
itemId,
|
|
sectionId,
|
|
layoutId,
|
|
xOffset: 0,
|
|
yOffset: 0,
|
|
width: 4,
|
|
height: 2,
|
|
});
|
|
await db.update(sqliteSchema.users).set({ homeBoardId: boardId }).where(eq(sqliteSchema.users.id, userId));
|
|
|
|
const homarrContainer = await createHomarrContainer({
|
|
environment: {
|
|
AUTH_PROVIDERS: "credentials",
|
|
},
|
|
mounts: {
|
|
"/appdata": localMountPath,
|
|
},
|
|
}).start();
|
|
|
|
const baseUrl = `http://${homarrContainer.getHost()}:${homarrContainer.getMappedPort(7575)}`;
|
|
const browser = await chromium.launch();
|
|
const context = await browser.newContext();
|
|
const page = await context.newPage();
|
|
const pageErrors: Error[] = [];
|
|
page.on("pageerror", (error) => pageErrors.push(error));
|
|
|
|
try {
|
|
await page.goto(`${baseUrl}/auth/login`);
|
|
await page.getByLabel("Username").fill(adminCredentials.username);
|
|
await page.locator("#password").fill(adminCredentials.password);
|
|
await page.locator("css=button[type='submit']").click();
|
|
|
|
await expect(page.locator("[data-homarr-dev-benchmark-board]")).toBeVisible({ timeout: 30_000 });
|
|
await expect(page.locator(`[data-id="${itemId}"] .clock-widget-container`)).toBeVisible({ timeout: 15_000 });
|
|
|
|
await page.keyboard.press("Control+K");
|
|
await expect(page.locator("[data-homarr-dev-benchmark-spotlight]")).toBeVisible();
|
|
await page.keyboard.press("Escape");
|
|
await expect(page.locator("[data-homarr-dev-benchmark-spotlight]")).not.toBeVisible();
|
|
|
|
await expect
|
|
.poll(
|
|
async () =>
|
|
await page.evaluate(async () => {
|
|
const registrations = await navigator.serviceWorker.getRegistrations();
|
|
return registrations[0]?.scope ?? null;
|
|
}),
|
|
{ timeout: 15_000 },
|
|
)
|
|
.toBe(`${baseUrl}/`);
|
|
|
|
await page.reload();
|
|
await expect(page.locator(`[data-id="${itemId}"] .clock-widget-container`)).toBeVisible({ timeout: 15_000 });
|
|
expect(pageErrors).toEqual([]);
|
|
} finally {
|
|
await browser.close();
|
|
await homarrContainer.stop();
|
|
}
|
|
}, 120_000);
|
|
});
|