/** * 删除 SQL 规则配置工具(module-management/ruleUtils): * 新增行构造、列表识别文案、SQL 内容校验。 */ import { describe, expect, it } from 'vitest' import { IDS_PLACEHOLDER, createRuleRow, ruleHasSql, ruleIsReadOnlySql, ruleLabel, ruleSummary, } from '@/views/module/module-management/ruleUtils' describe('删除 SQL 规则工具', () => { it('新增行:主键由调用方取号传入,模块列直接物化,无名称/编码字段', () => { const rule = createRuleRow('order', { id: '1900000000000000001', xh: 30 }) expect(rule).toMatchObject({ b_id: '1900000000000000001', b_module_id: 'order', b_canuse: 1, b_xh: 30, }) // 新增行的 SQL 预填 :ids 骨架,直接可改 expect(rule.b_sql).toContain(IDS_PLACEHOLDER) expect(rule.b_code).toBeUndefined() expect(rule.b_name).toBeUndefined() // 旧设计的字段不再出现 expect(rule.b_scope_type).toBeUndefined() expect(rule.b_scope_id).toBeUndefined() expect(rule.b_predicate).toBeUndefined() expect(rule.b_hook).toBeUndefined() }) it('摘要:SQL 单行化并按长度截断,空 SQL 给可读提示', () => { const row = { b_sql: 'select\n b_id\nfrom bill where b_settled = 1' } expect(ruleSummary(row)).toBe('select b_id from bill where b_settled = 1') expect(ruleSummary({ b_sql: null })).toBe('未填写 SQL') const long = { b_sql: `select b_id from t where ${'x'.repeat(100)}` } const summary = ruleSummary(long) expect(summary.endsWith('…')).toBe(true) expect(summary.length).toBeLessThanOrEqual(81) }) it('识别文案:优先提示文案,缺文案退回 SQL 片段', () => { const row = { b_sql: 'select 1 as b_id', b_message: '单据已销账,不能删除', } expect(ruleLabel(row)).toBe('单据已销账,不能删除') expect(ruleLabel({ ...row, b_message: null })).toBe('select 1 as b_id') expect(ruleLabel({ ...row, b_message: ' ' })).toBe('select 1 as b_id') }) it('SQL 校验:必须非空、包含 :ids、且是只读查询', () => { expect(ruleHasSql({ b_sql: 'select b_id from t where b_id in (:ids)' })).toBe(true) expect(ruleHasSql({ b_sql: 'select b_id from t' })).toBe(false) expect(ruleHasSql({ b_sql: null })).toBe(false) expect(ruleIsReadOnlySql({ b_sql: 'select b_id from t' })).toBe(true) expect(ruleIsReadOnlySql({ b_sql: ' WITH x AS (select 1) select * from x' })).toBe(true) expect(ruleIsReadOnlySql({ b_sql: 'delete from t' })).toBe(false) expect(ruleIsReadOnlySql({ b_sql: null })).toBe(false) }) })