mirror of
https://github.com/snapotter-hq/SnapOtter.git
synced 2026-08-03 07:46:42 +02:00
Expand test coverage across all layers via 14 parallel agents: Unit tests (3,378 total, +534): - First-ever AI sidecar tests (157 tests covering bridge lifecycle, all 12 tool modules) - API route infrastructure (auth, pipeline, batch, settings, teams, roles, audit, api-keys, files, docs) - Lib coverage improvements (audit 7%->95%, worker-pool 33%->100%) - Web store/lib gap fills (features-store, tool-registry) Integration tests (4,403 total, +903): - Expanded 19 tool test files with parameter variations, format edge cases, boundary values - Cross-format matrix: 290 tests covering 14 tools x 17 formats - Adversarial/edge cases: 63 tests for extreme inputs, concurrent requests, corrupted files E2E-Docker (125 new tests): - Expanded 8 spec files + 1 new file covering all 49 tools - Added HEIC/format handling, auth failures, download verification GUI E2E (expanded 28 spec files): - Navigation, responsive layout, keyboard shortcuts - All 51 tool UIs with settings, processing, display modes - Batch/pipeline workflows, settings/RBAC, visual regression - Resilience, accessibility (ARIA, contrast, focus), performance budgets
99 lines
2.9 KiB
TypeScript
99 lines
2.9 KiB
TypeScript
// @vitest-environment jsdom
|
|
|
|
import { cleanup, fireEvent, render, screen } from "@testing-library/react";
|
|
import type React from "react";
|
|
import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
|
|
|
|
vi.mock("framer-motion", () => ({
|
|
motion: {
|
|
div: ({ children, ...props }: React.PropsWithChildren<Record<string, unknown>>) => (
|
|
<div {...props}>{children}</div>
|
|
),
|
|
},
|
|
AnimatePresence: ({ children }: React.PropsWithChildren) => <>{children}</>,
|
|
}));
|
|
|
|
const writeTextMock = vi.fn().mockResolvedValue(undefined);
|
|
Object.assign(navigator, {
|
|
clipboard: { writeText: writeTextMock },
|
|
});
|
|
|
|
import { HowItWorks } from "@landing/components/how-it-works";
|
|
|
|
beforeEach(() => {
|
|
writeTextMock.mockClear();
|
|
});
|
|
|
|
afterEach(cleanup);
|
|
|
|
const DOCKER_COMMAND =
|
|
"docker run -d --name SnapOtter -p 1349:1349 -v SnapOtter-data:/data snapotter/snapotter:latest";
|
|
|
|
describe("HowItWorks", () => {
|
|
it("renders the section heading", () => {
|
|
render(<HowItWorks />);
|
|
expect(screen.getByText(/One command/)).toBeDefined();
|
|
});
|
|
|
|
it("renders the subtitle", () => {
|
|
render(<HowItWorks />);
|
|
expect(screen.getByText("Get started in seconds")).toBeDefined();
|
|
});
|
|
|
|
it("displays the Docker command", () => {
|
|
render(<HowItWorks />);
|
|
expect(screen.getByText(DOCKER_COMMAND)).toBeDefined();
|
|
});
|
|
|
|
it("displays the dollar sign prompt", () => {
|
|
render(<HowItWorks />);
|
|
expect(screen.getByText("$")).toBeDefined();
|
|
});
|
|
|
|
it("shows Copy label before clicking", () => {
|
|
render(<HowItWorks />);
|
|
expect(screen.getByText("Copy")).toBeDefined();
|
|
});
|
|
|
|
it("copies command to clipboard on click", async () => {
|
|
render(<HowItWorks />);
|
|
const button = screen.getByText(DOCKER_COMMAND).closest("button")!;
|
|
fireEvent.click(button);
|
|
expect(writeTextMock).toHaveBeenCalledWith(DOCKER_COMMAND);
|
|
});
|
|
|
|
it("shows Copied! feedback after clicking", async () => {
|
|
render(<HowItWorks />);
|
|
const button = screen.getByText(DOCKER_COMMAND).closest("button")!;
|
|
fireEvent.click(button);
|
|
expect(screen.getByText("Copied!")).toBeDefined();
|
|
});
|
|
|
|
it("sets a timeout to revert copy state", () => {
|
|
vi.useFakeTimers();
|
|
const spy = vi.spyOn(globalThis, "setTimeout");
|
|
render(<HowItWorks />);
|
|
const button = screen.getByText(DOCKER_COMMAND).closest("button")!;
|
|
fireEvent.click(button);
|
|
expect(spy).toHaveBeenCalledWith(expect.any(Function), 2000);
|
|
spy.mockRestore();
|
|
vi.useRealTimers();
|
|
});
|
|
|
|
it("renders the terminal window chrome", () => {
|
|
render(<HowItWorks />);
|
|
expect(screen.getByText("Quick Start")).toBeDefined();
|
|
});
|
|
|
|
it("links to documentation", () => {
|
|
render(<HowItWorks />);
|
|
const docsLink = screen.getByText("Read the docs");
|
|
expect(docsLink.closest("a")?.getAttribute("href")).toBe("https://docs.snapotter.com");
|
|
});
|
|
|
|
it("mentions platform support", () => {
|
|
render(<HowItWorks />);
|
|
expect(screen.getByText(/Linux, macOS, and Windows/)).toBeDefined();
|
|
});
|
|
});
|