/* * Copyright OpenSearch Contributors * SPDX-License-Identifier: Apache-2.0 */ import React, { useRef } from "react"; import "@testing-library/jest-dom/extend-expect"; import { fireEvent, render, waitFor } from "@testing-library/react"; import JSONEditor, { IJSONEditorRef } from "./JSONEditor"; import { renderHook } from "@testing-library/react-hooks"; async function inputTextArea(props: { textareaInput: HTMLTextAreaElement; nowValue: string; newValue: string }) { const { textareaInput, nowValue, newValue } = props; const valueLength = nowValue.length; for (let i = 0; i < valueLength; i++) { await fireEvent( textareaInput, new KeyboardEvent("keydown", { keyCode: 40, }) ); } for (let i = 0; i < valueLength; i++) { await fireEvent( textareaInput, new KeyboardEvent("keydown", { keyCode: 8, }) ); } // try to input a non-json string textareaInput.value = newValue; fireEvent( textareaInput, new InputEvent("input", { data: newValue, }) ); } describe(" spec", () => { it("renders the component", () => { render(); // EuiOverlayMask appends an element to the body so we should have three (used to be two, after upgrading appears to have 3 now), an empty div from react-test-library // and our EuiOverlayMask element expect(document.body.children).toMatchSnapshot(); }); it("ref hook validate", async () => { const { result } = renderHook(() => { const refCorrect = useRef(null); const refError = useRef(null); render( <> ); return { refCorrect, refError, }; }); const { refCorrect, refError } = result.current; await waitFor(() => expect(refCorrect.current?.validate()).resolves.toEqual("")); await waitFor(() => expect(refError.current?.validate()).rejects.toEqual("Format validate error")); }); it("it do not trigger onBlur when readonly", async () => { const onChangeMock = jest.fn(); render(); const textareaInput = document.querySelector(".ace_text-input") as HTMLTextAreaElement; fireEvent.focus(textareaInput); fireEvent.blur(textareaInput); expect(onChangeMock).toBeCalledTimes(0); }); it("it triggers onChange when json is input", async () => { const onChangeMock = jest.fn(); const { getByTestId, getByText, findByText } = render(); const textareaInput = document.querySelector(".ace_text-input") as HTMLTextAreaElement; fireEvent.focus(textareaInput); await inputTextArea({ textareaInput, nowValue: (getByTestId("jsonEditor-valueDisplay") as HTMLTextAreaElement).value, newValue: '{ "test": "1", 123 }', }); fireEvent.blur(textareaInput); await findByText("Your input does not match the validation of json format, please fix the error line with error aside."); expect(onChangeMock).toBeCalledTimes(0); fireEvent.focus(textareaInput); await inputTextArea({ textareaInput, nowValue: (getByTestId("jsonEditor-valueDisplay") as HTMLTextAreaElement).value, newValue: '{ "test": "1" }', }); fireEvent.blur(textareaInput); await waitFor(() => { expect(onChangeMock).toBeCalledTimes(1); expect(onChangeMock).toBeCalledWith('{ "test": "1" }'); }); }); });