75 lines
2.5 KiB
TypeScript
75 lines
2.5 KiB
TypeScript
import { beforeEach, describe, expect, it, vi } from 'vitest';
|
|
import { useProjectConfigStore } from '@/stores/project-config';
|
|
import type { CodingProjectConfigSnapshot } from '@/types/coding-project';
|
|
|
|
const resolveCodingProjectIdentity = vi.hoisted(() => vi.fn());
|
|
const makeCodingProjectIndependentCopy = vi.hoisted(() => vi.fn());
|
|
|
|
vi.mock('@/lib/coding-projects', () => ({
|
|
makeCodingProjectIndependentCopy,
|
|
resolveCodingProjectIdentity,
|
|
}));
|
|
|
|
const projectId = 'local-project-1';
|
|
|
|
function snapshot(identity: string): CodingProjectConfigSnapshot {
|
|
return {
|
|
project: {
|
|
id: projectId,
|
|
name: 'Local project',
|
|
createdAt: '2026-08-23T00:00:00.000Z',
|
|
updatedAt: '2026-08-23T00:00:00.000Z',
|
|
lastOpenedAt: '2026-08-23T00:00:00.000Z',
|
|
},
|
|
config: {
|
|
schemaVersion: 2,
|
|
projectType: 'custom',
|
|
projectId: identity,
|
|
initialized: true,
|
|
agents: [],
|
|
knowledgeDirectory: 'knowledge',
|
|
legacyConversationNotice: 'none',
|
|
createdAt: '2026-08-23T00:00:00.000Z',
|
|
updatedAt: '2026-08-23T00:00:00.000Z',
|
|
},
|
|
knowledgeFiles: ['README.md'],
|
|
};
|
|
}
|
|
|
|
describe('project config identity projection', () => {
|
|
beforeEach(() => {
|
|
vi.clearAllMocks();
|
|
useProjectConfigStore.setState({
|
|
configsByProjectId: {},
|
|
knowledgeByProjectId: {},
|
|
loadingProjectId: null,
|
|
errorsByProjectId: {},
|
|
});
|
|
});
|
|
|
|
it('projects identity resolution snapshots into the renderer cache', async () => {
|
|
const resolved = snapshot('aaaaaaaa-aaaa-4aaa-8aaa-aaaaaaaaaaaa');
|
|
resolveCodingProjectIdentity.mockResolvedValue(resolved);
|
|
|
|
await expect(useProjectConfigStore.getState().resolveIdentity(projectId, { kind: 'create' }))
|
|
.resolves.toEqual(resolved.config);
|
|
|
|
expect(resolveCodingProjectIdentity).toHaveBeenCalledWith(projectId, { kind: 'create' });
|
|
expect(useProjectConfigStore.getState()).toMatchObject({
|
|
configsByProjectId: { [projectId]: resolved.config },
|
|
knowledgeByProjectId: { [projectId]: resolved.knowledgeFiles },
|
|
});
|
|
});
|
|
|
|
it('projects independent-copy snapshots without writing any renderer-owned data', async () => {
|
|
const copied = snapshot('bbbbbbbb-bbbb-4bbb-8bbb-bbbbbbbbbbbb');
|
|
makeCodingProjectIndependentCopy.mockResolvedValue(copied);
|
|
|
|
await expect(useProjectConfigStore.getState().makeIndependentCopy(projectId))
|
|
.resolves.toEqual(copied.config);
|
|
|
|
expect(makeCodingProjectIndependentCopy).toHaveBeenCalledWith(projectId);
|
|
expect(useProjectConfigStore.getState().configsByProjectId[projectId]).toEqual(copied.config);
|
|
});
|
|
});
|