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();
});
});