more backend unit test coverage
This commit is contained in:
142
backend/tests/unit/utils/feeCalculator.test.js
Normal file
142
backend/tests/unit/utils/feeCalculator.test.js
Normal file
@@ -0,0 +1,142 @@
|
||||
const FeeCalculator = require('../../../utils/feeCalculator');
|
||||
|
||||
describe('FeeCalculator', () => {
|
||||
describe('calculateRentalFees', () => {
|
||||
it('should calculate fees correctly for whole dollar amounts', () => {
|
||||
const result = FeeCalculator.calculateRentalFees(100);
|
||||
|
||||
expect(result.totalAmount).toBe(100);
|
||||
expect(result.platformFee).toBe(10); // 10% platform fee
|
||||
expect(result.totalChargedAmount).toBe(100);
|
||||
expect(result.payoutAmount).toBe(90); // 100 - 10
|
||||
});
|
||||
|
||||
it('should calculate fees correctly for decimal amounts', () => {
|
||||
const result = FeeCalculator.calculateRentalFees(99.99);
|
||||
|
||||
expect(result.totalAmount).toBe(99.99);
|
||||
expect(result.platformFee).toBe(10); // 10% of 99.99, rounded to 2 decimals
|
||||
expect(result.totalChargedAmount).toBe(99.99);
|
||||
expect(result.payoutAmount).toBe(89.99);
|
||||
});
|
||||
|
||||
it('should handle small amounts', () => {
|
||||
const result = FeeCalculator.calculateRentalFees(1);
|
||||
|
||||
expect(result.totalAmount).toBe(1);
|
||||
expect(result.platformFee).toBe(0.1);
|
||||
expect(result.payoutAmount).toBe(0.9);
|
||||
});
|
||||
|
||||
it('should handle large amounts', () => {
|
||||
const result = FeeCalculator.calculateRentalFees(10000);
|
||||
|
||||
expect(result.totalAmount).toBe(10000);
|
||||
expect(result.platformFee).toBe(1000);
|
||||
expect(result.payoutAmount).toBe(9000);
|
||||
});
|
||||
|
||||
it('should round to 2 decimal places', () => {
|
||||
const result = FeeCalculator.calculateRentalFees(33.33);
|
||||
|
||||
expect(result.totalAmount).toBe(33.33);
|
||||
expect(result.platformFee).toBe(3.33); // 10% of 33.33
|
||||
expect(result.payoutAmount).toBe(30); // 33.33 - 3.33
|
||||
});
|
||||
|
||||
it('should handle zero amount', () => {
|
||||
const result = FeeCalculator.calculateRentalFees(0);
|
||||
|
||||
expect(result.totalAmount).toBe(0);
|
||||
expect(result.platformFee).toBe(0);
|
||||
expect(result.totalChargedAmount).toBe(0);
|
||||
expect(result.payoutAmount).toBe(0);
|
||||
});
|
||||
|
||||
it('should calculate correct fee for amounts requiring rounding', () => {
|
||||
const result = FeeCalculator.calculateRentalFees(123.456);
|
||||
|
||||
expect(result.totalAmount).toBe(123.46); // Rounded
|
||||
expect(result.platformFee).toBe(12.35); // 10% rounded
|
||||
expect(result.payoutAmount).toBe(111.11);
|
||||
});
|
||||
});
|
||||
|
||||
describe('formatFeesForDisplay', () => {
|
||||
it('should format fees as currency strings', () => {
|
||||
const fees = {
|
||||
totalAmount: 100,
|
||||
platformFee: 10,
|
||||
totalChargedAmount: 100,
|
||||
payoutAmount: 90,
|
||||
};
|
||||
|
||||
const result = FeeCalculator.formatFeesForDisplay(fees);
|
||||
|
||||
expect(result.totalAmount).toBe('$100.00');
|
||||
expect(result.platformFee).toBe('$10.00 (10%)');
|
||||
expect(result.totalCharge).toBe('$100.00');
|
||||
expect(result.ownerPayout).toBe('$90.00');
|
||||
});
|
||||
|
||||
it('should format decimal amounts correctly', () => {
|
||||
const fees = {
|
||||
totalAmount: 99.99,
|
||||
platformFee: 10,
|
||||
totalChargedAmount: 99.99,
|
||||
payoutAmount: 89.99,
|
||||
};
|
||||
|
||||
const result = FeeCalculator.formatFeesForDisplay(fees);
|
||||
|
||||
expect(result.totalAmount).toBe('$99.99');
|
||||
expect(result.platformFee).toBe('$10.00 (10%)');
|
||||
expect(result.totalCharge).toBe('$99.99');
|
||||
expect(result.ownerPayout).toBe('$89.99');
|
||||
});
|
||||
|
||||
it('should handle zero values', () => {
|
||||
const fees = {
|
||||
totalAmount: 0,
|
||||
platformFee: 0,
|
||||
totalChargedAmount: 0,
|
||||
payoutAmount: 0,
|
||||
};
|
||||
|
||||
const result = FeeCalculator.formatFeesForDisplay(fees);
|
||||
|
||||
expect(result.totalAmount).toBe('$0.00');
|
||||
expect(result.platformFee).toBe('$0.00 (10%)');
|
||||
expect(result.totalCharge).toBe('$0.00');
|
||||
expect(result.ownerPayout).toBe('$0.00');
|
||||
});
|
||||
|
||||
it('should handle large values', () => {
|
||||
const fees = {
|
||||
totalAmount: 10000,
|
||||
platformFee: 1000,
|
||||
totalChargedAmount: 10000,
|
||||
payoutAmount: 9000,
|
||||
};
|
||||
|
||||
const result = FeeCalculator.formatFeesForDisplay(fees);
|
||||
|
||||
expect(result.totalAmount).toBe('$10000.00');
|
||||
expect(result.platformFee).toBe('$1000.00 (10%)');
|
||||
expect(result.totalCharge).toBe('$10000.00');
|
||||
expect(result.ownerPayout).toBe('$9000.00');
|
||||
});
|
||||
});
|
||||
|
||||
describe('Integration: calculateRentalFees + formatFeesForDisplay', () => {
|
||||
it('should work together correctly', () => {
|
||||
const fees = FeeCalculator.calculateRentalFees(250);
|
||||
const formatted = FeeCalculator.formatFeesForDisplay(fees);
|
||||
|
||||
expect(formatted.totalAmount).toBe('$250.00');
|
||||
expect(formatted.platformFee).toBe('$25.00 (10%)');
|
||||
expect(formatted.totalCharge).toBe('$250.00');
|
||||
expect(formatted.ownerPayout).toBe('$225.00');
|
||||
});
|
||||
});
|
||||
});
|
||||
Reference in New Issue
Block a user