import { DepositsService } from './deposits.service'; import { Deposit } from '../entities/deposit.entity'; describe('DepositsService — direct refund', () => { it('deducts unbilled personal expenses before refunding the remaining balance', async () => { const deposit = { id: 1, studentId: 10, amount: 500, status: 'paid', } as Deposit; const repo = { findOne: jest.fn().mockResolvedValue(deposit), save: jest.fn().mockImplementation(async (value: Deposit) => value), }; const personalExpenseRepo = { createQueryBuilder: jest.fn().mockReturnValue({ select: jest.fn().mockReturnThis(), addSelect: jest.fn().mockReturnThis(), where: jest.fn().mockReturnThis(), andWhere: jest.fn().mockReturnThis(), groupBy: jest.fn().mockReturnThis(), getRawMany: jest.fn().mockResolvedValue([{ studentId: 10, amount: '120' }]), }), }; const service = new DepositsService(repo as never, {} as never, {} as never, personalExpenseRepo as never); const result = await service.refund( 1, { refundDate: '2026-07-13', notes: '退还剩余押金' }, 42, ); expect(result).toMatchObject({ refundDate: '2026-07-13', amount: 0, refundAmount: 380, deductionAmount: 120, deductionReason: '自动扣除个人附加费用 ¥120.00', notes: '退还剩余押金', status: 'refunded', refundedBy: 42, }); expect(result.refundedAt).toBeInstanceOf(Date); expect(repo.save).toHaveBeenCalledWith(deposit); }); });