gongxiangp2/lib/__tests__/salary-position-export.test.ts

30 lines
1.7 KiB
TypeScript

import ExcelJS from 'exceljs'
import JSZip from 'jszip'
import { INITIAL_SALARY_POSITIONS } from '../salary-position-seeds'
import { buildPositionWorkbook } from '../salary-position-export'
import { buildSalaryTemplateWorkbook } from '../performance-salary-export'
test('重读岗位配置与薪资空模板:权重来源完整,不含人员、公式或外链', async () => {
const positions = INITIAL_SALARY_POSITIONS.map(seed => ({ ...seed.value, id: seed.id, revision: 1, personnelCount: 7, updatedAt: '2026-10-28' }))
const book = await buildPositionWorkbook(positions, [{ code: 'visual_brand_tone', name: '视觉调研' }])
const bytes = await book.xlsx.writeBuffer(), reloaded = new ExcelJS.Workbook()
await reloaded.xlsx.load(bytes)
expect(reloaded.worksheets.map(s => s.name)).toEqual(positions.map(p => p.name))
const text: string[] = []
reloaded.eachSheet(sheet => {
expect(sheet.state).toBe('visible')
expect(sheet.views[0]).toMatchObject({ state: 'frozen', xSplit: 1, ySplit: 3 })
sheet.eachRow(row => row.eachCell(cell => { text.push(String(cell.value)); expect(cell.type).not.toBe(ExcelJS.ValueType.Formula) }))
})
expect(text).toContain('视觉调研')
expect(text).toContain('项目维护')
expect(text).toContain('0')
const zip = await JSZip.loadAsync(bytes)
expect(Object.keys(zip.files).some(name => /externalLinks|hidden/i.test(name))).toBe(false)
const template = await buildSalaryTemplateWorkbook('2026-10', positions)
expect(template.worksheets).toHaveLength(5)
for (const sheet of template.worksheets) {
for (let row = sheet.rowCount - 4; row <= sheet.rowCount; row++) sheet.getRow(row).eachCell({ includeEmpty: true }, cell => expect(cell.value).toBeNull())
}
})