import { screen, within } from "@testing-library/react"; import userEvent from "@testing-library/user-event"; import { afterEach, describe, expect, it, vi } from "vitest"; import { createRoutesStub } from "react-router"; import { renderWithProviders } from "test-utils"; import OpenHands from "#/api/open-hands"; import SettingsScreen from "#/routes/settings"; import { PaymentForm } from "#/components/features/payment/payment-form"; import * as useSettingsModule from "#/hooks/query/use-settings"; // Mock the useSettings hook vi.mock("#/hooks/query/use-settings", async () => { const actual = await vi.importActual("#/hooks/query/use-settings"); return { ...actual, useSettings: vi.fn().mockReturnValue({ data: { EMAIL_VERIFIED: true, // Mock email as verified to prevent redirection }, isLoading: false, }), }; }); // Mock the i18next hook vi.mock("react-i18next", async () => { const actual = await vi.importActual("react-i18next"); return { ...actual, useTranslation: () => ({ t: (key: string) => { const translations: Record = { "SETTINGS$NAV_GIT": "Git", "SETTINGS$NAV_APPLICATION": "Application", "SETTINGS$NAV_CREDITS": "Credits", "SETTINGS$NAV_API_KEYS": "API Keys", "SETTINGS$NAV_LLM": "LLM", "SETTINGS$NAV_USER": "User", "SETTINGS$TITLE": "Settings" }; return translations[key] || key; }, i18n: { changeLanguage: vi.fn(), }, }), }; }); describe("Settings Billing", () => { const getConfigSpy = vi.spyOn(OpenHands, "getConfig"); const RoutesStub = createRoutesStub([ { Component: SettingsScreen, path: "/settings", children: [ { Component: () => , path: "/settings/billing", }, { Component: () =>
, path: "/settings/git", }, { Component: () =>
, path: "/settings/user", }, ], }, ]); const renderSettingsScreen = () => renderWithProviders(); afterEach(() => { vi.clearAllMocks(); }); it("should not render the credits tab if OSS mode", async () => { getConfigSpy.mockResolvedValue({ APP_MODE: "oss", GITHUB_CLIENT_ID: "123", POSTHOG_CLIENT_KEY: "456", FEATURE_FLAGS: { ENABLE_BILLING: false, HIDE_LLM_SETTINGS: false, }, }); renderSettingsScreen(); const navbar = await screen.findByTestId("settings-navbar"); const credits = within(navbar).queryByText("Credits"); expect(credits).not.toBeInTheDocument(); }); it("should render the credits tab if SaaS mode and billing is enabled", async () => { getConfigSpy.mockResolvedValue({ APP_MODE: "saas", GITHUB_CLIENT_ID: "123", POSTHOG_CLIENT_KEY: "456", FEATURE_FLAGS: { ENABLE_BILLING: true, HIDE_LLM_SETTINGS: false, }, }); renderSettingsScreen(); const navbar = await screen.findByTestId("settings-navbar"); within(navbar).getByText("Credits"); }); it("should render the billing settings if clicking the credits item", async () => { const user = userEvent.setup(); getConfigSpy.mockResolvedValue({ APP_MODE: "saas", GITHUB_CLIENT_ID: "123", POSTHOG_CLIENT_KEY: "456", FEATURE_FLAGS: { ENABLE_BILLING: true, HIDE_LLM_SETTINGS: false, }, }); renderSettingsScreen(); const navbar = await screen.findByTestId("settings-navbar"); const credits = within(navbar).getByText("Credits"); await user.click(credits); const billingSection = await screen.findByTestId("billing-settings"); expect(billingSection).toBeInTheDocument(); }); });