/* * Copyright OpenSearch Contributors * SPDX-License-Identifier: Apache-2.0 */ import React from "react"; import "@testing-library/jest-dom/extend-expect"; import { render, waitFor } from "@testing-library/react"; import userEvent from "@testing-library/user-event"; import { browserServicesMock, coreServicesMock } from "../../../../../test/mocks"; import TemplatesActions, { TemplatesActionsProps } from "./index"; import { ServicesContext } from "../../../../services"; import { CoreServicesContext } from "../../../../components/core_services"; import { Route, HashRouter as Router, Switch, Redirect } from "react-router-dom"; import { ROUTES } from "../../../../utils/constants"; const historyPushMock = jest.fn(); function renderWithRouter(props: Omit) { return { ...render( ( { routeProps.history.push(...args); historyPushMock(...args); }, }} /> )} /> ), }; } describe(" spec", () => { it("renders the component and all the actions should be disabled when no items selected", async () => { const { container, getByTestId } = renderWithRouter({ selectedItems: [], onDelete: () => null, }); await waitFor(() => { expect(container.firstChild).toMatchSnapshot(); }); userEvent.click(document.querySelector('[data-test-subj="moreAction"] button') as Element); await waitFor(() => { expect(getByTestId("deleteAction")).toBeDisabled(); }); }); it("delete templates by calling commonService", async () => { const onDelete = jest.fn(); let times = 0; browserServicesMock.commonService.apiCaller = jest.fn( async (payload): Promise => { if (payload.data?.path?.startsWith("/_index_template/")) { if (times >= 1) { return { ok: true, response: {}, }; } else { times++; return { ok: false, error: "test error", }; } } return { ok: true, response: {} }; } ); const { container, getByTestId, getByPlaceholderText } = renderWithRouter({ selectedItems: [ { name: "test_template", index_patterns: "1", version: "1", order: 0, }, ], onDelete, }); await waitFor(() => { expect(container.firstChild).toMatchSnapshot(); }); userEvent.click(document.querySelector('[data-test-subj="moreAction"] button') as Element); userEvent.click(getByTestId("deleteAction")); userEvent.type(getByPlaceholderText("delete"), "delete"); userEvent.click(getByTestId("deleteConfirmButton")); await waitFor(() => { expect(browserServicesMock.commonService.apiCaller).toHaveBeenCalledTimes(1); expect(browserServicesMock.commonService.apiCaller).toHaveBeenCalledWith({ endpoint: "transport.request", data: { path: `/_index_template/test_template`, method: "DELETE", }, }); expect(coreServicesMock.notifications.toasts.addDanger).toHaveBeenCalledTimes(1); expect(coreServicesMock.notifications.toasts.addDanger).toHaveBeenCalledWith("test error"); expect(onDelete).toHaveBeenCalledTimes(0); }); userEvent.click(getByTestId("deleteConfirmButton")); await waitFor(() => { expect(browserServicesMock.commonService.apiCaller).toHaveBeenCalledTimes(2); expect(coreServicesMock.notifications.toasts.addSuccess).toHaveBeenCalledTimes(1); expect(coreServicesMock.notifications.toasts.addSuccess).toHaveBeenCalledWith("Delete [test_template] successfully"); expect(onDelete).toHaveBeenCalledTimes(1); }); userEvent.click(document.querySelector('[data-test-subj="moreAction"] button') as Element); userEvent.click(getByTestId("editAction")); await waitFor(() => expect(historyPushMock).toBeCalledTimes(1), { timeout: 3000, }); }, 30000); });