106 lines
3.3 KiB
TypeScript
106 lines
3.3 KiB
TypeScript
|
|
import assert from 'node:assert/strict';
|
||
|
|
import test from 'node:test';
|
||
|
|
|
||
|
|
import {
|
||
|
|
getProjectTaskMaster,
|
||
|
|
getProjectTaskMasterById,
|
||
|
|
} from '@/modules/projects/services/projects-has-taskmaster.service.js';
|
||
|
|
import { AppError } from '@/shared/utils.js';
|
||
|
|
|
||
|
|
test('getProjectTaskMasterById returns null when project path is missing', async () => {
|
||
|
|
const result = await getProjectTaskMasterById('project-1', {
|
||
|
|
resolveProjectPathById: () => null,
|
||
|
|
detectTaskMasterFolder: async () => {
|
||
|
|
throw new Error('detectTaskMasterFolder should not be called when path is missing');
|
||
|
|
},
|
||
|
|
});
|
||
|
|
|
||
|
|
assert.equal(result, null);
|
||
|
|
});
|
||
|
|
|
||
|
|
test('getProjectTaskMasterById returns configured status when taskmaster exists with essential files', async () => {
|
||
|
|
const result = await getProjectTaskMasterById('project-1', {
|
||
|
|
resolveProjectPathById: () => '/workspace/project-1',
|
||
|
|
detectTaskMasterFolder: async () => ({
|
||
|
|
hasTaskmaster: true,
|
||
|
|
hasEssentialFiles: true,
|
||
|
|
metadata: {
|
||
|
|
taskCount: 3,
|
||
|
|
subtaskCount: 0,
|
||
|
|
completed: 1,
|
||
|
|
pending: 2,
|
||
|
|
inProgress: 0,
|
||
|
|
review: 0,
|
||
|
|
completionPercentage: 33,
|
||
|
|
lastModified: '2026-01-01T00:00:00.000Z',
|
||
|
|
},
|
||
|
|
}),
|
||
|
|
});
|
||
|
|
|
||
|
|
assert.ok(result);
|
||
|
|
assert.equal(result.projectId, 'project-1');
|
||
|
|
assert.equal(result.projectPath, '/workspace/project-1');
|
||
|
|
assert.equal(result.taskmaster.hasTaskmaster, true);
|
||
|
|
assert.equal(result.taskmaster.hasEssentialFiles, true);
|
||
|
|
assert.equal(result.taskmaster.status, 'configured');
|
||
|
|
assert.deepEqual(result.taskmaster.metadata, {
|
||
|
|
taskCount: 3,
|
||
|
|
subtaskCount: 0,
|
||
|
|
completed: 1,
|
||
|
|
pending: 2,
|
||
|
|
inProgress: 0,
|
||
|
|
review: 0,
|
||
|
|
completionPercentage: 33,
|
||
|
|
lastModified: '2026-01-01T00:00:00.000Z',
|
||
|
|
});
|
||
|
|
});
|
||
|
|
|
||
|
|
test('getProjectTaskMasterById returns not-configured status when taskmaster is missing', async () => {
|
||
|
|
const result = await getProjectTaskMasterById('project-1', {
|
||
|
|
resolveProjectPathById: () => '/workspace/project-1',
|
||
|
|
detectTaskMasterFolder: async () => ({
|
||
|
|
hasTaskmaster: false,
|
||
|
|
}),
|
||
|
|
});
|
||
|
|
|
||
|
|
assert.ok(result);
|
||
|
|
assert.equal(result.taskmaster.hasTaskmaster, false);
|
||
|
|
assert.equal(result.taskmaster.hasEssentialFiles, false);
|
||
|
|
assert.equal(result.taskmaster.status, 'not-configured');
|
||
|
|
assert.equal(result.taskmaster.metadata, null);
|
||
|
|
});
|
||
|
|
|
||
|
|
test('getProjectTaskMaster throws when project id is missing', async () => {
|
||
|
|
await assert.rejects(
|
||
|
|
async () =>
|
||
|
|
getProjectTaskMaster('', async () => ({
|
||
|
|
projectId: 'project-1',
|
||
|
|
projectPath: '/workspace/project-1',
|
||
|
|
taskmaster: {
|
||
|
|
hasTaskmaster: true,
|
||
|
|
hasEssentialFiles: true,
|
||
|
|
metadata: null,
|
||
|
|
status: 'configured',
|
||
|
|
},
|
||
|
|
})),
|
||
|
|
(error: unknown) => {
|
||
|
|
assert.ok(error instanceof AppError);
|
||
|
|
assert.equal(error.code, 'PROJECT_ID_REQUIRED');
|
||
|
|
assert.equal(error.statusCode, 400);
|
||
|
|
return true;
|
||
|
|
},
|
||
|
|
);
|
||
|
|
});
|
||
|
|
|
||
|
|
test('getProjectTaskMaster throws when project does not exist', async () => {
|
||
|
|
await assert.rejects(
|
||
|
|
async () => getProjectTaskMaster('project-that-does-not-exist', async () => null),
|
||
|
|
(error: unknown) => {
|
||
|
|
assert.ok(error instanceof AppError);
|
||
|
|
assert.equal(error.code, 'PROJECT_NOT_FOUND');
|
||
|
|
assert.equal(error.statusCode, 404);
|
||
|
|
return true;
|
||
|
|
},
|
||
|
|
);
|
||
|
|
});
|