/** 沙箱看板的取数声明:形状、地址与列名的规矩;老清单(不带 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: '
' })).toEqual({ name: 'p08', html: '' }); expect(viewTemplateSchema.parse({ name: 'board', html: '', data: spec }).data).toEqual(spec); }); });