/* Copyright 2026 Marimo. All rights reserved. */ import { render, screen } from "@testing-library/react"; import { Provider } from "jotai"; import React from "react"; import { beforeEach, describe, expect, it, vi } from "vitest"; import { MockRequestClient } from "@/__mocks__/requests"; import { viewStateAtom } from "@/core/mode"; import { requestClientAtom } from "@/core/network/requests"; import { store } from "@/core/state/jotai"; import { MissingPackagePrompt } from "../missing-package-prompt"; const mockOpenApplication = vi.fn(); vi.mock("@/components/editor/chrome/state", () => ({ useChromeActions: () => ({ openApplication: mockOpenApplication, }), })); vi.mock("@/components/editor/chrome/panels/packages-state", () => ({ packagesToInstallAtom: {}, })); const mockRequestAnimationFrame = vi.fn((callback) => { callback(); return 1; }); vi.stubGlobal("requestAnimationFrame", mockRequestAnimationFrame); const mockInput = { focus: vi.fn(), value: "", dispatchEvent: vi.fn(), }; vi.spyOn(document, "getElementById").mockReturnValue( mockInput as unknown as HTMLInputElement, ); function createTestWrapper() { const wrapper = ({ children }: { children: React.ReactNode }) => ( {children} ); return { wrapper }; } describe("MissingPackagePrompt", () => { const { wrapper } = createTestWrapper(); beforeEach(() => { vi.clearAllMocks(); store.set(requestClientAtom, MockRequestClient.create()); store.set(viewStateAtom, { mode: "edit", cellAnchor: null }); }); it("should render backend description and install button in edit mode", () => { render( , { wrapper }, ); expect( screen.getByText("Parquet export requires a DataFrame library."), ).toBeInTheDocument(); expect(screen.getByText("Install polars")).toBeInTheDocument(); }); it("should fall back to generic copy when description is absent", () => { render( , { wrapper }, ); expect( screen.getByText("Parquet export requires polars"), ).toBeInTheDocument(); expect(screen.getByText("Install polars")).toBeInTheDocument(); }); it("should render generic line in read mode and not leak packages or description", () => { store.set(viewStateAtom, { mode: "read", cellAnchor: null }); render( , { wrapper }, ); expect( screen.getByText("Parquet export isn't available in this notebook"), ).toBeInTheDocument(); expect( screen.queryByText("Install polars to enable Parquet."), ).not.toBeInTheDocument(); expect(screen.queryByText("Install polars")).not.toBeInTheDocument(); expect(screen.queryByText(/polars/)).not.toBeInTheDocument(); }); });