forked from wangziqi/gongxue-base
48 lines
1.6 KiB
TypeScript
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);
|
|
});
|
|
});
|