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); }); });