import { cleanup, fireEvent, render, screen } from "@testing-library/react"; import { afterEach, describe, expect, it, vi } from "vitest"; import type { ScheduledConditionRecord, ScheduledWorkOrderItem } from "../types"; import { ConditionDetailPanel, WorkOrderActivityPanel } from "./scheduled-condition-detail-panel"; import { createVisibleTickerCards } from "./agent-task-ticker-utils"; import { createConditionConversationPrompt } from "../utils/scheduled-condition-prompts"; const baseCondition: ScheduledConditionRecord = { id: "schedule-run-1", kind: "condition", taskId: "backend-schedule", dataSource: "scheduled_tasks", sessionId: "scheduled-condition-schedule-run-1", title: "演示 低压调查", summary: "后端调查运行", status: "error", riskLevel: "critical", scheduledAt: "2026-09-17T02:10:00Z", updatedAt: Date.parse("2026-09-17T02:20:00Z"), detail: "调查执行状态:异常。", recommendation: "请检查调查任务的输入参数与服务端执行日志。", evidence: ["运行 ID:schedule-run-1", "运行状态:failed"], modelName: "TJWater scheduler" }; it("does not infer water-quality progress or conversation steps from elapsed time", () => { const condition: ScheduledConditionRecord = { ...baseCondition, taskId: "water-quality-complaint", dataSource: "mock", status: "running" }; const [card] = createVisibleTickerCards([condition], 0, Date.now()); expect(card.view.progressValue).toBeUndefined(); expect(card.view.currentStep?.title).toBe("Agent 执行计划"); expect(createConditionConversationPrompt(condition)).not.toContain("工作流步骤"); }); describe("scheduled condition backend boundaries", () => { afterEach(cleanup); it("shows a flat work order with its recorded activity", () => { const workOrder: ScheduledWorkOrderItem = { id: "demo-work-order", kind: "work_order", code: "WO-DEMO", scheduledAt: "2026-09-23T10:00:00Z", title: "演示预约维修", summary: "验证中文时间标签", status: "pending", riskLevel: "normal", updatedAt: Date.parse("2026-09-23T10:00:00Z"), source: "演示数据", dispatcher: "调度岗", priority: "normal", dataSource: "mock", location: "测试点", assignee: "维修班组", feedbackRequirements: ["回填处理结果"], activity: [{ sequence: 1, occurredAt: "2026-09-23T09:00:00Z", actor: "调度岗", kind: "created", title: "工单创建", detail: "确认预约窗口。" }] }; render(); expect(screen.getByText("工单创建")).toBeVisible(); expect(screen.getByText("回填处理结果")).toBeVisible(); expect(screen.queryByText("子任务")).not.toBeInTheDocument(); }); it("shows only persisted evidence for a failed backend condition", () => { render( ); expect(screen.getByText("后端持久化工况")).toBeVisible(); expect(screen.getByText("运行 ID:schedule-run-1")).toBeVisible(); expect(screen.getByText("正式工单边界")).toBeVisible(); expect(screen.getByText(/只有后端同步的工单才会显示/)).toBeVisible(); expect(screen.queryByText("演示异常判断")).not.toBeInTheDocument(); expect(screen.queryByRole("button", { name: "生成演示工单草稿" })).not.toBeInTheDocument(); }); it("does not synthesize workflow progress for a running backend condition", () => { render( ); expect(screen.getByText("后端运行状态")).toBeVisible(); expect(screen.getByText(/不按经过时间推算百分比/)).toBeVisible(); expect(screen.queryByText(/演示执行流程/)).not.toBeInTheDocument(); expect(screen.queryByText("演示进度")).not.toBeInTheDocument(); }); it("does not expose operational-task model, session or duration metadata", () => { render( ); expect(screen.queryByText("TJWater operational task")).not.toBeInTheDocument(); expect(screen.queryByText("browser-session-1")).not.toBeInTheDocument(); expect(screen.queryByText("未记录")).not.toBeInTheDocument(); }); it("keeps the mock work-order interaction but labels it as a local demo draft", () => { render( ); expect(screen.getByText("演示异常判断")).toBeVisible(); expect(screen.getByText("演示处置方案")).toBeVisible(); fireEvent.click(screen.getByRole("button", { name: "生成演示工单草稿" })); expect(screen.getByRole("button", { name: "演示草稿已生成" })).toBeDisabled(); expect(screen.getByText(/只保存在当前页面/)).toBeVisible(); expect(screen.queryByText("系统工单已提交")).not.toBeInTheDocument(); }); it("does not expose the removed mock Agent execution path", () => { const onContinueConversation = vi.fn(); render( ); expect(screen.getByText("后端运行状态")).toBeVisible(); expect(screen.queryByText(/演示执行流程/)).not.toBeInTheDocument(); expect(screen.queryByRole("button", { name: "与 Agent 协同" })).not.toBeInTheDocument(); expect(onContinueConversation).not.toHaveBeenCalled(); }); });