Archived
human-tool / ledger / loop-engine / release / task / interaction 六模块与 app 层(desk 路由、engines、consumers、 data-order-landing、case-stamp、reset-runs、seed-activities、容器与 server 装配),web 的 desk-task (ViewRegion / chat-bubbles / review-face)与 app.css、ui-kit 图标;契约 card / manifest; 迁移 0034_task_seq 与迁移日志;api-report 快照;CLAUDE.md 快照、debt、活动开发规范、HTML 报告规范同步。 逐条口径见 CLAUDE.md 快照(2026-08-27 下午至晚)。另一会话做的,一直留在工作树没入库;与同批另两条提交互相依赖。 Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_0167qWjeyBwvfdGovd7FWbCu
34 lines
1.7 KiB
TypeScript
34 lines
1.7 KiB
TypeScript
/** 沙箱看板的取数声明:形状、地址与列名的规矩;老清单(不带 data)照旧过 */
|
|
import { describe, expect, it } from 'vitest';
|
|
import { VIEW_DATA_CASE_REF, viewDataSchema, viewTemplateSchema } from '../index.ts';
|
|
|
|
const spec = {
|
|
case: { ledger: 'sub_eval.verdict', key: 'eval_ref', prefix: 'W05-' },
|
|
rows: [
|
|
{ as: 'sub_eval.verdict', ledger: 'sub_eval.verdict', by: { column: 'eval_ref', from: VIEW_DATA_CASE_REF } },
|
|
{ as: 'demand.request', ledger: 'demand.request', by: { column: 'request_id', from: 'sub_eval.verdict.request_id' } },
|
|
{
|
|
as: 'validation.history',
|
|
ledger: 'validation.record',
|
|
by: { column: 'validation_internal_pn', from: 'sub_eval.pn_check.internal_pn' },
|
|
not: { column: 'request_id', from: 'sub_eval.verdict.request_id' },
|
|
orderBy: [{ field: 'validation_id', dir: 'desc' }],
|
|
},
|
|
],
|
|
};
|
|
|
|
describe('viewDataSchema', () => {
|
|
it('往返', () => {
|
|
expect(viewDataSchema.parse(spec)).toEqual(spec);
|
|
});
|
|
it('地址要写成 域.对象,列名只准标识符', () => {
|
|
expect(viewDataSchema.safeParse({ ...spec, case: { ...spec.case, ledger: 'verdict' } }).success).toBe(false);
|
|
expect(viewDataSchema.safeParse({ ...spec, case: { ...spec.case, key: 'Eval-Ref' } }).success).toBe(false);
|
|
expect(viewDataSchema.safeParse({ ...spec, rows: [{ as: 'x', ledger: 'a.b', by: { column: 'c d', from: 'case' } }] }).success).toBe(false);
|
|
});
|
|
it('模版不带 data 照旧;带了就按 schema 归型', () => {
|
|
expect(viewTemplateSchema.parse({ name: 'p08', html: '<p/>' })).toEqual({ name: 'p08', html: '<p/>' });
|
|
expect(viewTemplateSchema.parse({ name: 'board', html: '<p/>', data: spec }).data).toEqual(spec);
|
|
});
|
|
});
|