149 lines
4.7 KiB
TypeScript
149 lines
4.7 KiB
TypeScript
import { describe, it, expect } from "bun:test";
|
||
import { formatChangeStatus, suggestNextStep } from "../../src/cli.ts";
|
||
import type { ChangeStatus, RuneConfig } from "../../src/types.ts";
|
||
|
||
function makeStatus(overrides: Partial<ChangeStatus> = {}): ChangeStatus {
|
||
return {
|
||
name: "test-change",
|
||
documents: [],
|
||
planCompleted: false,
|
||
buildUnlocked: false,
|
||
taskProgress: null,
|
||
...overrides,
|
||
};
|
||
}
|
||
|
||
describe("formatChangeStatus", () => {
|
||
it("显示变更名", () => {
|
||
const output = formatChangeStatus(makeStatus());
|
||
expect(output).toContain("test-change");
|
||
});
|
||
|
||
it("显示已完成和待完成文档", () => {
|
||
const status = makeStatus({
|
||
documents: [
|
||
{ name: "design", completed: true, dependMet: true },
|
||
{ name: "task", completed: false, dependMet: true },
|
||
],
|
||
});
|
||
const output = formatChangeStatus(status);
|
||
expect(output).toContain("design.md ✓ 已完成");
|
||
expect(output).toContain("task.md ○ 待完成");
|
||
});
|
||
|
||
it("显示文档依赖信息(dependMet 为 false 且 config 中有依赖)", () => {
|
||
const status = makeStatus({
|
||
documents: [{ name: "task", completed: false, dependMet: false }],
|
||
});
|
||
const config: RuneConfig = {
|
||
stages: {
|
||
plan: {
|
||
documents: [
|
||
{ name: "design", prompt: "生成设计" },
|
||
{ name: "task", prompt: "生成任务", depend: ["design"] },
|
||
],
|
||
},
|
||
},
|
||
};
|
||
const output = formatChangeStatus(status, config);
|
||
expect(output).toContain("依赖 design.md");
|
||
});
|
||
|
||
it("dependMet 为 false 但无 config 时不显示文档依赖信息", () => {
|
||
const status = makeStatus({
|
||
documents: [{ name: "task", completed: false, dependMet: false }],
|
||
});
|
||
const output = formatChangeStatus(status);
|
||
expect(output).not.toContain("(依赖");
|
||
});
|
||
|
||
it("显示规划进度", () => {
|
||
const status = makeStatus({
|
||
documents: [
|
||
{ name: "design", completed: true, dependMet: true },
|
||
{ name: "task", completed: false, dependMet: true },
|
||
],
|
||
});
|
||
const output = formatChangeStatus(status);
|
||
expect(output).toContain("1/2 文档已完成");
|
||
});
|
||
|
||
it("规划完成时显示构建已解锁", () => {
|
||
const status = makeStatus({
|
||
documents: [
|
||
{ name: "design", completed: true, dependMet: true },
|
||
{ name: "task", completed: true, dependMet: true },
|
||
],
|
||
planCompleted: true,
|
||
buildUnlocked: true,
|
||
});
|
||
const output = formatChangeStatus(status);
|
||
expect(output).toContain("已解锁");
|
||
});
|
||
|
||
it("显示任务进度", () => {
|
||
const status = makeStatus({
|
||
taskProgress: { completed: 3, total: 5 },
|
||
});
|
||
const output = formatChangeStatus(status);
|
||
expect(output).toContain("3/5 已完成");
|
||
});
|
||
|
||
it("包含下一步建议", () => {
|
||
const output = formatChangeStatus(makeStatus());
|
||
expect(output).toContain("建议下一步");
|
||
});
|
||
});
|
||
|
||
describe("suggestNextStep", () => {
|
||
it("规划未完成时返回下一个可规划文档", () => {
|
||
const status = makeStatus({
|
||
documents: [{ name: "design", completed: false, dependMet: true }],
|
||
});
|
||
expect(suggestNextStep(status)).toContain("rune plan test-change design");
|
||
});
|
||
|
||
it("规划未完成且依赖未满足时提示完成前置依赖", () => {
|
||
const status = makeStatus({
|
||
documents: [{ name: "design", completed: false, dependMet: false }],
|
||
});
|
||
expect(suggestNextStep(status)).toBe("完成前置依赖后再规划文档");
|
||
});
|
||
|
||
it("规划完成且有未完成任务时建议 build", () => {
|
||
const status = makeStatus({
|
||
documents: [
|
||
{ name: "design", completed: true, dependMet: true },
|
||
{ name: "task", completed: true, dependMet: true },
|
||
],
|
||
planCompleted: true,
|
||
taskProgress: { completed: 2, total: 5 },
|
||
});
|
||
expect(suggestNextStep(status)).toContain("rune build test-change");
|
||
});
|
||
|
||
it("任务全部完成时建议 archive", () => {
|
||
const status = makeStatus({
|
||
documents: [
|
||
{ name: "design", completed: true, dependMet: true },
|
||
{ name: "task", completed: true, dependMet: true },
|
||
],
|
||
planCompleted: true,
|
||
taskProgress: { completed: 5, total: 5 },
|
||
});
|
||
expect(suggestNextStep(status)).toContain("rune archive test-change");
|
||
});
|
||
|
||
it("规划完成但无 taskProgress 时建议 build", () => {
|
||
const status = makeStatus({
|
||
documents: [
|
||
{ name: "design", completed: true, dependMet: true },
|
||
{ name: "task", completed: true, dependMet: true },
|
||
],
|
||
planCompleted: true,
|
||
taskProgress: null,
|
||
});
|
||
expect(suggestNextStep(status)).toContain("rune build test-change");
|
||
});
|
||
});
|