import { describe, expect, it } from 'vitest';
|
|
import { applyMergedBatchPrintLayout, getMergedBatchPrintTableStyle, mergePrintDataSet } from './printData';
|
|
describe('mergePrintDataSet', () => {
|
it('merges the selected data set and keeps the first record metadata', () => {
|
const result = mergePrintDataSet(
|
[
|
{ orderList: [{ id: '1', name: '记录1' }], systemInfo: { printer: '管理员' }, title: '批量清单' },
|
{ orderList: [{ id: '2', name: '记录2' }], systemInfo: { printer: '管理员' }, title: '忽略的标题' },
|
],
|
'orderList',
|
);
|
|
expect(result).toEqual([
|
{
|
orderList: [
|
{ id: '1', name: '记录1' },
|
{ id: '2', name: '记录2' },
|
],
|
systemInfo: { printer: '管理员' },
|
title: '批量清单',
|
},
|
]);
|
});
|
|
it('ignores missing, non-array and invalid data set values', () => {
|
const result = mergePrintDataSet([{ orderList: [{ id: '1' }] }, null, {}, { orderList: 'invalid' }], 'orderList');
|
|
expect(result).toEqual([{ orderList: [{ id: '1' }] }]);
|
});
|
|
it('keeps the original print records when no data set is specified', () => {
|
const printDataList = [{ id: '1' }, null, { id: '2' }];
|
|
expect(mergePrintDataSet(printDataList, '')).toEqual(printDataList);
|
});
|
|
it('does not throw when a custom script passes an invalid data set name', () => {
|
const printDataList = [{ id: '1' }];
|
|
expect(mergePrintDataSet(printDataList, null as unknown as string)).toEqual(printDataList);
|
});
|
});
|
|
describe('applyMergedBatchPrintLayout', () => {
|
it('reserves top spacing for table continuation pages', () => {
|
const template = { panels: [{ paperHeader: 0 }, { paperHeader: 20 }] };
|
|
expect(applyMergedBatchPrintLayout(template, { mergeDataSet: 'orderList' })).toEqual({
|
panels: [{ paperHeader: 15 }, { paperHeader: 20 }],
|
});
|
});
|
|
it('supports a custom continuation page top spacing', () => {
|
const template = { panels: [{ paperHeader: 0 }] };
|
|
expect(applyMergedBatchPrintLayout(template, { mergeDataSet: 'orderList', pageTopSpacing: 24 })).toEqual({
|
panels: [{ paperHeader: 24 }],
|
});
|
});
|
|
it('reserves the footer area on every page while preserving larger existing margins', () => {
|
const template: any = {
|
panels: [
|
{
|
height: 297,
|
paperHeader: 30,
|
paperFooter: 840,
|
firstPaperFooter: 820,
|
evenPaperFooter: 835,
|
oddPaperFooter: 810,
|
lastPaperFooter: 800,
|
},
|
],
|
};
|
|
applyMergedBatchPrintLayout(template, { mergeDataSet: 'orderList' });
|
|
const panel = template.panels[0];
|
expect(panel.paperHeader).toBe(30);
|
expect(panel.paperFooter).toBeCloseTo(297 * (72 / 25.4) - 15);
|
expect(panel.firstPaperFooter).toBe(820);
|
expect(panel.evenPaperFooter).toBeCloseTo(297 * (72 / 25.4) - 15);
|
expect(panel.oddPaperFooter).toBe(810);
|
expect(panel.lastPaperFooter).toBe(800);
|
expect(panel.paperFooter - panel.paperHeader).toBeCloseTo(297 * (72 / 25.4) - 45);
|
});
|
|
it('supports custom bottom spacing when the template has no footer line', () => {
|
const template: any = { panels: [{ height: 297, paperHeader: 0 }] };
|
|
applyMergedBatchPrintLayout(template, { mergeDataSet: 'orderList', pageBottomSpacing: 24 });
|
|
expect(template.panels[0].height).toBe(297);
|
expect(template.panels[0].paperHeader).toBe(15);
|
expect(template.panels[0].paperFooter).toBeCloseTo(297 * (72 / 25.4) - 24);
|
});
|
|
it('does not change regular print templates', () => {
|
const template = { panels: [{ paperHeader: 0 }] };
|
|
expect(applyMergedBatchPrintLayout(template, {})).toEqual({ panels: [{ paperHeader: 0 }] });
|
});
|
});
|
|
describe('getMergedBatchPrintTableStyle', () => {
|
it('creates scoped wrapping and automatic row height styles', () => {
|
const style = getMergedBatchPrintTableStyle('body.merged-print');
|
|
expect(style).toContain('body.merged-print .hiprint-printElement-tableTarget thead td');
|
expect(style).toContain('body.merged-print .hiprint-printElement-tableTarget tbody td');
|
expect(style).toContain('table-layout: fixed !important');
|
expect(style).toContain('height: auto !important');
|
expect(style).toContain('overflow-wrap: anywhere !important');
|
expect(style).toContain('white-space: normal !important');
|
});
|
});
|