@lark-project/cli
Version:
飞书项目插件开发工具
76 lines (75 loc) • 3.73 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.assertProbe = void 0;
const compare_1 = require("../compare");
function assertProbe(probe, obs) {
const { expect } = probe;
const fail = (actual, detail) => ({ probe, pass: false, actualOutcome: actual, detail });
const ok = (actual) => ({ probe, pass: true, actualOutcome: actual, detail: 'ok' });
const roundtripCheck = () => {
if (!obs.s0 || !obs.s1) {
return {
kind: 'snapshot_missing',
detail: `snapshot absent after successful update (s0=${obs.s0 ? 'ok' : 'null'}, s1=${obs.s1 ? 'ok' : 'null'}) — tooling/path misconfig, not a constraint result`,
};
}
const d = (0, compare_1.comparePointInfoMaps)(obs.s0, obs.s1);
if (d.diffs.length || d.missingInRemote.length) {
return { kind: 'diff', detail: `roundtrip diff: ${JSON.stringify(d.diffs)} missing:${JSON.stringify(d.missingInRemote)}` };
}
return { kind: 'clean' };
};
const resolveRoundtrip = (okOutcome) => {
const rt = roundtripCheck();
if (rt.kind === 'snapshot_missing')
return fail('snapshot_missing', rt.detail);
if (rt.kind === 'diff')
return fail('roundtrip_diff', rt.detail);
return ok(okOutcome);
};
switch (expect.outcome) {
case 'blocked_at_set': {
if (obs.setExitCode === 0)
return fail('set_passed', 'expected set to fail but it passed');
if (expect.error_match && !new RegExp(expect.error_match).test(obs.setStderr)) {
return fail('set_failed_wrong_error', `stderr did not match /${expect.error_match}/: ${obs.setStderr.trim()}`);
}
return ok('blocked_at_set');
}
case 'blocked_at_push': {
if (obs.setExitCode !== 0)
return fail('blocked_at_set', 'expected set to pass first');
if (obs.updateExitCode === null)
return fail('blocked_at_set', 'update did not run');
if (obs.updateExitCode === 0)
return fail('push_passed', 'expected push to be rejected');
if (expect.error_match && !new RegExp(expect.error_match).test(obs.updateStderr)) {
return fail('push_failed_wrong_error', `stderr did not match /${expect.error_match}/`);
}
return ok('blocked_at_push');
}
case 'stored': {
if (obs.setExitCode !== 0)
return fail('blocked_at_set', obs.setStderr.trim());
if (obs.updateExitCode !== 0)
return fail('blocked_at_push', obs.updateStderr.trim());
return resolveRoundtrip('stored');
}
case 'default_applied': {
if (obs.setExitCode !== 0)
return fail('blocked_at_set', obs.setStderr.trim());
if (obs.updateExitCode !== 0)
return fail('blocked_at_push', obs.updateStderr.trim());
if (expect.value_match && !new RegExp(expect.value_match).test(JSON.stringify(obs.s0))) {
return fail('default_missing', `S0 did not contain /${expect.value_match}/`);
}
return resolveRoundtrip('default_applied');
}
// 探针 catalog 是手写 JSON(见 conformance.md),outcome 拼错时 expect.outcome
// 会越出 ProbeOutcome 联合——给出显式 FAIL,而不是让函数返回 undefined 后在
// renderMatrix 里读 undefined.pass 崩掉。
default:
return fail('unknown_outcome', `unhandled expect.outcome: ${String(expect.outcome)}`);
}
}
exports.assertProbe = assertProbe;