Files
cfw-autumn/server/tests/integration/billing/utils/expectCustomerFeatureCorrect.ts
2026-02-17 12:48:11 +00:00

82 lines
1.9 KiB
TypeScript

import { expect } from "bun:test";
import {
type ApiCustomerV3,
type ApiEntityV0,
ApiVersion,
formatMs,
} from "@autumn/shared";
import { AutumnInt } from "@/external/autumn/autumnCli";
const defaultAutumn = new AutumnInt({ version: ApiVersion.V1_2 });
export const expectCustomerFeatureExists = async ({
customerId,
customer: providedCustomer,
featureId,
}: {
customerId?: string;
customer?: ApiCustomerV3 | ApiEntityV0;
featureId: string;
}) => {
const customer = providedCustomer
? providedCustomer
: await defaultAutumn.customers.get(customerId!);
const feature = customer.features?.[featureId];
expect(feature).toBeDefined();
};
const TEN_MINUTES_MS = 10 * 60 * 1000;
export const expectCustomerFeatureCorrect = ({
customerId,
customer: providedCustomer,
featureId,
includedUsage,
balance,
usage,
resetsAt,
toleranceMs = TEN_MINUTES_MS,
}: {
customerId?: string;
customer?: ApiCustomerV3 | ApiEntityV0;
featureId: string;
includedUsage?: number;
balance?: number;
usage?: number;
resetsAt?: number;
toleranceMs?: number;
}) => {
if (!providedCustomer && !customerId) {
throw new Error("Either customer or customerId must be provided");
}
const feature = providedCustomer?.features?.[featureId];
expect(feature, `Feature ${featureId} not found`).toBeDefined();
if (includedUsage !== undefined) {
expect(feature?.included_usage).toBe(includedUsage);
}
if (balance !== undefined) {
expect(feature?.balance).toBe(balance);
}
if (usage !== undefined) {
expect(feature?.usage).toBe(usage);
}
if (resetsAt !== undefined) {
const actualResetsAt = feature?.next_reset_at ?? 0;
expect(actualResetsAt).toBeDefined();
const diff = Math.abs(actualResetsAt - resetsAt);
expect(
diff,
`resetsAt mismatch for ${featureId}: expected ${formatMs(resetsAt)}, got ${formatMs(actualResetsAt)} `,
).toBeLessThanOrEqual(toleranceMs);
}
};