import { describe, expect, it } from "vitest"; import type { Spec } from "@json-render/core"; import { withAnswerDisplayTimes } from "./answer-display-time"; describe("answer presentation time zone", () => { it("formats report text, tables, evidence and axes while preserving IDs and source samples", () => { const spec: Spec = { root: "root", elements: { root: { type: "Result", props: { title: "诊断", summary: "目标2026-07-16T00:00:00Z,当前08:00(UTC+8)" }, children: [] }, table: { type: "Table", props: { title: "读数", columns: ["时间"], rows: [["2026-07-16T00:00:00Z"]] }, children: [] }, evidence: { type: "Evidence", props: { observed_at: "2026-07-16T00:00:00Z", evidence_id: "2026-07-16T00:00:00Z" }, children: [] }, chart: { type: "Chart", props: { x_axis_name: "时间(UTC0)", x_data: ["00:00 UTC"], series: [{ name: "压力", data: [20], sample_times: ["2026-07-16T00:00:00Z"] }] }, children: [] } } }; const original = JSON.stringify(spec); const result = withAnswerDisplayTimes(spec); expect(result.elements.root.props.summary).toBe("目标2026/7/16 08:00:00(UTC+8),当前08:00(UTC+8)"); expect(result.elements.table.props.rows).toEqual([["2026/7/16 08:00:00(UTC+8)"]]); expect(result.elements.evidence.props.observed_at).toBe("2026/7/16 08:00:00(UTC+8)"); expect(result.elements.evidence.props.evidence_id).toBe("2026-07-16T00:00:00Z"); expect(result.elements.chart.props.x_axis_name).toBe("时间"); expect(result.elements.chart.props.x_data).toEqual(["08:00"]); expect(JSON.stringify(spec)).toBe(original); expect(withAnswerDisplayTimes(result)).toEqual(result); }); it("converts bare times when their table header or chart axis explicitly declares UTC", () => { const spec: Spec = { root: "chart", elements: { chart: { type: "Chart", props: { x_axis_name: "时间(UTC0)", x_data: ["00:00", "2026-12-31 17:00", "08:00+08:00"], series: [{ name: "压力", data: [20, 21, 22] }] }, children: [] }, table: { type: "Table", props: { columns: ["观测时间(UTC)", "测点编号"], rows: [["2026-12-31 17:00", "00:00"]] }, children: [] } } }; const result = withAnswerDisplayTimes(spec); expect(result.elements.chart.props.x_data).toEqual(["08:00", "2027/1/1 01:00:00", "08:00+08:00"]); expect(result.elements.table.props.columns).toEqual(["观测时间(UTC+8)", "测点编号"]); expect(result.elements.table.props.rows).toEqual([["2027/1/1 01:00:00(UTC+8)", "00:00"]]); expect(withAnswerDisplayTimes(result)).toEqual(result); }); it("removes chart timezone wording while preserving the window, data and sample instants", () => { const samples = ["2026-07-15T23:30:00Z", "2026-07-15T23:45:00Z"]; const spec: Spec = { root: "chart", elements: { chart: { type: "Chart", props: { title: "回放流量:487434(m³/h,上海时间 07-16 04:45–07:45)", x_axis_name: "上海时间", x_data: ["07:30", "07:45"], series: [{ name: "当前回放(2026-07-16,UTC+8)", data: [420, 380], sample_times: samples }] }, children: [] } } }; const result = withAnswerDisplayTimes(spec); expect(result.elements.chart.props.title).toBe("回放流量:487434(m³/h,07-16 04:45–07:45)"); expect(result.elements.chart.props.x_axis_name).toBe("时间"); expect(result.elements.chart.props.x_data).toEqual(["07:30", "07:45"]); expect(result.elements.chart.props.series).toEqual([ { name: "当前回放(2026-07-16)", data: [420, 380], sample_times: samples } ]); expect(withAnswerDisplayTimes(result)).toEqual(result); }); });