/* * Copyright OpenSearch Contributors * SPDX-License-Identifier: Apache-2.0 */ import React from "react"; import "@testing-library/jest-dom/extend-expect"; import { fireEvent, render, waitFor } from "@testing-library/react"; import { browserServicesMock, coreServicesMock } from "../../../test/mocks"; import { CoreServicesContext } from "../../components/core_services"; import { ServicesContext } from "../../services"; import { BrowserServices } from "../../models/interfaces"; import { ModalProvider } from "../../components/Modal"; import { CoreStart } from "opensearch-dashboards/public"; import FlushIndexModal, { FlushIndexModalProps } from "./FlushIndexModal"; import { buildMockApiCallerForFlush, selectedAliases, selectedDataStreams, selectedIndices } from "./FlushIndexModalTestHelper"; import { act } from "react-dom/test-utils"; import { INDEX_OP_TARGET_TYPE } from "../../utils/constants"; function renderWithRouter( coreServicesContext: CoreStart | null, browserServicesContext: BrowserServices | null, props: FlushIndexModalProps ) { return { ...render( ), }; } describe(" spec", () => { beforeEach(() => { browserServicesMock.commonService.apiCaller = buildMockApiCallerForFlush(); }); it("renders the component with alias", async () => { const { getByText } = renderWithRouter(coreServicesMock, browserServicesMock, { selectedItems: selectedAliases, visible: true, flushTarget: INDEX_OP_TARGET_TYPE.ALIAS, onClose: () => {}, }); /* to wait for useEffect updating modal */ await waitFor(() => { expect(getByText("The following aliases will be flushed:")).toBeInTheDocument(); }); expect(document.body.children).toMatchSnapshot(); }); it("renders the component with data stream", async () => { const { getByText } = renderWithRouter(coreServicesMock, browserServicesMock, { selectedItems: selectedDataStreams, visible: true, flushTarget: INDEX_OP_TARGET_TYPE.DATA_STREAM, onClose: () => {}, }); /* to wait for useEffect updating modal */ await waitFor(() => { expect(getByText("The following data streams will be flushed:")).toBeInTheDocument(); }); expect(document.body.children).toMatchSnapshot(); }); it("renders the component with indices", async () => { const { getByText } = renderWithRouter(coreServicesMock, browserServicesMock, { selectedItems: selectedIndices, visible: true, flushTarget: INDEX_OP_TARGET_TYPE.INDEX, onClose: () => {}, }); /* to wait for useEffect updating modal */ await waitFor(() => { expect(getByText("The following indexes will be flushed:")).toBeInTheDocument(); }); expect(document.body.children).toMatchSnapshot(); }); it("renders with flush all indices", async () => { browserServicesMock.commonService.apiCaller = buildMockApiCallerForFlush({ has_red_indices: false }); const { getByText } = renderWithRouter(coreServicesMock, browserServicesMock, { selectedItems: [], visible: true, flushTarget: INDEX_OP_TARGET_TYPE.INDEX, onClose: () => {}, }); /* to wait for useEffect updating modal */ await act(async () => {}); expect(getByText("All open indexes will be flushed.")).toBeInTheDocument(); expect(document.body.children).toMatchSnapshot(); }); it("renders with no blocked items", async () => { const { getByText } = renderWithRouter(coreServicesMock, browserServicesMock, { selectedItems: [{ index: "test_index2" }, { index: "test_index3" }], visible: true, flushTarget: INDEX_OP_TARGET_TYPE.INDEX, onClose: () => {}, }); /* to wait for useEffect updating modal */ await waitFor(() => { expect(getByText("The following indexes will be flushed:")).toBeInTheDocument(); }); expect(document.body.children).toMatchSnapshot(); }); it("flush indices", async () => { const onClose = jest.fn(); const { getByTestId } = renderWithRouter(coreServicesMock, browserServicesMock, { selectedItems: selectedIndices, visible: true, flushTarget: INDEX_OP_TARGET_TYPE.INDEX, onClose: onClose, }); await act(async () => {}); fireEvent.click(getByTestId("flushConfirmButton")); await waitFor(() => { expect(browserServicesMock.commonService.apiCaller).toHaveBeenCalledTimes(3); expect(browserServicesMock.commonService.apiCaller).toHaveBeenCalledWith({ endpoint: "indices.flush", data: { index: "test_index2, test_index3", }, }); expect(coreServicesMock.notifications.toasts.addSuccess).toHaveBeenCalledTimes(1); expect(coreServicesMock.notifications.toasts.addSuccess).toHaveBeenCalledWith("2 indexes have been successfully flushed."); expect(onClose).toHaveBeenCalledTimes(1); }); }); it("flush alias", async () => { const onClose = jest.fn(); const { getByTestId } = renderWithRouter(coreServicesMock, browserServicesMock, { selectedItems: selectedAliases, visible: true, flushTarget: INDEX_OP_TARGET_TYPE.ALIAS, onClose: onClose, }); await act(async () => {}); fireEvent.click(getByTestId("flushConfirmButton")); await waitFor(() => { expect(browserServicesMock.commonService.apiCaller).toHaveBeenCalledTimes(3); expect(browserServicesMock.commonService.apiCaller).toHaveBeenCalledWith({ endpoint: "indices.flush", data: { index: "alias2", }, }); expect(coreServicesMock.notifications.toasts.addSuccess).toHaveBeenCalledTimes(1); expect(coreServicesMock.notifications.toasts.addSuccess).toHaveBeenCalledWith("The alias alias2 has been successfully flushed."); expect(onClose).toHaveBeenCalledTimes(1); }); }); it("flush data stream", async () => { const onClose = jest.fn(); const { getByTestId } = renderWithRouter(coreServicesMock, browserServicesMock, { selectedItems: selectedDataStreams, visible: true, flushTarget: INDEX_OP_TARGET_TYPE.DATA_STREAM, onClose: onClose, }); await act(async () => {}); fireEvent.click(getByTestId("flushConfirmButton")); await waitFor(() => { expect(browserServicesMock.commonService.apiCaller).toHaveBeenCalledTimes(3); expect(browserServicesMock.commonService.apiCaller).toHaveBeenCalledWith({ endpoint: "indices.flush", data: { index: "ds2", }, }); expect(coreServicesMock.notifications.toasts.addSuccess).toHaveBeenCalledTimes(1); expect(coreServicesMock.notifications.toasts.addSuccess).toHaveBeenCalledWith("The data stream ds2 has been successfully flushed."); expect(onClose).toHaveBeenCalledTimes(1); }); }); it("flush indices has error calling blocks api", async () => { const onClose = jest.fn(); browserServicesMock.commonService.apiCaller = buildMockApiCallerForFlush({ block_success: false }); const { getByTestId } = renderWithRouter(coreServicesMock, browserServicesMock, { selectedItems: selectedIndices, visible: true, flushTarget: INDEX_OP_TARGET_TYPE.INDEX, onClose: onClose, }); await act(async () => {}); fireEvent.click(getByTestId("flushConfirmButton")); await waitFor(() => { expect(browserServicesMock.commonService.apiCaller).toHaveBeenCalledTimes(3); expect(browserServicesMock.commonService.apiCaller).toHaveBeenCalledWith({ endpoint: "indices.flush", data: { index: "test_index1, test_index2, test_index3, test_index4", }, }); expect(coreServicesMock.notifications.toasts.addSuccess).toHaveBeenCalledTimes(1); expect(coreServicesMock.notifications.toasts.addSuccess).toHaveBeenCalledWith("4 indexes have been successfully flushed."); expect(onClose).toHaveBeenCalledTimes(1); }); }); it("flush indices has error calling flush api", async () => { const onClose = jest.fn(); browserServicesMock.commonService.apiCaller = buildMockApiCallerForFlush({ flush_success: false }); const { getByTestId } = renderWithRouter(coreServicesMock, browserServicesMock, { selectedItems: selectedIndices, visible: true, flushTarget: INDEX_OP_TARGET_TYPE.INDEX, onClose: onClose, }); await act(async () => {}); fireEvent.click(getByTestId("flushConfirmButton")); await waitFor(() => { expect(browserServicesMock.commonService.apiCaller).toHaveBeenCalledTimes(3); expect(browserServicesMock.commonService.apiCaller).toHaveBeenCalledWith({ endpoint: "indices.flush", data: { index: "test_index2, test_index3", }, }); expect(coreServicesMock.notifications.toasts.addDanger).toHaveBeenCalledTimes(1); expect(coreServicesMock.notifications.toasts.addDanger).toHaveBeenCalledWith({ text: "some error in flush", title: "Unable to flush indexes", }); expect(onClose).toHaveBeenCalledTimes(1); }); }); it("browser service context not ready", async () => { const onClose = jest.fn(); const { queryByText } = renderWithRouter(coreServicesMock, null, { selectedItems: selectedIndices, visible: true, flushTarget: INDEX_OP_TARGET_TYPE.INDEX, onClose: onClose, }); await act(async () => {}); expect(queryByText("flushConfirmButton")).toBeNull(); }); it("flush all indices without red indices", async () => { const onClose = jest.fn(); browserServicesMock.commonService.apiCaller = buildMockApiCallerForFlush({ has_red_indices: false }); const { getByTestId } = renderWithRouter(coreServicesMock, browserServicesMock, { selectedItems: [], visible: true, flushTarget: INDEX_OP_TARGET_TYPE.INDEX, onClose: onClose, }); await act(async () => {}); fireEvent.click(getByTestId("flushConfirmButton")); await waitFor(() => { expect(browserServicesMock.commonService.apiCaller).toHaveBeenCalledTimes(2); expect(browserServicesMock.commonService.apiCaller).toHaveBeenCalledWith({ endpoint: "indices.flush", data: { index: "", }, }); expect(coreServicesMock.notifications.toasts.addSuccess).toHaveBeenCalledTimes(1); expect(coreServicesMock.notifications.toasts.addSuccess).toHaveBeenCalledWith("All open indexes have been successfully flushed."); }); }); it("flush all indices with red indices", async () => { const onClose = jest.fn(); renderWithRouter(coreServicesMock, browserServicesMock, { selectedItems: [], visible: true, flushTarget: INDEX_OP_TARGET_TYPE.INDEX, onClose: onClose, }); await act(async () => {}); await waitFor(() => { expect(browserServicesMock.commonService.apiCaller).toHaveBeenCalledTimes(1); expect(coreServicesMock.notifications.toasts.addDanger).toHaveBeenCalledTimes(1); expect(coreServicesMock.notifications.toasts.addDanger).toHaveBeenCalledWith({ title: "Unable to flush indexes", text: "Can not flush all open indexes because indexes [test_index4] are in red status.", }); }); }); it("no flushable indices", async () => { const onClose = jest.fn(); const { getByTestId } = renderWithRouter(coreServicesMock, browserServicesMock, { selectedItems: [{ index: "test_index1" }, { index: "test_index4" }], visible: true, flushTarget: INDEX_OP_TARGET_TYPE.INDEX, onClose: onClose, }); await act(async () => {}); await waitFor(() => { expect(browserServicesMock.commonService.apiCaller).toHaveBeenCalledTimes(2); expect(coreServicesMock.notifications.toasts.addDanger).toHaveBeenCalledTimes(1); expect(coreServicesMock.notifications.toasts.addDanger).toHaveBeenCalledWith({ title: "Unable to flush indexes", text: "The selected indexes cannot be flushed because they are either closed or in red status.", }); expect(onClose).toHaveBeenCalledTimes(1); }); }); });