mirror of
https://github.com/siteboon/claudecodeui.git
synced 2026-04-30 09:21:33 +00:00
124 lines
3.5 KiB
TypeScript
124 lines
3.5 KiB
TypeScript
import assert from 'node:assert/strict';
|
|
import test from 'node:test';
|
|
|
|
import { projectsDb } from '@/modules/database/index.js';
|
|
import { applyLegacyStarredProjectIds, toggleProjectStar } from '@/modules/projects/services/project-star.service.js';
|
|
import { AppError } from '@/shared/utils.js';
|
|
|
|
type ProjectRow = {
|
|
project_id: string;
|
|
project_path: string;
|
|
custom_project_name: string | null;
|
|
isStarred: number;
|
|
isArchived: number;
|
|
};
|
|
|
|
test('toggleProjectStar throws when projectId is missing', () => {
|
|
assert.throws(
|
|
() => toggleProjectStar(' '),
|
|
(error: unknown) =>
|
|
error instanceof AppError
|
|
&& error.code === 'PROJECT_ID_REQUIRED'
|
|
&& error.statusCode === 400,
|
|
);
|
|
});
|
|
|
|
test('toggleProjectStar throws when project does not exist', () => {
|
|
const originalGetProjectById = projectsDb.getProjectById;
|
|
try {
|
|
projectsDb.getProjectById = () => null;
|
|
assert.throws(
|
|
() => toggleProjectStar('project-1'),
|
|
(error: unknown) =>
|
|
error instanceof AppError
|
|
&& error.code === 'PROJECT_NOT_FOUND'
|
|
&& error.statusCode === 404,
|
|
);
|
|
} finally {
|
|
projectsDb.getProjectById = originalGetProjectById;
|
|
}
|
|
});
|
|
|
|
test('toggleProjectStar flips star state and persists it', () => {
|
|
const originalGetProjectById = projectsDb.getProjectById;
|
|
const originalUpdateProjectIsStarredById = projectsDb.updateProjectIsStarredById;
|
|
|
|
let capturedProjectId = '';
|
|
let capturedState = false;
|
|
|
|
try {
|
|
projectsDb.getProjectById = () =>
|
|
({
|
|
project_id: 'project-1',
|
|
project_path: '/workspace/project-1',
|
|
custom_project_name: 'project-1',
|
|
isStarred: 0,
|
|
isArchived: 0,
|
|
}) as ProjectRow;
|
|
projectsDb.updateProjectIsStarredById = (projectId: string, isStarred: boolean) => {
|
|
capturedProjectId = projectId;
|
|
capturedState = isStarred;
|
|
};
|
|
|
|
const result = toggleProjectStar('project-1');
|
|
|
|
assert.equal(result.isStarred, true);
|
|
assert.equal(capturedProjectId, 'project-1');
|
|
assert.equal(capturedState, true);
|
|
} finally {
|
|
projectsDb.getProjectById = originalGetProjectById;
|
|
projectsDb.updateProjectIsStarredById = originalUpdateProjectIsStarredById;
|
|
}
|
|
});
|
|
|
|
test('applyLegacyStarredProjectIds stars only valid, unstarred projects', () => {
|
|
const originalGetProjectById = projectsDb.getProjectById;
|
|
const originalUpdateProjectIsStarredById = projectsDb.updateProjectIsStarredById;
|
|
|
|
const updatedProjectIds: string[] = [];
|
|
|
|
try {
|
|
projectsDb.getProjectById = (projectId: string) => {
|
|
if (projectId === 'project-a') {
|
|
return {
|
|
project_id: 'project-a',
|
|
project_path: '/workspace/project-a',
|
|
custom_project_name: 'A',
|
|
isStarred: 0,
|
|
isArchived: 0,
|
|
} as ProjectRow;
|
|
}
|
|
|
|
if (projectId === 'project-b') {
|
|
return {
|
|
project_id: 'project-b',
|
|
project_path: '/workspace/project-b',
|
|
custom_project_name: 'B',
|
|
isStarred: 1,
|
|
isArchived: 0,
|
|
} as ProjectRow;
|
|
}
|
|
|
|
return null;
|
|
};
|
|
projectsDb.updateProjectIsStarredById = (projectId: string) => {
|
|
updatedProjectIds.push(projectId);
|
|
};
|
|
|
|
const result = applyLegacyStarredProjectIds([
|
|
'project-a',
|
|
'project-b',
|
|
'missing-project',
|
|
'project-a',
|
|
'',
|
|
' ',
|
|
]);
|
|
|
|
assert.equal(result.updated, 1);
|
|
assert.deepEqual(updatedProjectIds, ['project-a']);
|
|
} finally {
|
|
projectsDb.getProjectById = originalGetProjectById;
|
|
projectsDb.updateProjectIsStarredById = originalUpdateProjectIsStarredById;
|
|
}
|
|
});
|