chore: import upstream snapshot with attribution
This commit is contained in:
@@ -0,0 +1,126 @@
|
||||
import { describe, expect, it } from "vitest";
|
||||
import {
|
||||
BillingLimitResultSchema,
|
||||
BillingLimitsPendingResolvesResultSchema,
|
||||
EntitlementResultSchema,
|
||||
ResolveBillingLimitRequestSchema,
|
||||
} from "~/services/billingLimit.schemas";
|
||||
|
||||
describe("billingLimit.schemas", () => {
|
||||
it("parses unconfigured billing limit", () => {
|
||||
const result = BillingLimitResultSchema.parse({
|
||||
isConfigured: false,
|
||||
gracePeriodMs: 86_400_000,
|
||||
});
|
||||
|
||||
expect(result.isConfigured).toBe(false);
|
||||
expect(result.gracePeriodMs).toBe(86_400_000);
|
||||
});
|
||||
|
||||
it("parses configured mode none with limitState ok — not the same as unconfigured", () => {
|
||||
const result = BillingLimitResultSchema.parse({
|
||||
isConfigured: true,
|
||||
mode: "none",
|
||||
cancelInProgressRuns: false,
|
||||
effectiveAmountCents: null,
|
||||
gracePeriodMs: 86_400_000,
|
||||
limitState: { status: "ok" },
|
||||
});
|
||||
|
||||
expect(result.isConfigured).toBe(true);
|
||||
if (result.isConfigured) {
|
||||
expect(result.mode).toBe("none");
|
||||
expect(result.limitState.status).toBe("ok");
|
||||
expect(result.effectiveAmountCents).toBeNull();
|
||||
}
|
||||
|
||||
// UI must use !isConfigured for the no-limit org banner — not mode === "none".
|
||||
const unconfigured = BillingLimitResultSchema.parse({
|
||||
isConfigured: false,
|
||||
gracePeriodMs: 86_400_000,
|
||||
});
|
||||
expect(unconfigured.isConfigured).toBe(false);
|
||||
expect(result.isConfigured).not.toBe(unconfigured.isConfigured);
|
||||
});
|
||||
|
||||
it("parses configured billing limit in grace", () => {
|
||||
const result = BillingLimitResultSchema.parse({
|
||||
isConfigured: true,
|
||||
mode: "custom",
|
||||
amountCents: 50_000,
|
||||
cancelInProgressRuns: false,
|
||||
effectiveAmountCents: 50_000,
|
||||
gracePeriodMs: 86_400_000,
|
||||
limitState: {
|
||||
status: "grace",
|
||||
hitAt: "2026-06-14T12:00:00.000Z",
|
||||
graceEndsAt: "2026-06-15T12:00:00.000Z",
|
||||
},
|
||||
});
|
||||
|
||||
expect(result.isConfigured).toBe(true);
|
||||
if (result.isConfigured) {
|
||||
expect(result.mode).toBe("custom");
|
||||
expect(result.limitState.status).toBe("grace");
|
||||
}
|
||||
});
|
||||
|
||||
it("parses entitlement with billing_limit reason", () => {
|
||||
const result = EntitlementResultSchema.parse({
|
||||
hasAccess: false,
|
||||
reason: "billing_limit",
|
||||
});
|
||||
|
||||
expect(result.hasAccess).toBe(false);
|
||||
expect(result.reason).toBe("billing_limit");
|
||||
});
|
||||
|
||||
it("parses entitlement with free_tier_exceeded reason", () => {
|
||||
const result = EntitlementResultSchema.parse({
|
||||
hasAccess: false,
|
||||
reason: "free_tier_exceeded",
|
||||
balance: 0,
|
||||
usage: 100,
|
||||
overage: 10,
|
||||
});
|
||||
|
||||
expect(result.hasAccess).toBe(false);
|
||||
expect(result.reason).toBe("free_tier_exceeded");
|
||||
});
|
||||
|
||||
it("parses entitlement with grace limit state", () => {
|
||||
const result = EntitlementResultSchema.parse({
|
||||
hasAccess: true,
|
||||
limitState: "grace",
|
||||
});
|
||||
|
||||
expect(result.hasAccess).toBe(true);
|
||||
expect(result.limitState).toBe("grace");
|
||||
});
|
||||
|
||||
it("parses resolve payload", () => {
|
||||
const result = ResolveBillingLimitRequestSchema.parse({
|
||||
action: "increase",
|
||||
newAmountCents: 150_000,
|
||||
resumeMode: "queue",
|
||||
});
|
||||
|
||||
expect(result.action).toBe("increase");
|
||||
expect(result.newAmountCents).toBe(150_000);
|
||||
});
|
||||
|
||||
it("parses pending billing limit resolves from billing platform", () => {
|
||||
const result = BillingLimitsPendingResolvesResultSchema.parse({
|
||||
orgs: [
|
||||
{
|
||||
organizationId: "org_123",
|
||||
resumeMode: "new_only",
|
||||
resolvedAt: "2026-06-17T12:00:00.000Z",
|
||||
},
|
||||
],
|
||||
});
|
||||
|
||||
expect(result.orgs).toHaveLength(1);
|
||||
expect(result.orgs[0]?.resumeMode).toBe("new_only");
|
||||
});
|
||||
});
|
||||
Reference in New Issue
Block a user