feat(lanes): validate a scaffolded profile with checkProfile (A3)
This commit is contained in:
@@ -262,3 +262,67 @@ describe("scaffoldProfile", () => {
|
||||
assert.doesNotThrow(() => detect.scaffoldProfile(repo, facts, { force: true }));
|
||||
});
|
||||
});
|
||||
|
||||
describe("checkProfile", () => {
|
||||
it("passes a freshly-scaffolded no-database profile with a real script", async () => {
|
||||
const repo = makeRepo();
|
||||
writePkg(repo, { start: "node index.js" });
|
||||
detect.scaffoldProfile(repo, detect.detectNode(repo));
|
||||
const result = await detect.checkProfile(repo);
|
||||
assert.deepEqual(result.errors, []);
|
||||
assert.equal(result.ok, true);
|
||||
});
|
||||
|
||||
it("fails on a database profile with unresolved migrate/seed TODOs", async () => {
|
||||
const repo = makeRepo();
|
||||
writePkg(path.join(repo, "backend"), { start: "node server.js" });
|
||||
writePkg(path.join(repo, "frontend"), { dev: "vite" });
|
||||
writeCompose(repo, " postgres:\n image: postgres:16\n");
|
||||
detect.scaffoldProfile(repo, detect.detectNode(repo));
|
||||
const result = await detect.checkProfile(repo);
|
||||
assert.equal(result.ok, false);
|
||||
assert.ok(result.errors.some((e) => /TODO/.test(e)));
|
||||
});
|
||||
|
||||
it("fails when a declared port is already in use", async () => {
|
||||
const net = require("node:net");
|
||||
const repo = makeRepo();
|
||||
writePkg(repo, { start: "node index.js" });
|
||||
detect.scaffoldProfile(repo, detect.detectNode(repo));
|
||||
const server = net.createServer(() => {});
|
||||
await new Promise((resolve, reject) => {
|
||||
server.once("error", reject);
|
||||
server.listen(3000, "127.0.0.1", resolve);
|
||||
});
|
||||
try {
|
||||
const result = await detect.checkProfile(repo);
|
||||
assert.equal(result.ok, false);
|
||||
assert.ok(result.errors.some((e) => /3000/.test(e)));
|
||||
} finally {
|
||||
server.close();
|
||||
}
|
||||
});
|
||||
|
||||
it("fails when a referenced hook is missing", async () => {
|
||||
const repo = makeRepo();
|
||||
writePkg(repo, { start: "node index.js" });
|
||||
detect.scaffoldProfile(repo, detect.detectNode(repo));
|
||||
fs.rmSync(path.join(repo, ".ccam", "profile", "hooks", "health.sh"));
|
||||
const result = await detect.checkProfile(repo);
|
||||
assert.equal(result.ok, false);
|
||||
assert.ok(result.errors.some((e) => /health/.test(e)));
|
||||
});
|
||||
|
||||
it("warns (does not fail) when secrets.env is missing for a database profile", async () => {
|
||||
const repo = makeRepo();
|
||||
writePkg(repo, { start: "node index.js" });
|
||||
writeCompose(repo, " postgres:\n image: postgres:16\n");
|
||||
detect.scaffoldProfile(repo, detect.detectNode(repo));
|
||||
// Remove the migrate/seed TODO lines so only the secrets warning is left to check.
|
||||
const hooksDir = path.join(repo, ".ccam", "profile", "hooks");
|
||||
fs.writeFileSync(path.join(hooksDir, "migrate.sh"), "#!/usr/bin/env bash\nexit 0\n");
|
||||
fs.writeFileSync(path.join(hooksDir, "seed.sh"), "#!/usr/bin/env bash\nexit 0\n");
|
||||
const result = await detect.checkProfile(repo);
|
||||
assert.ok(result.warnings.some((w) => /secrets\.env/.test(w)));
|
||||
});
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user