mirror of
https://github.com/diegosouzapw/OmniRoute.git
synced 2026-08-19 13:42:09 +03:00
The Fast Quality Gates file-size ratchet froze providerPageHelpers.ts at 1053 lines; adding getCodexPlanLabel inline pushed it to 1067. Move the self-contained helper into its own codexPlanLabel.ts module instead of growing the frozen file, and repoint ConnectionRow.tsx + the regression test at the new location. No behavior change.
51 lines
2.5 KiB
TypeScript
51 lines
2.5 KiB
TypeScript
// Port of upstream decolua/9router PR #2570 (feat(ui): show Codex plan labels
|
|
// in provider and quota views).
|
|
//
|
|
// Two independent gaps this closes:
|
|
//
|
|
// 1. providerPageHelpers.getCodexPlanLabel — the provider-detail ConnectionRow
|
|
// never surfaced the Codex subscription plan (persisted at OAuth import
|
|
// time in providerSpecificData.chatgptPlanType — see
|
|
// src/lib/oauth/services/codexImport.ts) anywhere in the row UI.
|
|
//
|
|
// 2. ProviderLimits/utils.resolvePlanValue — the quota-view plan badge
|
|
// machinery already existed (tierByConnection / QuotaCardHeader), but its
|
|
// persisted-metadata fallback list did not include chatgptPlanType. When
|
|
// the live Codex usage endpoint does not return a plan_type field (usage
|
|
// service falls back to the literal string "unknown" — see
|
|
// open-sse/services/usage/codex.ts), the badge fell through to "Unknown"
|
|
// instead of the plan captured at login.
|
|
import { test } from "node:test";
|
|
import assert from "node:assert/strict";
|
|
import { getCodexPlanLabel } from "@/app/(dashboard)/dashboard/providers/[id]/codexPlanLabel";
|
|
import { resolvePlanValue } from "@/app/(dashboard)/dashboard/usage/components/ProviderLimits/utils";
|
|
|
|
test("getCodexPlanLabel returns the trimmed chatgptPlanType for codex connections", () => {
|
|
assert.equal(getCodexPlanLabel(true, { chatgptPlanType: " Pro " }), "Pro");
|
|
});
|
|
|
|
test("getCodexPlanLabel returns empty string when not a codex connection", () => {
|
|
assert.equal(getCodexPlanLabel(false, { chatgptPlanType: "Pro" }), "");
|
|
});
|
|
|
|
test("getCodexPlanLabel returns empty string when chatgptPlanType is missing/blank", () => {
|
|
assert.equal(getCodexPlanLabel(true, {}), "");
|
|
assert.equal(getCodexPlanLabel(true, { chatgptPlanType: " " }), "");
|
|
assert.equal(getCodexPlanLabel(true, undefined), "");
|
|
});
|
|
|
|
test("resolvePlanValue falls back to the persisted Codex chatgptPlanType when the live plan is unknown", () => {
|
|
// Reproduces the exact shape open-sse/services/usage/codex.ts returns when
|
|
// the upstream Codex usage endpoint omits plan_type/planType.
|
|
assert.equal(resolvePlanValue("unknown", { chatgptPlanType: "Pro" }), "Pro");
|
|
});
|
|
|
|
test("resolvePlanValue still prefers a real live plan over the persisted Codex fallback", () => {
|
|
assert.equal(resolvePlanValue("Team", { chatgptPlanType: "Pro" }), "Team");
|
|
});
|
|
|
|
test("resolvePlanValue returns null when neither live nor persisted Codex plan is available", () => {
|
|
assert.equal(resolvePlanValue("unknown", {}), null);
|
|
assert.equal(resolvePlanValue(null, null), null);
|
|
});
|