import { createRoutesStub } from "react-router"; import { afterEach, beforeAll, describe, expect, it, vi } from "vitest"; import { renderWithProviders } from "test-utils"; import { screen, waitFor } from "@testing-library/react"; import toast from "react-hot-toast"; import App from "#/routes/_oh.app/route"; import OpenHands from "#/api/open-hands"; import { MULTI_CONVERSATION_UI } from "#/utils/feature-flags"; describe("App", () => { const RouteStub = createRoutesStub([ { Component: App, path: "/conversation/:conversationId" }, ]); const { endSessionMock } = vi.hoisted(() => ({ endSessionMock: vi.fn(), })); beforeAll(() => { vi.mock("#/hooks/use-end-session", () => ({ useEndSession: vi.fn(() => endSessionMock), })); vi.mock("#/hooks/use-terminal", () => ({ useTerminal: vi.fn(), })); }); afterEach(() => { vi.clearAllMocks(); }); it("should render", async () => { renderWithProviders(); await screen.findByTestId("app-route"); }); it.skipIf(!MULTI_CONVERSATION_UI)( "should call endSession if the user does not have permission to view conversation", async () => { const errorToastSpy = vi.spyOn(toast, "error"); const getConversationSpy = vi.spyOn(OpenHands, "getConversation"); getConversationSpy.mockResolvedValue(null); renderWithProviders( , ); await waitFor(() => { expect(endSessionMock).toHaveBeenCalledOnce(); expect(errorToastSpy).toHaveBeenCalledOnce(); }); }, ); it("should not call endSession if the user has permission", async () => { const errorToastSpy = vi.spyOn(toast, "error"); const getConversationSpy = vi.spyOn(OpenHands, "getConversation"); getConversationSpy.mockResolvedValue({ conversation_id: "9999", last_updated_at: "", created_at: "", title: "", selected_repository: "", status: "STOPPED", }); const { rerender } = renderWithProviders( , ); await waitFor(() => { expect(endSessionMock).not.toHaveBeenCalled(); expect(errorToastSpy).not.toHaveBeenCalled(); }); rerender(); await waitFor(() => { expect(endSessionMock).not.toHaveBeenCalled(); expect(errorToastSpy).not.toHaveBeenCalled(); }); }); });