20260919211702

This commit is contained in:
oneao committed 2026-09-19 21:17:02 +08:00
1 parent f56e70b050
commit f4bfc1ddfc
97 files changed
+6059 -1712

No files matched your search

@@ -0,0 +1,152 @@
import { describe, expect, it, vi } from 'vitest'
vi.mock('@/services/api', () => ({
loadDataApi: vi.fn(),
saveObjectApi: vi.fn(),
}))
vi.mock('@/stores/auth', () => ({
useAuthStore: () => ({ userInfo: { account: 'u001' } }),
}))
const {
PREF_SCHEMA_TYPES,
columnSettingsDelta,
isEmptyColumnDelta,
mergeColumnPref,
sameColumnSettings,
} = await import('@/components/fms-module-list/useModulePref')
/** 通用栏位行:字段 + 宽度,数组顺序即通用顺序 */
const base = [
{ b_field: 'b_id', b_width: 120, b_visible: 1 },
{ b_field: 'b_name', b_width: 200, b_visible: 1 },
{ b_field: 'b_amount', b_width: 160, b_visible: 1 },
]
/** 表格当前栏位设置(getColumnSettings 的形态) */
const current = (...pairs) => pairs.map(([b_field, b_width]) => ({ b_field, b_width }))
describe('栏位设置:个人层合并', () => {
it('无个人偏好时原样返回通用栏位', () => {
expect(mergeColumnPref(base, null)).toBe(base)
})
it('只覆盖宽度,保留通用行上的其它属性(b_visible 等)', () => {
const merged = mergeColumnPref(base, { columns: { b_name: { width: 300 } } })
const name = merged.find((row) => row.b_field === 'b_name')
expect(name.b_width).toBe(300)
expect(name.b_visible).toBe(1)
// 未覆盖的字段保持通用宽度
expect(merged.find((row) => row.b_field === 'b_id').b_width).toBe(120)
})
it('按 order 重排并重编 b_xh(10/20/30)', () => {
const merged = mergeColumnPref(base, { order: ['b_amount', 'b_id', 'b_name'] })
expect(merged.map((row) => row.b_field)).toEqual(['b_amount', 'b_id', 'b_name'])
expect(merged.map((row) => row.b_xh)).toEqual([10, 20, 30])
})
it('order 未列出的字段保持原有相对顺序、追加在后', () => {
const merged = mergeColumnPref(base, { order: ['b_amount'] })
expect(merged.map((row) => row.b_field)).toEqual(['b_amount', 'b_id', 'b_name'])
})
it('个人层不得新增字段:order 里的未知字段一律忽略', () => {
const merged = mergeColumnPref(base, { order: ['b_hack', 'b_id'] })
expect(merged.map((row) => row.b_field)).toEqual(['b_id', 'b_name', 'b_amount'])
})
it('个人层不得给未知字段设宽度', () => {
const merged = mergeColumnPref(base, { columns: { b_hack: { width: 999 } } })
expect(merged.some((row) => row.b_field === 'b_hack')).toBe(false)
})
})
describe('栏位设置:增量计算', () => {
it('完全一致时增量为空且不含 order(不把通用顺序固化)', () => {
const delta = columnSettingsDelta(
current(['b_id', 120], ['b_name', 200], ['b_amount', 160]),
base,
)
expect(delta.columns).toEqual({})
expect(delta.order).toBeUndefined()
expect(isEmptyColumnDelta(delta)).toBe(true)
})
it('只记改过的宽度,同宽字段不入增量(通用改宽仍能透传)', () => {
const delta = columnSettingsDelta(
current(['b_id', 120], ['b_name', 320], ['b_amount', 160]),
base,
)
expect(delta.columns).toEqual({ b_name: { width: 320 } })
expect(delta.order).toBeUndefined()
})
it('顺序变化时整体记 order', () => {
const delta = columnSettingsDelta(
current(['b_amount', 160], ['b_id', 120], ['b_name', 200]),
base,
)
expect(delta.order).toEqual(['b_amount', 'b_id', 'b_name'])
expect(isEmptyColumnDelta(delta)).toBe(false)
})
it('宽度与顺序都变了,两部分都记', () => {
const delta = columnSettingsDelta(
current(['b_name', 320], ['b_id', 120], ['b_amount', 160]),
base,
)
expect(delta.columns).toEqual({ b_name: { width: 320 } })
expect(delta.order).toEqual(['b_name', 'b_id', 'b_amount'])
})
it('未知字段不产生宽度增量', () => {
const delta = columnSettingsDelta(
current(['b_id', 120], ['b_name', 200], ['b_hack', 300]),
base,
)
expect(delta.columns).toEqual({})
})
})
describe('栏位设置:与基线比较', () => {
it('宽度相同且顺序相同 → 未调整', () => {
expect(
sameColumnSettings(current(['b_id', 120], ['b_name', 200], ['b_amount', 160]), base),
).toBe(true)
})
it('宽度不同 → 已调整', () => {
expect(
sameColumnSettings(current(['b_id', 120], ['b_name', 260], ['b_amount', 160]), base),
).toBe(false)
})
it('顺序不同 → 已调整(即使宽度全同)', () => {
expect(
sameColumnSettings(current(['b_name', 200], ['b_id', 120], ['b_amount', 160]), base),
).toBe(false)
})
it('数量不同 → 已调整', () => {
expect(sameColumnSettings(current(['b_id', 120]), base)).toBe(false)
})
it('当前宽度为 null 而通用有宽度 → 视为已调整', () => {
expect(
sameColumnSettings(current(['b_id', null], ['b_name', 200], ['b_amount', 160]), base),
).toBe(false)
})
it('两侧宽度都是 null/未设置时视为一致', () => {
const noWidth = [{ b_field: 'b_id', b_width: null }, { b_field: 'b_name' }]
expect(sameColumnSettings(current(['b_id', null], ['b_name', undefined]), noWidth)).toBe(true)
})
})
describe('栏位设置:schema 类型常量', () => {
it('个人层栏位用 view,与查询布局的 query 区分开', () => {
expect(PREF_SCHEMA_TYPES.view).toBe('view')
expect(PREF_SCHEMA_TYPES.query).toBe('query')
})
})