All checks were successful
ci/woodpecker/push/woodpecker Pipeline was successful
Fixes all 542 ESLint problems in the web package to achieve 0 errors and 0 warnings. Changes: - Fixed 144 issues: nullish coalescing, return types, unused variables - Fixed 118 issues: unnecessary conditions, type safety, template literals - Fixed 79 issues: non-null assertions, unsafe assignments, empty functions - Fixed 67 issues: explicit return types, promise handling, enum comparisons - Fixed 45 final warnings: missing return types, optional chains - Fixed 25 typecheck-related issues: async/await, type assertions, formatting - Fixed JSX.Element namespace errors across 90+ files All Quality Rails violations resolved. Lint and typecheck both pass with 0 problems. Files modified: 118 components, tests, hooks, and utilities Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
88 lines
2.9 KiB
TypeScript
88 lines
2.9 KiB
TypeScript
import { describe, it, expect, vi } from "vitest";
|
|
import { render, screen } from "@testing-library/react";
|
|
import { DomainList } from "./DomainList";
|
|
import type { Domain } from "@mosaic/shared";
|
|
|
|
describe("DomainList", (): void => {
|
|
const mockDomains: Domain[] = [
|
|
{
|
|
id: "domain-1",
|
|
workspaceId: "workspace-1",
|
|
name: "Work",
|
|
slug: "work",
|
|
description: "Work-related tasks",
|
|
color: "#3B82F6",
|
|
icon: "💼",
|
|
sortOrder: 0,
|
|
metadata: {},
|
|
createdAt: new Date("2026-01-28"),
|
|
updatedAt: new Date("2026-01-28"),
|
|
},
|
|
{
|
|
id: "domain-2",
|
|
workspaceId: "workspace-1",
|
|
name: "Personal",
|
|
slug: "personal",
|
|
description: "Personal tasks and projects",
|
|
color: "#10B981",
|
|
icon: "🏠",
|
|
sortOrder: 1,
|
|
metadata: {},
|
|
createdAt: new Date("2026-01-28"),
|
|
updatedAt: new Date("2026-01-28"),
|
|
},
|
|
];
|
|
|
|
it("should render empty state when no domains", (): void => {
|
|
render(<DomainList domains={[]} isLoading={false} />);
|
|
expect(screen.getByText(/no domains created yet/i)).toBeInTheDocument();
|
|
});
|
|
|
|
it("should render loading state", (): void => {
|
|
render(<DomainList domains={[]} isLoading={true} />);
|
|
expect(screen.getByText(/loading domains/i)).toBeInTheDocument();
|
|
});
|
|
|
|
it("should render domains list", (): void => {
|
|
render(<DomainList domains={mockDomains} isLoading={false} />);
|
|
expect(screen.getByText("Work")).toBeInTheDocument();
|
|
expect(screen.getByText("Personal")).toBeInTheDocument();
|
|
});
|
|
|
|
it("should call onEdit when edit button clicked", (): void => {
|
|
const onEdit = vi.fn();
|
|
render(<DomainList domains={mockDomains} isLoading={false} onEdit={onEdit} />);
|
|
|
|
const editButtons = screen.getAllByRole("button", { name: /edit/i });
|
|
const firstButton = editButtons[0];
|
|
if (firstButton) {
|
|
firstButton.click();
|
|
expect(onEdit).toHaveBeenCalledWith(mockDomains[0]);
|
|
}
|
|
});
|
|
|
|
it("should call onDelete when delete button clicked", (): void => {
|
|
const onDelete = vi.fn();
|
|
render(<DomainList domains={mockDomains} isLoading={false} onDelete={onDelete} />);
|
|
|
|
const deleteButtons = screen.getAllByRole("button", { name: /delete/i });
|
|
const firstButton = deleteButtons[0];
|
|
if (firstButton) {
|
|
firstButton.click();
|
|
expect(onDelete).toHaveBeenCalledWith(mockDomains[0]);
|
|
}
|
|
});
|
|
|
|
it("should handle undefined domains gracefully", (): void => {
|
|
// @ts-expect-error Testing error state
|
|
render(<DomainList domains={undefined} isLoading={false} />);
|
|
expect(screen.getByText(/no domains created yet/i)).toBeInTheDocument();
|
|
});
|
|
|
|
it("should handle null domains gracefully", (): void => {
|
|
// @ts-expect-error Testing error state
|
|
render(<DomainList domains={null} isLoading={false} />);
|
|
expect(screen.getByText(/no domains created yet/i)).toBeInTheDocument();
|
|
});
|
|
});
|