const test = require('node:test');
const assert = require('node:assert/strict');
const fs = require('fs/promises');
const path = require('path');
const os = require('os');
const ProjectService = require('../src/services/ProjectService.cjs');
const loggerStub = {
child() {
return this;
},
info() {},
warn() {},
error() {},
};
test('ProjectService persists and lists projects', async (t) => {
const tmpRoot = await fs.mkdtemp(path.join(os.tmpdir(), 'sentryfrogg-projects-'));
const previousPath = process.env.MCP_PROJECTS_PATH;
process.env.MCP_PROJECTS_PATH = path.join(tmpRoot, 'projects.json');
t.after(async () => {
if (previousPath === undefined) {
delete process.env.MCP_PROJECTS_PATH;
} else {
process.env.MCP_PROJECTS_PATH = previousPath;
}
await fs.rm(tmpRoot, { recursive: true, force: true });
});
const service = new ProjectService(loggerStub);
await service.initialize();
const payload = {
description: 'Demo project',
default_target: 'prod',
targets: {
prod: {
ssh_profile: 'demo-prod-ssh',
env_profile: 'demo-prod-env',
},
},
};
const saved = await service.setProject('demo', payload);
assert.equal(saved.success, true);
assert.equal(saved.project.name, 'demo');
const fetched = await service.getProject('demo');
assert.equal(fetched.project.default_target, 'prod');
assert.equal(fetched.project.targets.prod.ssh_profile, 'demo-prod-ssh');
const list = await service.listProjects();
assert.equal(list.projects.length, 1);
assert.equal(list.projects[0].name, 'demo');
const removed = await service.deleteProject('demo');
assert.equal(removed.project, 'demo');
const listAfter = await service.listProjects();
assert.equal(listAfter.projects.length, 0);
});