import React from "react"; import { screen, within, waitFor } from "@testing-library/react"; import { createCustomRenderer } from "test/test-utils"; import { getPathWithQueryParams } from "utilities/url"; import PATHS from "router/paths"; import InstallerStatusTable from "./InstallerStatusTable"; describe("InstallerStatusTable", () => { const render = createCustomRenderer(); it("renders columns and links for statuses", () => { render( ); // Check cell values (always "hosts", even for 1) const cells = screen.getAllByRole("cell"); const installedLink = cells[0].querySelector("a.link-cell"); const pendingLink = cells[1].querySelector("a.link-cell"); const failedLink = cells[2].querySelector("a.link-cell"); expect(installedLink).toHaveTextContent("0 hosts"); expect(pendingLink).toHaveTextContent("1 host"); expect(failedLink).toHaveTextContent("3 hosts"); }); it("renders correct header titles for install vs script package", () => { const { rerender } = render( ); let headers = screen.getAllByRole("columnheader"); expect(headers[0]).toHaveTextContent("Installed"); expect(headers[1]).toHaveTextContent("Pending"); expect(headers[2]).toHaveTextContent("Failed"); rerender( ); headers = screen.getAllByRole("columnheader"); expect(headers[0]).toHaveTextContent("Ran"); expect(headers[1]).toHaveTextContent("Pending"); expect(headers[2]).toHaveTextContent("Failed"); }); it("renders different tooltips for Android Play Store vs non-Android for pending", async () => { // non-Android: pending install/uninstall message const { user, rerender } = render( ); let pendingHeader = screen.getByText(/pending/i); await user.hover(pendingHeader); await waitFor(() => { expect( screen.getByText(/Fleet is installing\/uninstalling or will/i) ).toBeInTheDocument(); }); // Android: Play Store–style message rerender( ); pendingHeader = screen.getByText(/pending/i); await user.hover(pendingHeader); await waitFor(() => { expect( screen.getByText(/Software will be installed or configuration will/i) ).toBeInTheDocument(); }); }); it("hides installed tooltip for Android Play Store app", async () => { const { user, rerender } = render( ); let installedHeader = screen.getByText(/installed/i); await user.hover(installedHeader); await waitFor(() => { expect( screen.getByText(/Software is installed on these hosts/i) ).toBeInTheDocument(); }); rerender( ); installedHeader = screen.getByText(/installed/i); await user.hover(installedHeader); // Installed tooltip returns null for Android Play Store await waitFor(() => { expect( screen.queryByText(/Software is installed on these hosts/i) ).not.toBeInTheDocument(); }); }); it("renders failed tooltip text correctly for Android vs non-Android", async () => { const { user, rerender } = render( ); let failedHeader = screen.getByText(/failed/i); await user.hover(failedHeader); await waitFor(() => { expect( screen.getByText(/These hosts failed to install\/uninstall software/i) ).toBeInTheDocument(); }); rerender( ); failedHeader = screen.getByText(/failed/i); await user.hover(failedHeader); await waitFor(() => { expect( screen.getByText( /Software failed to install or configuration failed to apply/i ) ).toBeInTheDocument(); }); }); });