Files
playzer/apps/backend/test/plan/plan-pricing.service.test.ts
Jose Selesan 1318e3bf57 feat: add recurring bookings feature with related handlers and services
- Introduced recurring booking groups with the ability to create and cancel them.
- Added database migrations for recurring bookings, including new tables and relationships.
- Implemented handlers for creating and canceling recurring bookings in the admin booking module.
- Enhanced existing booking services to support recurring bookings logic.
- Updated API contract to include new schemas for recurring bookings.
- Refactored existing code for improved readability and maintainability.
2026-06-16 11:58:06 -03:00

90 lines
3.0 KiB
TypeScript

import { expect, test } from 'bun:test';
import type { PlanRules } from '@repo/api-contract';
const DEFAULT_PRICE = 29.99;
function makeV1Rules(): PlanRules {
return {
version: 'v1',
limits: { maxCourts: 3, maxBookingsPerDay: 50 },
policies: { allowOverbooking: false },
features: {
onlinePayments: false,
publicBookingPage: false,
advancedReports: false,
whatsappReminders: false,
fixedSlots: false,
},
};
}
function makeV2Rules(overrides?: Record<string, { amount: number; currency: string }>): PlanRules {
return {
version: 'v2',
limits: { maxCourts: 5, maxBookingsPerDay: 100 },
policies: { allowOverbooking: false },
features: {
onlinePayments: true,
publicBookingPage: true,
advancedReports: true,
whatsappReminders: true,
fixedSlots: true,
},
...(overrides ? { pricing: { overrides } } : {}),
};
}
const { resolvePlanPrice } = await import('@/modules/plan/services/plan-pricing.service');
test('returns default price in USD when no country code is provided', () => {
const result = resolvePlanPrice(
DEFAULT_PRICE,
makeV2Rules({ AR: { amount: 14999, currency: 'ARS' } })
);
expect(result).toEqual({ amount: DEFAULT_PRICE, currency: 'USD' });
});
test('returns overridden price for matching country code', () => {
const rules = makeV2Rules({ AR: { amount: 14999, currency: 'ARS' } });
const result = resolvePlanPrice(DEFAULT_PRICE, rules, 'AR');
expect(result).toEqual({ amount: 14999, currency: 'ARS' });
});
test('returns default price for country without override', () => {
const rules = makeV2Rules({ AR: { amount: 14999, currency: 'ARS' } });
const result = resolvePlanPrice(DEFAULT_PRICE, rules, 'CL');
expect(result).toEqual({ amount: DEFAULT_PRICE, currency: 'USD' });
});
test('returns default price for v1 rules (no pricing config)', () => {
const result = resolvePlanPrice(DEFAULT_PRICE, makeV1Rules(), 'AR');
expect(result).toEqual({ amount: DEFAULT_PRICE, currency: 'USD' });
});
test('returns default price for v2 rules with empty overrides', () => {
const rules = makeV2Rules({});
const result = resolvePlanPrice(DEFAULT_PRICE, rules, 'AR');
expect(result).toEqual({ amount: DEFAULT_PRICE, currency: 'USD' });
});
test('returns default price when v2 rules has no pricing section', () => {
const rules = makeV2Rules();
const result = resolvePlanPrice(DEFAULT_PRICE, rules, 'AR');
expect(result).toEqual({ amount: DEFAULT_PRICE, currency: 'USD' });
});
test('selects correct override among multiple countries', () => {
const rules = makeV2Rules({
AR: { amount: 24999, currency: 'ARS' },
BR: { amount: 59.99, currency: 'USD' },
});
expect(resolvePlanPrice(DEFAULT_PRICE, rules, 'AR')).toEqual({ amount: 24999, currency: 'ARS' });
expect(resolvePlanPrice(DEFAULT_PRICE, rules, 'BR')).toEqual({ amount: 59.99, currency: 'USD' });
expect(resolvePlanPrice(DEFAULT_PRICE, rules, 'US')).toEqual({
amount: DEFAULT_PRICE,
currency: 'USD',
});
});