/** * @vitest-environment happy-dom */ import type { ReactNode } from "react"; import { renderToStaticMarkup } from "react-dom/server"; import { describe, expect, test, vi } from "vitest"; import { SessionListItem } from "@/components/customs/session-list-item"; import type { CurrencyCode } from "@/lib/utils/currency"; import type { ActiveSessionInfo } from "@/types/session"; vi.mock("@/i18n/routing", () => ({ Link: ({ href, children, ...rest }: { href: string; children: ReactNode; className?: string; }) => ( {children} ), })); vi.mock("@/lib/utils/currency", async () => { const actual = await vi.importActual("@/lib/utils/currency"); return { ...actual, formatCurrency: () => "__COST__", }; }); const UP_ARROW = "\u2191"; const DOWN_ARROW = "\u2193"; const COST_SENTINEL = "__COST__"; type SessionListItemProps = { session: ActiveSessionInfo; currencyCode?: CurrencyCode; showTokensCost?: boolean; }; const SessionListItemTest = SessionListItem as unknown as ( props: SessionListItemProps ) => JSX.Element; const baseSession: ActiveSessionInfo = { sessionId: "session-1", userName: "alice", userId: 1, keyId: 2, keyName: "key-1", providerId: 3, providerName: "openai", model: "gpt-4.1", apiType: "chat", startTime: 1700000000000, status: "completed", durationMs: 1500, inputTokens: 100, outputTokens: 50, costUsd: "0.0123", }; function renderTextContent(options?: { showTokensCost?: boolean; sessionOverrides?: Partial; }) { const session = { ...baseSession, ...(options?.sessionOverrides ?? {}) }; const html = renderToStaticMarkup( ); const container = document.createElement("div"); container.innerHTML = html; return container.textContent ?? ""; } describe("SessionListItem showTokensCost", () => { test("hides tokens and cost when disabled but keeps core fields", () => { const text = renderTextContent({ showTokensCost: false }); expect(text).not.toContain(`${UP_ARROW}100`); expect(text).not.toContain(`${DOWN_ARROW}50`); expect(text).not.toContain(COST_SENTINEL); expect(text).toContain("alice"); expect(text).toContain("key-1"); expect(text).toContain("gpt-4.1"); expect(text).toContain("@ openai"); expect(text).toContain("1.5s"); }); test("shows tokens and cost by default", () => { const text = renderTextContent(); expect(text).toContain(`${UP_ARROW}100`); expect(text).toContain(`${DOWN_ARROW}50`); expect(text).toContain(COST_SENTINEL); }); });