Fix training plan generation flow

这个提交包含在:
cryptocommuniums-afk
2026-03-14 23:16:19 +08:00
父节点 6943754838
当前提交 1cc863e60e
修改 8 个文件,包含 429 行新增19 行删除

96
server/trainingPlan.test.ts 普通文件
查看文件

@@ -0,0 +1,96 @@
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("脚步移动");
});
});
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: "脚步移动",
});
});
});