fix: show non-expiring API keys (#3324)

This commit is contained in:
Amruth Pillai
2026-08-16 10:58:55 +02:00
committed by GitHub
parent 409d09809a
commit 8affc567e3
57 changed files with 13153 additions and 428 deletions
@@ -0,0 +1,69 @@
// @vitest-environment happy-dom
import { render, screen, waitFor } from "@testing-library/react";
import { describe, expect, it, vi } from "vitest";
import { i18n } from "@lingui/core";
import { I18nProvider } from "@lingui/react";
import { QueryClient, QueryClientProvider } from "@tanstack/react-query";
import { ConfirmDialogProvider } from "@/hooks/use-confirm";
const listApiKeys = vi.hoisted(() => vi.fn());
vi.mock("@/libs/auth/client", () => ({
authClient: { apiKey: { list: listApiKeys } },
}));
i18n.loadAndActivate({ locale: "en", messages: {} });
const { ApiKeysSettingsPage } = await import("./api-keys");
describe("ApiKeysSettingsPage", () => {
it("shows active keys that never expire", async () => {
listApiKeys.mockResolvedValue({
data: {
apiKeys: [
{
id: "key-1",
configId: "default",
name: "no-expiry-test",
start: "rr_no_expiry",
prefix: null,
referenceId: "user-1",
refillInterval: null,
refillAmount: null,
lastRefillAt: null,
enabled: true,
rateLimitEnabled: false,
rateLimitTimeWindow: null,
rateLimitMax: null,
requestCount: 0,
remaining: null,
lastRequest: null,
expiresAt: null,
createdAt: new Date("2026-08-16T10:00:00Z"),
updatedAt: new Date("2026-08-16T10:00:00Z"),
metadata: null,
permissions: null,
},
],
total: 1,
limit: undefined,
offset: undefined,
},
error: null,
});
render(
<I18nProvider i18n={i18n}>
<QueryClientProvider client={new QueryClient({ defaultOptions: { queries: { retry: false } } })}>
<ConfirmDialogProvider>
<ApiKeysSettingsPage />
</ConfirmDialogProvider>
</QueryClientProvider>
</I18nProvider>,
);
await waitFor(() => expect(screen.getByText("rr_no_expiry...")).toBeInTheDocument());
expect(screen.getByText("Never expires")).toBeInTheDocument();
});
});
@@ -24,7 +24,7 @@ export function ApiKeysSettingsPage() {
return data.apiKeys
.sort((a, b) => b.createdAt.getTime() - a.createdAt.getTime())
.filter((key) => !!key.expiresAt && key.expiresAt.getTime() > Date.now());
.filter((key) => !key.expiresAt || key.expiresAt.getTime() > Date.now());
},
});
@@ -129,7 +129,11 @@ export function ApiKeysSettingsPage() {
<div className="flex-1 space-y-1">
<p className="font-mono text-xs">{key.start}...</p>
<div className="text-muted-foreground text-xs">
<Trans>Expires on {key.expiresAt?.toLocaleDateString()}</Trans>
{key.expiresAt ? (
<Trans>Expires on {key.expiresAt.toLocaleDateString()}</Trans>
) : (
<Trans>Never expires</Trans>
)}
</div>
</div>