import React, { useState } from "react"; import { describe, it, expect, vi, beforeEach } from "vitest"; import { render, screen, fireEvent } from "@testing-library/react"; import { Board } from "../Board"; import { ListView } from "../ListView"; import "../../styles.css"; vi.mock("../../api", () => ({ fetchWorkflowSteps: vi.fn().mockResolvedValue([]), fetchModels: vi.fn().mockResolvedValue({ models: [], favoriteProviders: [], favoriteModels: [] }), fetchSettings: vi.fn().mockResolvedValue({ modelPresets: [], autoSelectModelPreset: false, defaultPresetBySize: {}, maxConcurrent: 2, maxWorktrees: 4, pollIntervalMs: 30000, groupOverlappingFiles: true, autoMerge: true, }), fetchTaskDetail: vi.fn(), batchUpdateTaskModels: vi.fn(), fetchNodes: vi.fn().mockResolvedValue([]), })); vi.mock("../../hooks/useConfirm", () => ({ useConfirm: () => ({ confirm: vi.fn() }), })); vi.mock("../../hooks/useBadgeWebSocket", () => ({ useBadgeWebSocket: () => ({ badgeUpdates: new Map(), isConnected: false, subscribeToBadge: vi.fn(), unsubscribeFromBadge: vi.fn(), }), })); vi.mock("../../hooks/useSessionFiles", () => ({ useSessionFiles: () => ({ files: [], loading: false }), })); vi.mock("../../hooks/useTaskDiffStats", () => ({ useTaskDiffStats: () => ({ stats: null, loading: false }), })); vi.mock("../Column", () => ({ Column: React.memo(({ column }: { column: string }) => (
)), })); function ensureMatchMedia() { if (!window.matchMedia) { Object.defineProperty(window, "matchMedia", { writable: true, value: vi.fn(), }); } } function mockMobileViewport() { ensureMatchMedia(); Object.defineProperty(window, "innerWidth", { value: 375, configurable: true }); return vi.spyOn(window, "matchMedia").mockImplementation((query: string) => ({ matches: query === "(max-width: 768px)", media: query, onchange: null, addListener: vi.fn(), removeListener: vi.fn(), addEventListener: vi.fn(), removeEventListener: vi.fn(), dispatchEvent: vi.fn(), })); } function ViewSwitchHarness() { const [view, setView] = useState<"list" | "board">("list"); const boardProps = { tasks: [], maxConcurrent: 2, onMoveTask: vi.fn(async () => ({}) as any), onOpenDetail: vi.fn(), addToast: vi.fn(), onQuickCreate: vi.fn(async () => ({}) as any), onNewTask: vi.fn(), autoMerge: true, onToggleAutoMerge: vi.fn(), globalPaused: false, }; const listProps = { tasks: [], onMoveTask: vi.fn(async () => ({}) as any), onRetryTask: vi.fn(async () => ({}) as any), onDeleteTask: vi.fn(async () => ({}) as any), onMergeTask: vi.fn(async () => ({ merged: false })), onOpenDetail: vi.fn(), addToast: vi.fn(), onNewTask: vi.fn(), projectId: "proj-123", }; return (