import { describe, expect, it } from "vitest"; import { normalizeAdjustedPlanResponse, normalizeTrainingPlanResponse, } from "./trainingPlan"; describe("normalizeTrainingPlanResponse", () => { it("accepts canonical title/exercises output", () => { const result = normalizeTrainingPlanResponse({ content: JSON.stringify({ title: "7天训练计划", exercises: [ { day: 1, name: "正手影子挥拍", category: "影子挥拍", duration: 15, description: "完成正手挥拍练习", tips: "保持重心稳定", sets: 3, reps: 12, }, ], }), fallbackTitle: "fallback", }); expect(result.title).toBe("7天训练计划"); expect(result.exercises).toHaveLength(1); expect(result.exercises[0]?.category).toBe("影子挥拍"); }); it("normalizes qwen day map output into plan exercises", () => { const result = normalizeTrainingPlanResponse({ content: JSON.stringify({ day_1: { duration_minutes: 45, focus: "基础握拍与正手影子挥拍", exercises: [ { name: "握拍方式学习", description: "学习大陆式与东方式握拍", duration_minutes: 10, }, { name: "原地小碎步热身与放松", description: "30秒快速小碎步 + 30秒休息", duration_minutes: 10, }, ], }, }), fallbackTitle: "7天训练计划", }); expect(result.title).toBe("7天训练计划"); expect(result.exercises).toHaveLength(2); expect(result.exercises[0]).toMatchObject({ day: 1, name: "握拍方式学习", duration: 10, sets: 3, reps: 10, }); expect(result.exercises[1]?.category).toBe("脚步移动"); }); it("derives a fallback exercise when a day section has no exercises array", () => { const result = normalizeTrainingPlanResponse({ content: JSON.stringify({ day_1: { duration_minutes: 35, focus: "基础脚步与启动速度", summary: "围绕启动速度和小碎步调整展开", }, }), fallbackTitle: "7天训练计划", }); expect(result.exercises).toHaveLength(1); expect(result.exercises[0]).toMatchObject({ day: 1, name: "基础脚步与启动速度", }); }); it("returns a readable error when no exercises can be derived", () => { expect(() => normalizeTrainingPlanResponse({ content: JSON.stringify({ title: "空计划", exercises: [], }), fallbackTitle: "fallback", })).toThrow("训练计划结果为空,请重试或缩小训练重点后再生成。"); }); }); describe("normalizeAdjustedPlanResponse", () => { it("fills missing adjustment notes for day map output", () => { const result = normalizeAdjustedPlanResponse({ content: JSON.stringify({ day_1: { duration_minutes: 30, focus: "脚步移动", exercises: [ { name: "交叉步移动", description: "左右移动并快速回位", duration_minutes: 12, }, ], }, }), fallbackTitle: "当前训练计划", }); expect(result.title).toBe("当前训练计划"); expect(result.adjustmentNotes).toContain("已根据最近分析结果调整"); expect(result.exercises[0]).toMatchObject({ day: 1, name: "交叉步移动", category: "脚步移动", }); }); });