Files
gongxue-base/apps/server/src/archive/archive-report.service.spec.ts

121 lines
4.1 KiB
TypeScript

import { ArchiveReportService } from './archive-report.service';
interface MockData {
student?: Record<string, unknown>;
profile?: Record<string, unknown> | null;
enrollments?: Array<Record<string, unknown>>;
exams?: Array<Record<string, unknown>>;
learnings?: Array<Record<string, unknown>>;
result?: Record<string, unknown> | null;
attendances?: Array<Record<string, unknown>>;
}
function makeService(data: MockData = {}): ArchiveReportService {
return new ArchiveReportService(
{ findOne: jest.fn().mockResolvedValue(data.profile ?? null) } as never,
{ find: jest.fn().mockResolvedValue(data.enrollments ?? []) } as never,
{ find: jest.fn().mockResolvedValue(data.exams ?? []) } as never,
{ find: jest.fn().mockResolvedValue(data.learnings ?? []) } as never,
{ findOne: jest.fn().mockResolvedValue(data.result ?? null) } as never,
{ find: jest.fn().mockResolvedValue(data.attendances ?? []) } as never,
{
findOne: jest.fn().mockResolvedValue(
data.student ?? { id: 1, name: '测试学生', studentNo: 'S001' },
),
} as never,
);
}
describe('ArchiveReportService retired profile fields', () => {
it('does not render the retired campus field in a student report', async () => {
const service = makeService({
profile: { campusLocation: '旧校区', grade: '高三' },
student: {
id: 1,
name: '测试学生',
gender: '男',
phone: '',
ethnicity: '',
emergencyContact: '',
emergencyPhone: '',
},
});
const html = await service.generateReportHtml(1);
expect(html).not.toContain('旧校区');
expect(html).not.toContain('<span>校区</span>');
expect(html).toContain('高三');
});
});
describe('ArchiveReportService empty sections', () => {
it('hides empty sections and removes fixed TOC page numbers', async () => {
const service = makeService({ profile: { grade: '高三' } });
const html = await service.generateReportHtml(1);
expect(html).toContain('学生档案报告');
expect(html).toContain('基础信息');
expect(html).not.toContain('考试成绩总览');
expect(html).not.toContain('出勤记录');
expect(html).not.toContain('文化课考试成绩');
expect(html).not.toContain('学情记录');
expect(html).not.toContain('录取归档');
expect(html).not.toContain('第 2 页');
expect(html).not.toContain('暂无');
});
it('renders sections with data and lists only those sections in the TOC', async () => {
const service = makeService({
profile: { grade: '高三' },
enrollments: [{ courseCategory: '文化课', classType: '全日制' }],
exams: [
{
examType: '文化课月考',
examName: '一月月考',
subject: '数学',
score: 88,
examDate: '2026-01-10',
},
],
attendances: [
{ attendanceDate: '2026-01-12', session: '上午', status: 'present' },
],
learnings: [
{
recordDate: '2026-01-13',
recordType: '回访',
content: '状态良好',
followUpMethod: '电话',
},
],
result: {
cultureFinalScore: 90,
professionalFinalScore: 85,
admissionStatus: '录取',
admittedCollege: '示例大学',
admittedMajor: '计算机',
},
});
const html = await service.generateReportHtml(1);
expect(html).toContain('考试成绩总览');
expect(html).toContain('出勤记录');
expect(html).toContain('文化课考试成绩');
expect(html).toContain('学情记录');
expect(html).toContain('录取归档');
expect(html).toContain('<h3>报读记录</h3>');
expect(html).not.toContain('第 1 页');
expect(html).not.toContain('第 2 页');
});
it('omits the enrollment card when there are no enrollments', async () => {
const service = makeService({ profile: { grade: '高三' } });
const html = await service.generateReportHtml(1);
expect(html).not.toContain('<h3>报读记录</h3>');
expect(html).not.toContain('暂无报读记录');
});
});