Files
rentall-app/backend/tests/unit/utils/feeCalculator.test.js
2026-01-18 19:18:35 -05:00

143 lines
4.6 KiB
JavaScript

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