ensure-test-company.js 2.11 KB
/**
 * 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 是硬编码的
 * `<repo>/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 };