From a266d450e1963657ac9969f11dd466f13c49b8bf Mon Sep 17 00:00:00 2001 From: wangziqi Date: Sun, 12 Jul 2026 23:01:37 +0800 Subject: [PATCH] chore: apply eslint --fix autofixes (remove unnecessary as never casts in tests) --- .../attendance/attendance.controller.spec.ts | 20 +++++++++---------- apps/server/src/classes/classes.service.ts | 2 +- .../classroom-rentals.service.spec.ts | 6 +++--- .../src/dashboard/dashboard.scope.spec.ts | 2 +- .../src/database/database-migrations.spec.ts | 6 +++--- .../src/integration/dingtalk.service.spec.ts | 4 ++-- .../organizations.service.spec.ts | 2 +- .../schedules/schedules.controller.spec.ts | 12 +++++------ .../src/sync/schedule-sync.service.spec.ts | 10 +++++----- 9 files changed, 32 insertions(+), 32 deletions(-) diff --git a/apps/server/src/attendance/attendance.controller.spec.ts b/apps/server/src/attendance/attendance.controller.spec.ts index 8b71b5a..d0e14ed 100644 --- a/apps/server/src/attendance/attendance.controller.spec.ts +++ b/apps/server/src/attendance/attendance.controller.spec.ts @@ -213,7 +213,7 @@ describe('AttendanceController — write data scope', () => { ], }; - await controller.batchCreate(dto, req as never); + await controller.batchCreate(dto, req); expect(attendanceService.assertClassAccess).toHaveBeenCalledWith(21, 8, false); expect(attendanceService.assertClassAccess).toHaveBeenCalledWith(21, 9, false); @@ -232,7 +232,7 @@ describe('AttendanceController — write data scope', () => { ], }; - await expect(controller.batchCreate(dto, req as never)).rejects.toBeInstanceOf( + await expect(controller.batchCreate(dto, req)).rejects.toBeInstanceOf( ForbiddenException, ); expect(attendanceService.batchCreate).not.toHaveBeenCalled(); @@ -264,8 +264,8 @@ describe('AttendanceController — write data scope', () => { records: [], }); - await controller.pullLessonAttendance('4', { date: '2026-07-11' }, req as never); - await controller.completeLessonAttendance('90', req as never); + await controller.pullLessonAttendance('4', { date: '2026-07-11' }, req); + await controller.completeLessonAttendance('90', req); expect(attendanceService.assertClassAccess).toHaveBeenNthCalledWith(1, 21, 8, false); expect(attendanceService.assertClassAccess).toHaveBeenNthCalledWith(2, 21, 8, false); @@ -274,7 +274,7 @@ describe('AttendanceController — write data scope', () => { it('checks class access before generating attendance from schedules', async () => { attendanceService.generateFromSchedules.mockResolvedValue({ count: 0, records: [] }); - await controller.generateFromSchedules({ classId: 8 }, req as never); + await controller.generateFromSchedules({ classId: 8 }, req); expect(attendanceService.assertClassAccess).toHaveBeenCalledWith(21, 8, false); }); @@ -284,8 +284,8 @@ describe('AttendanceController — write data scope', () => { attendanceService.update.mockResolvedValue({ id: 4, classId: 8, status: 'late' }); attendanceService.remove.mockResolvedValue({ deleted: true }); - await controller.update('4', { status: 'late' }, req as never); - await controller.remove('4', req as never); + await controller.update('4', { status: 'late' }, req); + await controller.remove('4', req); expect(attendanceService.assertClassAccess).toHaveBeenCalledTimes(2); expect(attendanceService.assertClassAccess).toHaveBeenNthCalledWith(1, 21, 8, false); @@ -323,7 +323,7 @@ describe('AttendanceController — SSE progress scoping', () => { const received: Array<{ phase: string; userId?: number }> = []; const sub = controller.importProgressStream({ user: { id: 42, username: 'alice', permissions: ['attendance:view'], isSuperAdmin: false, roles: [] }, - } as never).subscribe({ + }).subscribe({ next: (e) => received.push(JSON.parse(e.data as string)), }); @@ -338,7 +338,7 @@ describe('AttendanceController — SSE progress scoping', () => { const received: Array<{ phase: string; userId?: number }> = []; const sub = controller.importProgressStream({ user: { id: 42, username: 'alice', permissions: ['attendance:view'], isSuperAdmin: false, roles: [] }, - } as never).subscribe({ + }).subscribe({ next: (e) => received.push(JSON.parse(e.data as string)), }); @@ -355,7 +355,7 @@ describe('AttendanceController — SSE progress scoping', () => { const received: Array<{ phase: string; userId?: number }> = []; const sub = controller.importProgressStream({ user: { id: 42, username: 'alice', permissions: ['attendance:view'], isSuperAdmin: false, roles: [] }, - } as never).subscribe({ + }).subscribe({ next: (e) => received.push(JSON.parse(e.data as string)), }); progressSubject.next({ phase: 'fetching' }); // no userId diff --git a/apps/server/src/classes/classes.service.ts b/apps/server/src/classes/classes.service.ts index eefd945..d61a45f 100644 --- a/apps/server/src/classes/classes.service.ts +++ b/apps/server/src/classes/classes.service.ts @@ -68,7 +68,7 @@ export class ClassesService { } async findAll(query: QueryClassDto, accessibleClassIds?: number[]) { - let where: Record = {}; + const where: Record = {}; if (query.status) where.status = query.status; if (query.classType) where.classType = query.classType; if (query.keyword) where.name = Like(`%${query.keyword}%`); diff --git a/apps/server/src/classroom-rentals/classroom-rentals.service.spec.ts b/apps/server/src/classroom-rentals/classroom-rentals.service.spec.ts index 88113e8..b3e4886 100644 --- a/apps/server/src/classroom-rentals/classroom-rentals.service.spec.ts +++ b/apps/server/src/classroom-rentals/classroom-rentals.service.spec.ts @@ -326,7 +326,7 @@ describe('ClassroomRentalsService — rental schedule sync', () => { ...existingRental, startDate: '2026-04-01', endDate: '2026-04-30', - } as ClassroomRental; + }; const existingSchedule = { id: 50, rentalId: 1, @@ -372,7 +372,7 @@ describe('ClassroomRentalsService — rental schedule sync', () => { status: 'active', lesseeOrganization: { id: 2, name: 'Organization A' } as Organization, } as ClassroomRental; - const cancelledRental = { ...rental, status: 'cancelled' } as ClassroomRental; + const cancelledRental = { ...rental, status: 'cancelled' }; rentalRepo.findOne.mockResolvedValueOnce(rental).mockResolvedValueOnce(cancelledRental); @@ -449,7 +449,7 @@ describe('ClassroomRentalsService — organization roles', () => { lesseeOrganizationId: 2, startDate: '2026-08-01', endDate: '2026-08-31', - } as any); + }); expect(rentalRepo.save).toHaveBeenCalledWith( expect.objectContaining({ diff --git a/apps/server/src/dashboard/dashboard.scope.spec.ts b/apps/server/src/dashboard/dashboard.scope.spec.ts index 7e2c6f8..28cc85b 100644 --- a/apps/server/src/dashboard/dashboard.scope.spec.ts +++ b/apps/server/src/dashboard/dashboard.scope.spec.ts @@ -32,7 +32,7 @@ describe('DashboardService — teacher class scope', () => { {} as never, {} as never, {} as never, - {} as never, + {}, ); await service.getClassAttendanceRanking([8, 9]); diff --git a/apps/server/src/database/database-migrations.spec.ts b/apps/server/src/database/database-migrations.spec.ts index 2011ec1..c0fee6e 100644 --- a/apps/server/src/database/database-migrations.spec.ts +++ b/apps/server/src/database/database-migrations.spec.ts @@ -167,7 +167,7 @@ describe('DatabaseMigrationsService — bootstrap failure handling', () => { { provide: getDataSourceToken(), useValue: dataSource }, ], }).compile(); - const service = module.get(DatabaseMigrationsService) as DatabaseMigrationsService & MigrationsPrivate; + const service = module.get(DatabaseMigrationsService); jest.spyOn(service, 'ensureAiConfigTable').mockRejectedValue(new Error('migration failed')); const backfill = jest.spyOn(service, 'backfillOrganizations').mockResolvedValue(); @@ -228,7 +228,7 @@ describe('DatabaseMigrationsService — protectAttendanceHistory', () => { { provide: getDataSourceToken(), useValue: dataSource }, ], }).compile(); - service = module.get(DatabaseMigrationsService) as DatabaseMigrationsService & MigrationsPrivate; + service = module.get(DatabaseMigrationsService); } it('skips when attendance_sessions table is absent', async () => { @@ -424,5 +424,5 @@ async function bootstrapCourseAttendance(runner: ReturnType) { provide: getDataSourceToken(), useValue: dataSource }, ], }).compile(); - service = module.get(DatabaseMigrationsService) as DatabaseMigrationsService & MigrationsPrivate; + service = module.get(DatabaseMigrationsService); } diff --git a/apps/server/src/integration/dingtalk.service.spec.ts b/apps/server/src/integration/dingtalk.service.spec.ts index d64f870..1e35980 100644 --- a/apps/server/src/integration/dingtalk.service.spec.ts +++ b/apps/server/src/integration/dingtalk.service.spec.ts @@ -14,7 +14,7 @@ describe('DingTalkService — queryShifts', () => { accessToken: 'test-token', tokenExpiresAt: Date.now() + 3_600_000, }); - jest.spyOn(service as never, 'rateLimit').mockResolvedValue(undefined); + jest.spyOn(service, 'rateLimit').mockResolvedValue(undefined); }); afterEach(() => { @@ -107,7 +107,7 @@ describe('DingTalkService — attendance machine only group', () => { accessToken: 'test-token', tokenExpiresAt: Date.now() + 3_600_000, }); - jest.spyOn(service as never, 'rateLimit').mockResolvedValue(undefined); + jest.spyOn(service, 'rateLimit').mockResolvedValue(undefined); }); afterEach(() => { diff --git a/apps/server/src/organizations/organizations.service.spec.ts b/apps/server/src/organizations/organizations.service.spec.ts index d0d3b1f..5588e8e 100644 --- a/apps/server/src/organizations/organizations.service.spec.ts +++ b/apps/server/src/organizations/organizations.service.spec.ts @@ -22,7 +22,7 @@ describe('OrganizationsService — host organization rules', () => { }); it('does not allow the host organization to be archived', async () => { - repo.findOne.mockResolvedValue({ id: 1, name: '本机构', isHost: true } as Organization); + repo.findOne.mockResolvedValue({ id: 1, name: '本机构', isHost: true }); await expect(service.remove(1)).rejects.toBeInstanceOf(BadRequestException); expect(repo.update).not.toHaveBeenCalled(); diff --git a/apps/server/src/schedules/schedules.controller.spec.ts b/apps/server/src/schedules/schedules.controller.spec.ts index ded3d43..369144d 100644 --- a/apps/server/src/schedules/schedules.controller.spec.ts +++ b/apps/server/src/schedules/schedules.controller.spec.ts @@ -61,7 +61,7 @@ describe('SchedulesController — class data scope', () => { it('checks the requested class before creating a schedule', async () => { service.create.mockResolvedValue({ id: 1, ...scheduleDto }); - await controller.create(scheduleDto, teacherRequest as never); + await controller.create(scheduleDto, teacherRequest); expect(service.assertClassAccess).toHaveBeenCalledWith(21, 8, false); expect(service.create).toHaveBeenCalledWith(scheduleDto); @@ -71,7 +71,7 @@ describe('SchedulesController — class data scope', () => { service.findOne.mockResolvedValue({ id: 4, ...scheduleDto }); service.update.mockResolvedValue({ id: 4, ...scheduleDto, classId: 9 }); - await controller.update('4', { classId: 9 }, teacherRequest as never); + await controller.update('4', { classId: 9 }, teacherRequest); expect(service.assertClassAccess).toHaveBeenNthCalledWith(1, 21, 8, false); expect(service.assertClassAccess).toHaveBeenNthCalledWith(2, 21, 9, false); @@ -80,7 +80,7 @@ describe('SchedulesController — class data scope', () => { it('checks the owning class before returning full schedule details', async () => { service.findOne.mockResolvedValue({ id: 4, ...scheduleDto }); - await controller.findOne('4', teacherRequest as never); + await controller.findOne('4', teacherRequest); expect(service.assertClassAccess).toHaveBeenCalledWith(21, 8, false); }); @@ -89,7 +89,7 @@ describe('SchedulesController — class data scope', () => { service.findOne.mockResolvedValue({ id: 4, ...scheduleDto }); service.remove.mockResolvedValue({ success: true }); - await controller.remove('4', teacherRequest as never); + await controller.remove('4', teacherRequest); expect(service.assertClassAccess).toHaveBeenCalledWith(21, 8, false); expect(service.remove).toHaveBeenCalledWith(4); @@ -100,7 +100,7 @@ describe('SchedulesController — class data scope', () => { { id: 2, classId: 99, subject: '英语', teacherId: 7, notes: '隐私', classroomId: 3 }, ]); - const result = await controller.getClassroomOccupancy('3', undefined, teacherRequest as never); + const result = await controller.getClassroomOccupancy('3', undefined, teacherRequest); expect(result).toEqual([ expect.objectContaining({ @@ -119,7 +119,7 @@ describe('SchedulesController — class data scope', () => { it('rejects records without a class instead of exposing full details to a scoped teacher', async () => { service.findOne.mockResolvedValue({ id: 4, ...scheduleDto, classId: null }); - await expect(controller.findOne('4', teacherRequest as never)).rejects.toBeInstanceOf( + await expect(controller.findOne('4', teacherRequest)).rejects.toBeInstanceOf( ForbiddenException, ); }); diff --git a/apps/server/src/sync/schedule-sync.service.spec.ts b/apps/server/src/sync/schedule-sync.service.spec.ts index 557f6e4..3e50164 100644 --- a/apps/server/src/sync/schedule-sync.service.spec.ts +++ b/apps/server/src/sync/schedule-sync.service.spec.ts @@ -199,7 +199,7 @@ describe('ScheduleSyncService — partial batch failure', () => { expect(scheduleUsers).toHaveBeenCalledTimes(2); expect(result.failedBatchCount).toBeGreaterThan(0); expect(result.errors).toBeDefined(); - expect(result.errors!.length).toBeGreaterThan(0); + expect(result.errors.length).toBeGreaterThan(0); // syncedItems should only count the successful batch expect(result.syncedItems).toBeGreaterThan(0); }); @@ -287,8 +287,8 @@ describe('ScheduleSyncService — attendance group failure', () => { expect(result.failedItems).toBeGreaterThan(0); // error message must contain the group failure detail expect(result.errors).toBeDefined(); - expect(result.errors!.some((e) => e.includes('考勤组'))).toBe(true); - expect(result.errors!.some((e) => e.includes('强化班'))).toBe(true); + expect(result.errors.some((e) => e.includes('考勤组'))).toBe(true); + expect(result.errors.some((e) => e.includes('强化班'))).toBe(true); // the successful class should still sync expect(result.syncedItems).toBeGreaterThan(0); expect(result.groupCount).toBe(1); @@ -455,8 +455,8 @@ describe('ScheduleSyncService — all shifts fail', () => { expect(result.failedItems).toBeGreaterThan(0); // Errors must contain shift failure messages expect(result.errors).toBeDefined(); - expect(result.errors!.length).toBeGreaterThan(0); - expect(result.errors!.some((e) => e.includes('班次'))).toBe(true); + expect(result.errors.length).toBeGreaterThan(0); + expect(result.errors.some((e) => e.includes('班次'))).toBe(true); // No scheduleUsers calls (no group created) expect(dingTalkService.scheduleUsers).not.toHaveBeenCalled(); });