Spaces:
Build error
Build error
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<typeof import("#/hooks/query/use-settings")>("#/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<typeof import("react-i18next")>("react-i18next"); | |
return { | |
...actual, | |
useTranslation: () => ({ | |
t: (key: string) => { | |
const translations: Record<string, string> = { | |
"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: () => <PaymentForm />, | |
path: "/settings/billing", | |
}, | |
{ | |
Component: () => <div data-testid="git-settings-screen" />, | |
path: "/settings/git", | |
}, | |
{ | |
Component: () => <div data-testid="user-settings-screen" />, | |
path: "/settings/user", | |
}, | |
], | |
}, | |
]); | |
const renderSettingsScreen = () => | |
renderWithProviders(<RoutesStub initialEntries={["/settings/billing"]} />); | |
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(); | |
}); | |
}); | |