import assert from 'node:assert/strict'; import { mkdtemp, rm } from 'node:fs/promises'; import { tmpdir } from 'node:os'; import path from 'node:path'; import test from 'node:test'; import { closeConnection } from '@/modules/database/connection.js'; import { initializeDatabase } from '@/modules/database/init-db.js'; import { projectsDb } from '@/modules/database/repositories/projects.db.js'; async function withIsolatedDatabase(runTest: () => void | Promise): Promise { const previousDatabasePath = process.env.DATABASE_PATH; const tempDirectory = await mkdtemp(path.join(tmpdir(), 'projects-db-')); const databasePath = path.join(tempDirectory, 'auth.db'); closeConnection(); process.env.DATABASE_PATH = databasePath; await initializeDatabase(); try { await runTest(); } finally { closeConnection(); if (previousDatabasePath === undefined) { delete process.env.DATABASE_PATH; } else { process.env.DATABASE_PATH = previousDatabasePath; } await rm(tempDirectory, { recursive: true, force: true }); } } test('projectsDb.createProjectPath returns created for fresh paths', async () => { await withIsolatedDatabase(() => { const created = projectsDb.createProjectPath('/workspace/new-project'); assert.equal(created.outcome, 'created'); assert.ok(created.project); assert.equal(created.project?.project_path, '/workspace/new-project'); assert.equal(created.project?.isArchived, 0); }); }); test('projectsDb.createProjectPath returns reactivated_archived for archived duplicates', async () => { await withIsolatedDatabase(() => { const initial = projectsDb.createProjectPath('/workspace/archived-project', 'Archived Project'); assert.equal(initial.outcome, 'created'); assert.ok(initial.project); projectsDb.updateProjectIsArchived('/workspace/archived-project', true); const reused = projectsDb.createProjectPath('/workspace/archived-project', 'Renamed Project'); assert.equal(reused.outcome, 'reactivated_archived'); assert.ok(reused.project); assert.equal(reused.project?.project_id, initial.project?.project_id); assert.equal(reused.project?.isArchived, 0); }); }); test('projectsDb.createProjectPath returns active_conflict for active duplicates', async () => { await withIsolatedDatabase(() => { const initial = projectsDb.createProjectPath('/workspace/active-project'); assert.equal(initial.outcome, 'created'); assert.ok(initial.project); const conflict = projectsDb.createProjectPath('/workspace/active-project'); assert.equal(conflict.outcome, 'active_conflict'); assert.ok(conflict.project); assert.equal(conflict.project?.project_id, initial.project?.project_id); assert.equal(conflict.project?.isArchived, 0); }); });