95 lines
3.3 KiB
TypeScript
95 lines
3.3 KiB
TypeScript
import test from "node:test";
|
|
import assert from "node:assert/strict";
|
|
|
|
const claudeExtraUsage = await import("../../src/lib/providers/claudeExtraUsage.ts");
|
|
const { normalizeProviderSpecificData } =
|
|
await import("../../src/lib/providers/requestDefaults.ts");
|
|
const { updateProviderConnectionSchema } = await import("../../src/shared/validation/schemas.ts");
|
|
|
|
function futureIso(ms = 60_000) {
|
|
return new Date(Date.now() + ms).toISOString();
|
|
}
|
|
|
|
test("Claude extra-usage blocking defaults to enabled and validates provider payloads", () => {
|
|
assert.equal(claudeExtraUsage.isClaudeExtraUsageBlockEnabled("claude", {}), true);
|
|
assert.equal(
|
|
claudeExtraUsage.isClaudeExtraUsageBlockEnabled("claude", { blockExtraUsage: false }),
|
|
false
|
|
);
|
|
assert.equal(
|
|
claudeExtraUsage.isClaudeExtraUsageBlockEnabled("openai", { blockExtraUsage: false }),
|
|
false
|
|
);
|
|
|
|
assert.deepEqual(normalizeProviderSpecificData("claude", { blockExtraUsage: "nope", tag: "x" }), {
|
|
tag: "x",
|
|
});
|
|
|
|
const valid = updateProviderConnectionSchema.safeParse({
|
|
providerSpecificData: { blockExtraUsage: false },
|
|
});
|
|
const invalid = updateProviderConnectionSchema.safeParse({
|
|
providerSpecificData: { blockExtraUsage: "false" },
|
|
});
|
|
|
|
assert.equal(valid.success, true);
|
|
assert.equal(invalid.success, false);
|
|
});
|
|
|
|
test("Claude extra-usage state builds an unavailable cooldown update from queued usage", () => {
|
|
const sessionReset = futureIso(180_000);
|
|
const weeklyReset = futureIso(360_000);
|
|
|
|
const update = claudeExtraUsage.buildClaudeExtraUsageConnectionUpdate(
|
|
{
|
|
provider: "claude",
|
|
providerSpecificData: { blockExtraUsage: true },
|
|
backoffLevel: 0,
|
|
},
|
|
{
|
|
extraUsage: { queued: true, billingAmount: 0.5 },
|
|
quotas: {
|
|
"session (5h)": { remainingPercentage: 0, resetAt: sessionReset },
|
|
"weekly (7d)": { remainingPercentage: 62, resetAt: weeklyReset },
|
|
},
|
|
}
|
|
);
|
|
|
|
assert.equal(update?.testStatus, "unavailable");
|
|
assert.equal(update?.lastErrorType, "quota_exhausted");
|
|
assert.equal(update?.lastErrorSource, claudeExtraUsage.CLAUDE_EXTRA_USAGE_ERROR_SOURCE);
|
|
assert.equal(update?.errorCode, 429);
|
|
assert.equal(update?.rateLimitedUntil, sessionReset);
|
|
assert.equal(update?.backoffLevel, 1);
|
|
});
|
|
|
|
test("Claude extra-usage state clears only when a trusted snapshot says queued usage ended", () => {
|
|
const currentState = {
|
|
provider: "claude",
|
|
providerSpecificData: { blockExtraUsage: true },
|
|
testStatus: "unavailable",
|
|
lastError: claudeExtraUsage.CLAUDE_EXTRA_USAGE_ERROR_MESSAGE,
|
|
lastErrorSource: claudeExtraUsage.CLAUDE_EXTRA_USAGE_ERROR_SOURCE,
|
|
lastErrorType: "quota_exhausted",
|
|
rateLimitedUntil: futureIso(180_000),
|
|
backoffLevel: 1,
|
|
};
|
|
|
|
const cleared = claudeExtraUsage.buildClaudeExtraUsageConnectionUpdate(currentState, {
|
|
extraUsage: null,
|
|
quotas: {
|
|
"session (5h)": { remainingPercentage: 42, resetAt: futureIso(120_000) },
|
|
},
|
|
});
|
|
const unchanged = claudeExtraUsage.buildClaudeExtraUsageConnectionUpdate(currentState, {
|
|
message: "Claude connected. Unable to fetch usage: timeout",
|
|
});
|
|
|
|
assert.equal(cleared?.testStatus, "active");
|
|
assert.equal(cleared?.lastError, null);
|
|
assert.equal(cleared?.lastErrorSource, null);
|
|
assert.equal(cleared?.rateLimitedUntil, null);
|
|
assert.equal(cleared?.backoffLevel, 0);
|
|
assert.equal(unchanged, null);
|
|
});
|