74 lines
2.5 KiB
TypeScript
74 lines
2.5 KiB
TypeScript
import { expect, test } from '@playwright/test'
|
|
import {
|
|
formatBillingPrice,
|
|
formatPlanCatalogPrice,
|
|
parseBillingCatalog,
|
|
} from '../src/lib/billing-catalog'
|
|
|
|
const catalogPayload = {
|
|
schema_version: '1',
|
|
plans: [
|
|
{
|
|
tier: 'pro',
|
|
prices: [
|
|
{ provider: 'payple', unit_amount: 9900, currency: 'KRW', interval: 'month', interval_count: 1 },
|
|
{ provider: 'stripe', unit_amount: 999, currency: 'USD', interval: 'month', interval_count: 1 },
|
|
],
|
|
},
|
|
{
|
|
tier: 'pro_plus',
|
|
prices: [
|
|
{ provider: 'payple', unit_amount: 29900, currency: 'KRW', interval: 'month', interval_count: 1 },
|
|
],
|
|
},
|
|
],
|
|
}
|
|
|
|
test.describe('billing catalog strict client contract', () => {
|
|
test('parses provider prices and formats minor currency units', () => {
|
|
const catalog = parseBillingCatalog(catalogPayload)
|
|
expect(catalog).not.toBeNull()
|
|
expect(formatBillingPrice(catalog!.plans.pro[0])).toContain('9,900')
|
|
expect(formatBillingPrice(catalog!.plans.pro[1])).toContain('9.99')
|
|
expect(formatPlanCatalogPrice('pro', catalog)).toContain('Payple')
|
|
expect(formatPlanCatalogPrice('pro', catalog)).toContain('Stripe')
|
|
expect(formatPlanCatalogPrice('free', catalog)).toBe('무료')
|
|
})
|
|
|
|
test('rejects duplicate tiers/providers, malformed amounts, and unknown values', () => {
|
|
const invalid = [
|
|
null,
|
|
{},
|
|
{ ...catalogPayload, schema_version: '2' },
|
|
{ ...catalogPayload, plans: [catalogPayload.plans[0], catalogPayload.plans[0]] },
|
|
{
|
|
...catalogPayload,
|
|
plans: [{
|
|
tier: 'pro',
|
|
prices: [catalogPayload.plans[0].prices[0], catalogPayload.plans[0].prices[0]],
|
|
}, catalogPayload.plans[1]],
|
|
},
|
|
{
|
|
...catalogPayload,
|
|
plans: [{ tier: 'pro', prices: [{ ...catalogPayload.plans[0].prices[0], unit_amount: 0 }] }, catalogPayload.plans[1]],
|
|
},
|
|
{
|
|
...catalogPayload,
|
|
plans: [{ tier: 'pro', prices: [{ ...catalogPayload.plans[0].prices[0], currency: 'KRW<script>' }] }, catalogPayload.plans[1]],
|
|
},
|
|
]
|
|
for (const value of invalid) expect(parseBillingCatalog(value)).toBeNull()
|
|
})
|
|
|
|
test('keeps an unavailable provider absent instead of inventing a price', () => {
|
|
const catalog = parseBillingCatalog({
|
|
schema_version: '1',
|
|
plans: [
|
|
{ tier: 'pro', prices: [] },
|
|
{ tier: 'pro_plus', prices: [] },
|
|
],
|
|
})
|
|
expect(catalog).not.toBeNull()
|
|
expect(formatPlanCatalogPrice('pro', catalog)).toBeNull()
|
|
})
|
|
})
|