Files
ReceiptGenerator/tests/receipt-groups.test.ts

27 lines
2.0 KiB
TypeScript

import {it,expect} from 'vitest'
import {importGroupTree,printPreviewRows,summarizeReceiptGroups} from '../src/shared/receipt-groups'
import type {ImportRow} from '../src/shared/types'
function row(index:number,school='甲学校',errors:string[]=[]):ImportRow{
return {index,excelRow:index+2,errors,warnings:[],receipt:{date:'2026-10-19',school,grade:'高一',studentName:'学生'+index,customer:school+' 高一 学生'+index,item:'服务费',amountCents:(index+1)*100,cashier:'',reviewer:''}}
}
it('非连续行合并为同组,分组金额与勾选同步,错误行始终不计入可生成数据',()=>{
const rows=[row(0),row(1,'乙学校'),row(2),row(3,'甲学校',['日期无效'])],before=JSON.stringify(rows)
const [schoolA,schoolB]=importGroupTree(rows,new Set([2,3]))
expect(schoolA).toMatchObject({label:'甲学校',indices:[0,2],selectedCount:1,totalCents:400,selectedCents:300,invalidCount:1})
expect(schoolA.children[0].children[0]).toMatchObject({label:'服务费',indices:[0,2],selectedCount:1,invalidCount:1})
expect(schoolB).toMatchObject({label:'乙学校',indices:[1],selectedCount:0,totalCents:200,selectedCents:0})
expect(JSON.stringify(rows)).toBe(before)
expect(summarizeReceiptGroups(rows.filter(row=>!row.errors.length).map(row=>row.receipt))).toEqual([
{school:'甲学校',grade:'高一',item:'服务费',count:2,totalCents:400},
{school:'乙学校',grade:'高一',item:'服务费',count:1,totalCents:200}
])
})
it('A4 预览只显示所选同组收据,定位到所在页,最后一页不会混入其他学校',()=>{
const rows=[row(0),row(1,'乙学校'),row(2),row(3,'甲学校',['金额无效']),row(4)]
expect(printPreviewRows(rows,new Set([0,1,2,3,4]),2,2).map(row=>row.index)).toEqual([0,2])
expect(printPreviewRows(rows,new Set([0,1,2,4]),4,2).map(row=>row.index)).toEqual([4])
expect(printPreviewRows(rows,new Set([1,2,4]),2,2).map(row=>row.index)).toEqual([2,4])
expect(printPreviewRows(rows,new Set([1,2,4]),4,1).map(row=>row.index)).toEqual([4])
expect(printPreviewRows(rows,new Set(),0,2)).toEqual([])
})