63 lines
2.6 KiB
TypeScript
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();
|
|
});
|
|
});
|