zappier-edge/tests/db-pricing.test.ts

63 lines
2.6 KiB
TypeScript

import Database from 'better-sqlite3';
import { SqlitePricingStore } from '../src/db/pricing-store';
describe('SqlitePricingStore', () => {
it('seeds the default rate card and tiers when empty', () => {
const store = new SqlitePricingStore(new Database(':memory:'));
expect(store.getRateCard().endpoints.transform).toEqual({ kind: 'fixed', fixedCents: 4 });
expect(store.getTiers().map((t) => t.id)).toEqual(['free', 'pro', 'business']);
});
it('seeds only once', () => {
const db = new Database(':memory:');
const first = new SqlitePricingStore(db);
first.deleteEndpoint('transform');
const second = new SqlitePricingStore(db);
expect(second.getRateCard().endpoints.transform).toBeUndefined();
});
it('reseeds endpoints without reverting admin tier edits', () => {
const db = new Database(':memory:');
const first = new SqlitePricingStore(db);
for (const id of Object.keys(first.getRateCard().endpoints)) {
first.deleteEndpoint(id);
}
first.upsertTier({ id: 'pro', name: 'Pro', multiplier: 0.9, monthlyCreditCents: 1000 });
const second = new SqlitePricingStore(db);
expect(second.getRateCard().endpoints.transform).toBeDefined();
expect(second.getTiers().find((t) => t.id === 'pro')?.multiplier).toBe(0.9);
});
it('upserts and deletes endpoints', () => {
const store = new SqlitePricingStore(new Database(':memory:'));
store.upsertEndpoint('experimental', { kind: 'variable', baseCents: 3, perKbCents: 2, perMbCents: 20 });
expect(store.getRateCard().endpoints.experimental).toEqual({
kind: 'variable',
baseCents: 3,
perKbCents: 2,
perMbCents: 20,
});
store.deleteEndpoint('experimental');
expect(store.getRateCard().endpoints.experimental).toBeUndefined();
});
it('upserts tiers including default rules, and deletes them', () => {
const store = new SqlitePricingStore(new Database(':memory:'));
store.upsertTier({
id: 'edu',
name: 'Education',
multiplier: 0.4,
monthlyCreditCents: 500,
defaultRule: { kind: 'fixed', fixedCents: 6 },
});
expect(store.getTiers().find((t) => t.id === 'edu')?.defaultRule).toEqual({
kind: 'fixed',
fixedCents: 6,
});
store.upsertTier({ id: 'edu', name: 'Education', multiplier: 0.3, monthlyCreditCents: 500 });
expect(store.getTiers().filter((t) => t.id === 'edu')).toHaveLength(1);
expect(store.getTiers().find((t) => t.id === 'edu')?.multiplier).toBe(0.3);
store.deleteTier('edu');
expect(store.getTiers().find((t) => t.id === 'edu')).toBeUndefined();
});
});