任务
逐条比对期望状态与实际状态,输出矩阵是否通过,并按名称列出所有不一致的用例。
契约
- 输入:JSON 对象:{ cases: [{ name, expected }], actual: { [name]: number } }
- 输出:JSON 对象:{ passed: boolean, failed: string[] }
样例
- 输入
{"cases":[{"name":"anonymous","expected":401},{"name":"owner","expected":200},{"name":"admin","expected":200}],"actual":{"anonymous":401,"owner":200,"admin":403}}-> 期望{"passed":false,"failed":["admin"]}。admin 用例期望 200,实际返回 403。 - 输入
{"cases":[{"name":"other-tenant","expected":404},{"name":"same-tenant","expected":403}],"actual":{"other-tenant":404,"same-tenant":403}}-> 期望{"passed":true,"failed":[]}。所有用例都与期望状态一致。
参考实现
function solve({ cases, actual }) {
const failed = cases.filter((c) => actual[c.name] !== c.expected).map((c) => c.name);
return { passed: failed.length === 0, failed };
}
为什么有效
对象级授权漏洞往往藏在角色之间的缝隙里。把期望状态写成数据,等于把访问控制变成回归测试,而不是代码评审时的个人看法。
缺失的实际状态计为失败;不要把 undefined 当成通过。