feat(tasktree): 完善导入与甘特详情体验

This commit is contained in:
root
2026-07-17 09:26:49 +02:00
parent 1aaf2044f8
commit 3130e2b9db
12 changed files with 720 additions and 169 deletions
+12 -3
View File
@@ -29,7 +29,7 @@ test("HTTP command endpoint returns the same dispatcher DTO", async () => {
assert.deepEqual(await response.json(), expected);
});
test("native PostgreSQL store exposes timeline DTO and rejects a third task level", async () => {
test("native PostgreSQL store exposes overview and three task levels", async () => {
const databaseUrl = process.env.TASKTREE_DATABASE_URL;
assert.ok(databaseUrl, "TASKTREE_DATABASE_URL is required for the TaskTree store integration test");
const store = new TaskTreeStore(databaseUrl);
@@ -42,19 +42,28 @@ test("native PostgreSQL store exposes timeline DTO and rejects a third task leve
dueAt: "2026-07-18T00:00:00.000Z"
});
const subtask = await store.createTask({ groupId: group.id, parentId: task.id, title: "Subtask" });
const subsubtask = await store.createTask({ groupId: group.id, parentId: subtask.id, title: "Subsubtask" });
await store.createMilestone({ groupId: group.id, taskId: task.id, title: "Review", occursAt: "2026-07-17T00:00:00.000Z" });
await store.createReport({ taskId: subtask.id, title: "Execution", body: "passed" });
await assert.rejects(
store.createTask({ groupId: group.id, parentId: subtask.id, title: "Unsupported third level" }),
store.createTask({ groupId: group.id, parentId: subsubtask.id, title: "Unsupported fourth level" }),
(error: any) => error?.code === "maximum_depth_exceeded"
);
const timeline = await store.timeline(group.id);
assert.equal(timeline?.tasks.length, 2);
assert.equal(timeline?.tasks.length, 3);
assert.equal(timeline?.tasks[0]?.kind, "task");
assert.equal(timeline?.tasks[1]?.kind, "subtask");
assert.equal(timeline?.tasks[2]?.kind, "subsubtask");
assert.equal(timeline?.milestones.length, 1);
assert.equal(timeline?.reports.length, 1);
const overview = (await store.groupOverview()).find((item) => item.group.id === group.id);
assert.equal(overview?.taskCount, 1);
assert.equal(overview?.subtaskCount, 1);
assert.equal(overview?.subsubtaskCount, 1);
assert.equal(overview?.reportCount, 1);
assert.equal(overview?.startAt, "2026-07-16T00:00:00.000Z");
assert.equal(overview?.dueAt, "2026-07-18T00:00:00.000Z");
} finally {
await store.deleteGroup(group.id);
await store.close();