Files
workspace/code/fms/fms-vue/tests/unit/module-rule-utils.spec.js
2026-09-19 21:17:02 +08:00

67 lines
2.6 KiB
JavaScript

/**
* 删除 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)
})
})