65 lines
1.9 KiB
TypeScript
65 lines
1.9 KiB
TypeScript
import { describe, expect, it } from 'vitest';
|
|
import type { TenantPackageSummary } from '../../api';
|
|
import { buildPackageUsageMetrics, usagePercent } from '../billingUsage';
|
|
|
|
const basePackage: TenantPackageSummary = {
|
|
id: 1,
|
|
package_id: 1,
|
|
package_name: 'Pro',
|
|
active: true,
|
|
used_events: 2,
|
|
remaining_events: 3,
|
|
price: 120,
|
|
currency: 'EUR',
|
|
purchased_at: null,
|
|
expires_at: null,
|
|
package_limits: {
|
|
max_events_per_year: 5,
|
|
max_guests: 150,
|
|
max_photos: 1000,
|
|
},
|
|
branding_allowed: true,
|
|
watermark_allowed: true,
|
|
features: null,
|
|
};
|
|
|
|
describe('buildPackageUsageMetrics', () => {
|
|
it('builds usage metrics for event, guest, and photo limits', () => {
|
|
const metrics = buildPackageUsageMetrics(basePackage);
|
|
const keys = metrics.map((metric) => metric.key);
|
|
expect(keys).toEqual(['events', 'guests', 'photos']);
|
|
|
|
const eventMetric = metrics.find((metric) => metric.key === 'events');
|
|
expect(eventMetric?.used).toBe(2);
|
|
expect(eventMetric?.limit).toBe(5);
|
|
expect(eventMetric?.remaining).toBe(3);
|
|
});
|
|
|
|
it('filters metrics without limits', () => {
|
|
const metrics = buildPackageUsageMetrics({
|
|
...basePackage,
|
|
package_limits: { max_events_per_year: 0 },
|
|
});
|
|
expect(metrics).toHaveLength(0);
|
|
});
|
|
});
|
|
|
|
describe('usagePercent', () => {
|
|
it('calculates usage percent when usage is known', () => {
|
|
const metrics = buildPackageUsageMetrics(basePackage);
|
|
const eventMetric = metrics.find((metric) => metric.key === 'events');
|
|
expect(eventMetric).toBeTruthy();
|
|
expect(usagePercent(eventMetric!)).toBe(40);
|
|
});
|
|
|
|
it('defaults to full bar when usage is unknown', () => {
|
|
const metrics = buildPackageUsageMetrics({
|
|
...basePackage,
|
|
used_events: NaN,
|
|
remaining_events: null,
|
|
package_limits: { max_events_per_year: 10 },
|
|
});
|
|
expect(usagePercent(metrics[0])).toBe(100);
|
|
});
|
|
});
|