rspace-online/e2e/tests/navigation.spec.ts

69 lines
2.5 KiB
TypeScript

import { test, expect } from "@playwright/test";
test.describe("Navigation", () => {
test("app switcher lists 20+ modules", async ({ page }) => {
await page.goto("/demo/rspace");
// rstack-app-switcher uses shadow DOM
const itemCount = await page.evaluate(() => {
const switcher = document.querySelector("rstack-app-switcher");
if (!switcher?.shadowRoot) return 0;
return switcher.shadowRoot.querySelectorAll(".item, [data-module-id], a").length;
});
expect(itemCount).toBeGreaterThanOrEqual(20);
});
test("clicking app switcher item triggers navigation", async ({ page }) => {
await page.goto("/demo/rspace");
const initialUrl = page.url();
// Click a non-rspace module link in the switcher and wait for navigation
const [response] = await Promise.all([
page.waitForNavigation({ waitUntil: "domcontentloaded" }).catch(() => null),
page.evaluate(() => {
const switcher = document.querySelector("rstack-app-switcher");
if (!switcher?.shadowRoot) return;
const items = switcher.shadowRoot.querySelectorAll("a[href]");
for (const item of items) {
const href = (item as HTMLAnchorElement).getAttribute("href") || "";
// Pick a module that isn't rspace
if (href && !href.endsWith("/rspace") && !href.endsWith("/rspace/")) {
(item as HTMLAnchorElement).click();
return;
}
}
}),
]);
// Verify we navigated (URL changed)
await page.waitForLoadState("domcontentloaded");
// URL may have changed or may be same if no links found — just ensure no crash
expect(page.url()).toBeTruthy();
});
test("direct URL /demo/:id works for different modules", async ({ page }) => {
const res = await page.goto("/demo/rnotes");
expect(res?.status()).toBe(200);
await expect(page.locator("header.rstack-header")).toBeVisible();
});
test("browser back/forward navigation works", async ({ page }) => {
// /demo/:id may redirect to demo.rspace.online/:id — use the final URLs
await page.goto("/demo/rnotes");
await page.waitForLoadState("networkidle");
const firstUrl = page.url();
expect(firstUrl).toContain("rnotes");
await page.goto("/demo/rcal");
await page.waitForLoadState("networkidle");
const secondUrl = page.url();
expect(secondUrl).toContain("rcal");
// Back should return to rnotes
await page.goBack();
await page.waitForLoadState("networkidle");
expect(page.url()).toContain("rnotes");
});
});