Files
Jyotisha/frontend/tests/pricing-simulation.test.ts
T
2026-08-31 04:30:40 +08:00

42 lines
1.7 KiB
TypeScript

import assert from "node:assert/strict";
import test from "node:test";
import { estimateFeature, membershipCost, weightedAverageMessages } from "../src/lib/pricing-simulation.ts";
const metric = (value: number | null) => ({ runs: value === null ? 0 : 1, avg: value, p50: value, p95: value, max: value });
test("normalizes a distribution whose weights do not sum to one", () => {
assert.equal(weightedAverageMessages([{ weight: 1, monthlyMessages: 10 }, { weight: 1, monthlyMessages: 20 }]), 15);
});
test("billingLimit null is explicitly unlimited rather than zero", () => {
const result = membershipCost([{ weight: 1, monthlyMessages: 10 }], 2, null);
assert.equal(result.worstCostCny, null);
assert.equal(result.unlimitedWorstCase, true);
});
test("zero model prices remain a measured zero cost", () => {
const result = estimateFeature({
featureKey: "chat.standard",
creditCost: 10,
usdToCny: 7,
model: { modelTier: "standard", inputCostMicrousdPerMillion: 0, outputCostMicrousdPerMillion: 0 },
usage: { hasData: true, metrics: { costMicrousd: metric(0), inputTokens: metric(100), outputTokens: metric(20), durationMs: metric(1000) } },
});
assert.equal(result.costMicrousd, 0);
assert.equal(result.costCny, 0);
assert.equal(result.marginPercent, 100);
assert.equal(result.source, "ledger");
});
test("ledger with no data is not silently converted to zero", () => {
const result = estimateFeature({
featureKey: "report.full",
creditCost: null,
usdToCny: 7,
model: null,
usage: { hasData: false, metrics: { costMicrousd: metric(null), inputTokens: metric(null), outputTokens: metric(null), durationMs: metric(null) } },
});
assert.equal(result.costMicrousd, null);
assert.equal(result.source, "unavailable");
});