Files
gongxue-base/apps/server/src/deposits/deposits.refund.spec.ts

48 lines
1.6 KiB
TypeScript

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);
});
});