81 lines
2.7 KiB
JavaScript
81 lines
2.7 KiB
JavaScript
|
|
const { describe, it } = require("node:test");
|
||
|
|
const assert = require("node:assert");
|
||
|
|
const { TOKEN_RATES, emptyUsageBucket, calculateCostForBucket } = require("../src/tokens");
|
||
|
|
|
||
|
|
describe("tokens module", () => {
|
||
|
|
describe("TOKEN_RATES", () => {
|
||
|
|
it("has input rate", () => {
|
||
|
|
assert.strictEqual(TOKEN_RATES.input, 15.0);
|
||
|
|
});
|
||
|
|
|
||
|
|
it("has output rate", () => {
|
||
|
|
assert.strictEqual(TOKEN_RATES.output, 75.0);
|
||
|
|
});
|
||
|
|
|
||
|
|
it("has cache read rate", () => {
|
||
|
|
assert.strictEqual(TOKEN_RATES.cacheRead, 1.5);
|
||
|
|
});
|
||
|
|
|
||
|
|
it("has cache write rate", () => {
|
||
|
|
assert.strictEqual(TOKEN_RATES.cacheWrite, 18.75);
|
||
|
|
});
|
||
|
|
});
|
||
|
|
|
||
|
|
describe("emptyUsageBucket()", () => {
|
||
|
|
it("returns object with zero values", () => {
|
||
|
|
const bucket = emptyUsageBucket();
|
||
|
|
assert.strictEqual(bucket.input, 0);
|
||
|
|
assert.strictEqual(bucket.output, 0);
|
||
|
|
assert.strictEqual(bucket.cacheRead, 0);
|
||
|
|
assert.strictEqual(bucket.cacheWrite, 0);
|
||
|
|
assert.strictEqual(bucket.cost, 0);
|
||
|
|
assert.strictEqual(bucket.requests, 0);
|
||
|
|
});
|
||
|
|
|
||
|
|
it("returns a new object each time", () => {
|
||
|
|
const a = emptyUsageBucket();
|
||
|
|
const b = emptyUsageBucket();
|
||
|
|
assert.notStrictEqual(a, b);
|
||
|
|
a.input = 100;
|
||
|
|
assert.strictEqual(b.input, 0);
|
||
|
|
});
|
||
|
|
});
|
||
|
|
|
||
|
|
describe("calculateCostForBucket()", () => {
|
||
|
|
it("calculates cost for given token counts", () => {
|
||
|
|
const bucket = {
|
||
|
|
input: 1_000_000,
|
||
|
|
output: 1_000_000,
|
||
|
|
cacheRead: 1_000_000,
|
||
|
|
cacheWrite: 1_000_000,
|
||
|
|
};
|
||
|
|
const result = calculateCostForBucket(bucket);
|
||
|
|
assert.strictEqual(result.inputCost, 15.0);
|
||
|
|
assert.strictEqual(result.outputCost, 75.0);
|
||
|
|
assert.strictEqual(result.cacheReadCost, 1.5);
|
||
|
|
assert.strictEqual(result.cacheWriteCost, 18.75);
|
||
|
|
assert.strictEqual(result.totalCost, 15.0 + 75.0 + 1.5 + 18.75);
|
||
|
|
});
|
||
|
|
|
||
|
|
it("returns zero cost for empty bucket", () => {
|
||
|
|
const bucket = { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 };
|
||
|
|
const result = calculateCostForBucket(bucket);
|
||
|
|
assert.strictEqual(result.totalCost, 0);
|
||
|
|
});
|
||
|
|
|
||
|
|
it("accepts custom rates", () => {
|
||
|
|
const bucket = { input: 1_000_000, output: 0, cacheRead: 0, cacheWrite: 0 };
|
||
|
|
const customRates = { input: 10, output: 0, cacheRead: 0, cacheWrite: 0 };
|
||
|
|
const result = calculateCostForBucket(bucket, customRates);
|
||
|
|
assert.strictEqual(result.inputCost, 10.0);
|
||
|
|
assert.strictEqual(result.totalCost, 10.0);
|
||
|
|
});
|
||
|
|
|
||
|
|
it("calculates proportionally for partial token counts", () => {
|
||
|
|
const bucket = { input: 500_000, output: 0, cacheRead: 0, cacheWrite: 0 };
|
||
|
|
const result = calculateCostForBucket(bucket);
|
||
|
|
assert.strictEqual(result.inputCost, 7.5);
|
||
|
|
});
|
||
|
|
});
|
||
|
|
});
|