/* * Copyright OpenSearch Contributors * SPDX-License-Identifier: Apache-2.0 */ import React from "react"; import { render, waitFor } from "@testing-library/react"; import userEvent from "@testing-library/user-event"; import IndexForm, { IndexFormProps } from "./index"; import { ServicesContext } from "../../../../services"; import { browserServicesMock, coreServicesMock, apiCallerMock } from "../../../../../test/mocks"; import { IndicesUpdateMode } from "../../../../utils/constants"; import { CoreServicesContext } from "../../../../components/core_services"; function renderCreateIndexWithRouter(props: IndexFormProps) { return { ...render( ), }; } describe(" spec", () => { beforeEach(() => { apiCallerMock(browserServicesMock); }); it("show a toast if getIndices gracefully fails", async () => { const { findByText } = renderCreateIndexWithRouter({ index: "bad_index", }); await findByText("Update"); expect(coreServicesMock.notifications.toasts.addDanger).toHaveBeenCalledTimes(1); expect(coreServicesMock.notifications.toasts.addDanger).toHaveBeenCalledWith("bad_error"); }); it("shows error for index name input when clicking create", async () => { const { queryByText, getByText } = renderCreateIndexWithRouter({}); await waitFor(() => getByText("Define index")); expect(queryByText("Invalid index name.")).toBeNull(); userEvent.click(getByText("Create")); await waitFor(() => { expect(queryByText("Invalid index name.")).not.toBeNull(); }); }); it("routes you back to indices and shows a success toast when successfully creating a index", async () => { const { getByText, getByPlaceholderText, getByTestId } = renderCreateIndexWithRouter({}); await waitFor(() => { getByText("Define index"); }); const indexNameInput = getByPlaceholderText("Specify a name for the new index."); userEvent.type(indexNameInput, `bad_index`); userEvent.click(document.body); await waitFor(() => {}); userEvent.clear(indexNameInput); userEvent.type(indexNameInput, `good_index`); userEvent.click(document.body); await waitFor(() => expect(getByTestId("form-name-index.number_of_replicas").querySelector("input")).toHaveAttribute("value", "10")); userEvent.click(getByText("Create")); await waitFor(() => expect(coreServicesMock.notifications.toasts.addSuccess).toHaveBeenCalledWith("good_index has been successfully created.") ); }); it("shows a danger toast when getting graceful error from create index", async () => { const { getByText, getByPlaceholderText } = renderCreateIndexWithRouter({}); await waitFor(() => getByText("Define index")); userEvent.type(getByPlaceholderText("Specify a name for the new index."), `bad_index`); userEvent.click(getByText("Create")); await waitFor(() => expect(coreServicesMock.notifications.toasts.addDanger).toHaveBeenCalledWith("bad_index")); }); it("it shows detail and does not call any api when nothing modified", async () => { const { getByText } = renderCreateIndexWithRouter({ index: "good_index", }); await waitFor(() => getByText("Define index")); userEvent.click(getByText("Update")); await waitFor(() => { // it shows detail and does not call any api when nothing modified expect(browserServicesMock.commonService.apiCaller).toBeCalledTimes(2); }); }); it("shows detail info and update others", async () => { const { getByText, getByTestId, getByTitle } = renderCreateIndexWithRouter({ index: "good_index", }); await waitFor(() => getByText("Define index")); userEvent.click(getByTitle("update_test_1").querySelector("button") as Element); userEvent.type(getByTestId("comboBoxSearchInput"), "test_1{enter}"); userEvent.type(getByTestId("form-name-index.number_of_replicas").querySelector("input") as Element, "2"); userEvent.click(getByTestId("createIndexAddFieldButton")); await waitFor(() => {}); await userEvent.clear(getByTestId("mapping-visual-editor-1-field-name")); await userEvent.type(getByTestId("mapping-visual-editor-1-field-name"), "test_mapping_2"); await userEvent.click(document.body); userEvent.click(getByText("Update")); await waitFor(() => { expect(coreServicesMock.notifications.toasts.addSuccess).toBeCalledTimes(1); expect(browserServicesMock.commonService.apiCaller).toBeCalledWith({ endpoint: "indices.updateAliases", method: "PUT", data: { body: { actions: [ { remove: { index: "good_index", alias: "update_test_1", }, }, { add: { index: "good_index", alias: "test_1", }, }, ], }, }, }); expect(browserServicesMock.commonService.apiCaller).toBeCalledWith({ endpoint: "indices.putSettings", method: "PUT", data: { index: "good_index", flat_settings: true, body: { "index.number_of_replicas": "12", }, }, }); expect(browserServicesMock.commonService.apiCaller).toBeCalledWith({ endpoint: "indices.putMapping", method: "PUT", data: { index: "good_index", body: { properties: { test_mapping_2: { type: "text", }, }, }, }, }); }); }); it("shows detail alias and update alias only", async () => { const { getByText, getByTestId, getByTitle } = renderCreateIndexWithRouter({ index: "good_index", mode: IndicesUpdateMode.alias, }); await waitFor(() => {}); userEvent.click(getByTitle("update_test_1").querySelector("button") as Element); userEvent.type(getByTestId("comboBoxSearchInput"), "test_1{enter}"); await waitFor(() => {}); userEvent.click(getByText("Update")); await waitFor(() => { // shows detail alias and update alias only expect(coreServicesMock.notifications.toasts.addSuccess).toBeCalledTimes(1); expect(browserServicesMock.commonService.apiCaller).toBeCalledWith({ endpoint: "indices.updateAliases", method: "PUT", data: { body: { actions: [ { remove: { index: "good_index", alias: "update_test_1", }, }, { add: { index: "good_index", alias: "test_1", }, }, ], }, }, }); }); }); it("shows detail mappings and update mappings only", async () => { const { getByText, getByTestId } = renderCreateIndexWithRouter({ index: "good_index", mode: IndicesUpdateMode.mappings, }); await waitFor(() => {}); userEvent.click(getByTestId("createIndexAddFieldButton")); await waitFor(() => {}); await userEvent.clear(getByTestId("mapping-visual-editor-1-field-name")); await userEvent.type(getByTestId("mapping-visual-editor-1-field-name"), "test_mapping_2"); await userEvent.click(document.body); await waitFor(() => {}); userEvent.click(getByText("Update")); await waitFor(() => { expect(coreServicesMock.notifications.toasts.addSuccess).toBeCalledTimes(1); expect(browserServicesMock.commonService.apiCaller).toBeCalledWith({ endpoint: "indices.putMapping", method: "PUT", data: { index: "good_index", body: { properties: { test_mapping_2: { type: "text", }, }, }, }, }); }); }); it("shows detail settings and update settings only", async () => { const { getByText, getByTestId } = renderCreateIndexWithRouter({ index: "good_index", mode: IndicesUpdateMode.settings, }); await waitFor(() => {}); userEvent.type(getByTestId("form-name-index.number_of_replicas").querySelector("input") as Element, "2"); userEvent.click(getByText("Update")); await waitFor(() => { expect(coreServicesMock.notifications.toasts.addSuccess).toBeCalledTimes(1); expect(browserServicesMock.commonService.apiCaller).toBeCalledWith({ endpoint: "indices.putSettings", method: "PUT", data: { index: "good_index", flat_settings: true, body: { "index.number_of_replicas": "12", }, }, }); }); }); it("it triggers onCancel when click cancel", async () => { const onCancelMock = jest.fn(); const { getByText } = renderCreateIndexWithRouter({ index: "good_index", onCancel: onCancelMock, }); await waitFor(() => {}); userEvent.click(getByText("Cancel")); await (() => { expect(onCancelMock).toBeCalledTimes(1); expect(onCancelMock).toBeCalledWith(undefined); }); }); });