← back to Open Seo
src/client/features/billing/BillingFeatureBreakdown.test.ts
99 lines
import { describe, expect, it, vi } from "vitest";
vi.mock("@/serverFunctions/billing", () => ({
getBillingUsageEvents: vi.fn(),
}));
import { getBillingFeatureBreakdownRows } from "./BillingFeatureBreakdown";
describe("getBillingFeatureBreakdownRows", () => {
it("uses explicit creditFeature when present", () => {
const rows = getBillingFeatureBreakdownRows([
{
value: 250,
properties: {
creditFeature: "rank_tracking",
paths: ["v3/serp/google/organic/live/regular"],
},
},
]);
expect(rows).toEqual([{ label: "Rank Tracking", usd: 0.25 }]);
});
it("supports raw Autumn property aliases", () => {
const rows = getBillingFeatureBreakdownRows([
{
value: 200,
properties: {
credit_feature: "local_seo",
path: "v3/backlinks/summary/live",
},
},
]);
expect(rows).toEqual([{ label: "Local SEO", usd: 0.2 }]);
});
it("infers legacy events from DataForSEO paths", () => {
const rows = getBillingFeatureBreakdownRows([
{
value: 500,
properties: { paths: ["v3/backlinks/summary/live"] },
},
{
value: 250,
properties: {
paths: ["v3/dataforseo_labs/google/domain_rank_overview/live"],
},
},
{
value: 125,
properties: {
paths: ["v3/ai_optimization/llm_mentions/search/live"],
},
},
{
value: 100,
properties: { paths: ["backlinks/summary"] },
},
]);
expect(rows).toEqual([
{ label: "Backlinks", usd: 0.6 },
{ label: "Domain Overview", usd: 0.25 },
{ label: "AI Citations", usd: 0.125 },
]);
});
it("supports legacy JSON-encoded path groups", () => {
const rows = getBillingFeatureBreakdownRows([
{
value: 300,
properties: {
paths: '["v3/ai_optimization/chat_gpt/llm_responses/live"]',
},
},
{
value: 200,
properties: {
paths: '["v3","ai_optimization","perplexity","llm_responses","live"]',
},
},
]);
expect(rows).toEqual([{ label: "AI Prompt Responses", usd: 0.5 }]);
});
it("falls back to Other when neither feature nor path is available", () => {
const rows = getBillingFeatureBreakdownRows([
{
value: 100,
properties: {},
},
]);
expect(rows).toEqual([{ label: "Other", usd: 0.1 }]);
});
});