← back to Open Seo
src/client/features/billing/route-state.test.ts
103 lines
import { describe, expect, it } from "vitest";
import { getBillingRouteState, getSubscribeRouteState } from "./route-state";
describe("getBillingRouteState", () => {
it("shows ready after successful customer lookup", () => {
expect(
getBillingRouteState({
hasSession: true,
isSessionPending: false,
isCustomerLoading: false,
isCustomerError: false,
}),
).toBe("ready");
});
it("shows an error state on billing lookup failures", () => {
expect(
getBillingRouteState({
hasSession: true,
isSessionPending: false,
isCustomerLoading: false,
isCustomerError: true,
}),
).toBe("error");
});
it("keeps the page blank while auth or billing data is still loading", () => {
expect(
getBillingRouteState({
hasSession: true,
isSessionPending: true,
isCustomerLoading: false,
isCustomerError: false,
}),
).toBe("loading");
expect(
getBillingRouteState({
hasSession: true,
isSessionPending: false,
isCustomerLoading: true,
isCustomerError: false,
}),
).toBe("loading");
});
});
describe("getSubscribeRouteState", () => {
const base = {
hasSession: true,
isCustomerLoading: false,
isCustomerError: false,
hasManagedAccess: false,
planStatus: "free" as const,
isUpgradeFlow: false,
checkoutCompleted: false,
};
it("shows an error state on billing lookup failures", () => {
expect(getSubscribeRouteState({ ...base, isCustomerError: true })).toBe(
"error",
);
});
it("keeps the page blank while billing data is still loading", () => {
expect(getSubscribeRouteState({ ...base, isCustomerLoading: true })).toBe(
"loading",
);
});
it("redirects paying customers into the app", () => {
expect(getSubscribeRouteState({ ...base, planStatus: "paid" })).toBe(
"redirectToApp",
);
});
it("redirects grandfathered free-plan users into the app outside the upgrade flow", () => {
expect(getSubscribeRouteState({ ...base, hasManagedAccess: true })).toBe(
"redirectToApp",
);
});
it("shows the paywall to grandfathered users in the upgrade flow", () => {
expect(
getSubscribeRouteState({
...base,
hasManagedAccess: true,
isUpgradeFlow: true,
}),
).toBe("showPaywall");
});
it("finalizes instead of re-showing the paywall right after checkout", () => {
expect(getSubscribeRouteState({ ...base, checkoutCompleted: true })).toBe(
"finalizing",
);
});
it("shows the paywall to users without managed access", () => {
expect(getSubscribeRouteState(base)).toBe("showPaywall");
});
});