Files
SnapOtter/tests/e2e-landing/interactions.spec.ts
T
SnapOtter 8403222d08 feat(landing): migrate from Next.js to Astro 5
Zero client JS, 165 static pages, self-hosted fonts, Otter Orange
design system. Includes tool SEO data for all 157 tools, enterprise
page, and updated e2e landing tests.
2026-06-14 16:50:20 +08:00

62 lines
2.7 KiB
TypeScript

import { expect, test } from "@playwright/test";
test.describe("Docker Command Copy Button", () => {
test("copy button shows Copied! feedback", async ({ page }) => {
await page.goto("/");
const copyButton = page.locator("button[data-copy]");
await copyButton.click();
await expect(page.getByText("Copied!")).toBeVisible();
});
});
test.describe("FAQ Page Accordion", () => {
test.beforeEach(async ({ page }) => {
await page.goto("/faq");
});
test("renders all FAQ questions", async ({ page }) => {
await expect(page.getByText("Frequently Asked Questions")).toBeVisible();
await expect(page.getByText("Are my files safe and private?")).toBeVisible();
await expect(page.getByText("Is SnapOtter really free?")).toBeVisible();
await expect(page.getByText("Do I need an internet connection?")).toBeVisible();
});
test("answers are hidden by default", async ({ page }) => {
await expect(page.getByText(/All processing happens on your own server/)).not.toBeVisible();
});
test("clicking a question expands the answer", async ({ page }) => {
await page.getByText("Are my files safe and private?").click();
await expect(page.getByText(/All processing happens on your own server/)).toBeVisible();
});
test("clicking again collapses the answer", async ({ page }) => {
const question = page.getByText("Are my files safe and private?");
await question.click();
await expect(page.getByText(/All processing happens on your own server/)).toBeVisible();
await question.click();
await expect(page.getByText(/All processing happens on your own server/)).not.toBeVisible();
});
test("multiple FAQs can be open simultaneously", async ({ page }) => {
await page.getByText("Are my files safe and private?").click();
await page.getByText("Is SnapOtter really free?").click();
await expect(page.getByText(/All processing happens on your own server/)).toBeVisible();
await expect(page.getByText(/open source under AGPL-3.0/)).toBeVisible();
});
});
test.describe("Mobile Navigation", () => {
test("hamburger menu opens and shows links", async ({ page }) => {
await page.setViewportSize({ width: 375, height: 812 });
await page.goto("/");
const toggle = page.getByLabel("Toggle menu");
await toggle.click();
await expect(page.getByRole("link", { name: "Features" }).last()).toBeVisible();
await expect(page.getByRole("link", { name: "Enterprise" }).last()).toBeVisible();
await expect(page.getByRole("link", { name: "Pricing" }).last()).toBeVisible();
await expect(page.getByRole("link", { name: "Docs" }).last()).toBeVisible();
await expect(page.getByRole("link", { name: "Contact" }).last()).toBeVisible();
});
});