/** * ensure-test-company.js —— 38 号文档 Phase 2 落地后,company.js / graph-run.js 的 * :companyId / :id 路由都会先查 company-service.js 的 companyService.get(cid)(判断 * "这家公司存不存在"),存在才轮到归属校验。company-service.js 的 DATA_DIR 是硬编码的 * `/data/companies`,无 env 覆盖口,且只认 company.json 这一份真相。 * * 仓库里一批测试文件直接在 graph_runs/company_agents 等表里插一个虚构的 companyId * (从没真的建过公司),这在 Phase 2 之前无所谓——company.js 那层从不检查。现在会被 * 挡在 router.param 那一关,404。这个 helper 补一份最小 company.json,让这类"只是需要 * 一个 companyId 字符串来做数据隔离"的测试继续成立,不代表要去验证公司归属本身 * (那是 company-service.test.js / route-auth-gate.test.js 的职责)。 * * 幂等、同步、可重复调用。清理交给调用方自己的 afterAll(多数这类测试本来就有一次性 * 数据目录清理逻辑,顺手带上这个)。 */ const fs = require('fs'); const path = require('path'); const COMPANIES_DIR = path.resolve(__dirname, '../../../data/companies'); /** * @param {string} companyId * @param {object} [opts] * @param {number} [opts.ownerId] - 默认 -1,跟 jwt-auth.js 测试环境放行时用的 * TEST_BYPASS_USER.id 对齐,但其实无所谓——TEST_BYPASS_USER.role='admin', * canAccessCompany 不看 ownerId。 */ function ensureTestCompany(companyId, { ownerId = -1 } = {}) { const dir = path.join(COMPANIES_DIR, companyId); const fp = path.join(dir, 'company.json'); if (fs.existsSync(fp)) return; fs.mkdirSync(dir, { recursive: true }); fs.writeFileSync(fp, JSON.stringify({ id: companyId, name: companyId, ownerId })); } /** 测试收尾用:删掉 ensureTestCompany 建出来的目录(连同调用方自己可能写进去的其它文件)。*/ function removeTestCompany(companyId) { fs.rmSync(path.join(COMPANIES_DIR, companyId), { recursive: true, force: true }); } module.exports = { ensureTestCompany, removeTestCompany };