Files
community-rule/tests/e2e/edge-cases.spec.ts
T
2026-05-17 22:40:06 -06:00

125 lines
3.8 KiB
TypeScript

import { test, expect } from "@playwright/test";
test.describe("Edge Cases and Error Scenarios", () => {
test.beforeEach(async ({ page }) => {
await page.goto("/");
});
test("handles slow network conditions", async ({ page }) => {
// Page is already loaded from beforeEach
// Simulate slow network for any subsequent requests
await page.route("**/*", (route) => {
// Add 2 second delay to all requests
setTimeout(() => route.continue(), 2000);
});
// Navigate to a new page to test slow network conditions
// Use a fresh navigation instead of reload to avoid Web Inspector issues
await page.goto("/", { waitUntil: "domcontentloaded", timeout: 10000 });
// Page should still load eventually
await expect(page.locator("text=Collaborate")).toBeVisible({
timeout: 10000,
});
});
test("handles offline mode gracefully", async ({ page }) => {
// Page is already loaded from beforeEach, so we can test offline behavior
// without reloading (which is blocked by Web Inspector in local environments)
// Simulate offline mode by blocking all network requests
await page.route("**/*", (route) => {
route.abort();
});
// Verify page content is still visible (cached content should remain)
// This tests that the page doesn't crash when network requests fail
const body = page.locator("body");
await expect(body).toBeVisible();
// Verify key content is still accessible
await expect(page.locator("text=Collaborate")).toBeVisible();
});
test("handles JavaScript errors gracefully", async ({ page }) => {
// Inject a JavaScript error
await page.evaluate(() => {
// Create a temporary error handler
const originalError = console.error;
console.error = () => {}; // Suppress error logging
// Trigger a harmless error
try {
throw new Error("Test error");
} catch (_e) {
// Error handled
}
console.error = originalError;
});
// Page should continue to function
await expect(page.locator("text=Collaborate")).toBeVisible();
const learnCta = page
.getByRole("link", { name: /Learn how CommunityRule works/i })
.or(page.getByRole("button", { name: /Learn how CommunityRule works/i }));
const ctaCount = await learnCta.count();
let visibleCta = null;
for (let i = 0; i < ctaCount; i++) {
const cta = learnCta.nth(i);
if (await cta.isVisible()) {
visibleCta = cta;
break;
}
}
if (!visibleCta) {
throw new Error(
'No visible "Learn how CommunityRule works" CTA found',
);
}
await visibleCta.click();
await expect(page).toHaveURL(/\/how-it-works/);
});
test("handles missing images gracefully", async ({ page }) => {
// Block image requests
await page.route("**/*.{png,jpg,jpeg,svg,webp}", (route) => {
route.abort();
});
// Navigate to a new page to test missing images
// Use a fresh navigation instead of reload to avoid Web Inspector issues
await page.goto("/", { waitUntil: "domcontentloaded" });
// Page should still function without images
await expect(page.locator("text=Collaborate")).toBeVisible();
const learnCta = page
.getByRole("link", { name: /Learn how CommunityRule works/i })
.or(page.getByRole("button", { name: /Learn how CommunityRule works/i }));
const ctaCount = await learnCta.count();
let visibleCta = null;
for (let i = 0; i < ctaCount; i++) {
const cta = learnCta.nth(i);
if (await cta.isVisible()) {
visibleCta = cta;
break;
}
}
if (!visibleCta) {
throw new Error(
'No visible "Learn how CommunityRule works" CTA found',
);
}
await visibleCta.click();
await expect(page).toHaveURL(/\/how-it-works/);
});
});