Files
Rune-Spec/tests/cli/status.test.ts

149 lines
4.7 KiB
TypeScript
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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");
});
});