/*
* Copyright (C) 2019 CZ.NIC z.s.p.o. (http://www.nic.cz/)
*
* This is free software, licensed under the GNU General Public License v3.
* See /LICENSE for more information.
*/
import React from "react";
import { act, fireEvent, render, waitForElement } from "customTestRender";
import mockAxios from "jest-mock-axios";
import WebSockets from "webSockets/WebSockets";
import ForisForm from "../components/ForisForm";
// It's possible to unittest each hooks via react-hooks-testing-library.
// But it's better and easier to test it by test components which uses this hooks.
const TestForm = ({ formData, formErrors, setFormValue }) => (
<>
({ field: { $set: value } }))}
/>
{formErrors.field}
>
);
describe("useForm hook.", () => {
let mockValidator;
let mockPrepData;
let mockPrepDataToSubmit;
let input;
let form;
const Child = jest.fn((props) => );
beforeEach(async () => {
mockPrepData = jest.fn(() => ({ field: "preparedData" }));
mockPrepDataToSubmit = jest.fn(() => ({
field: "preparedDataToSubmit",
}));
mockValidator = jest.fn((data) =>
data.field === "invalidValue" ? { field: "Error" } : {}
);
const { getByTestId, container } = render(
);
mockAxios.mockResponse({ field: "fetchedData" });
input = await waitForElement(() => getByTestId("test-input"));
form = container.firstChild.firstChild;
});
it("Validation on changing.", () => {
expect(mockValidator).toHaveBeenCalledTimes(1);
expect(Child).toHaveBeenCalledTimes(1);
expect(Child.mock.calls[0][0].formErrors).toMatchObject({});
act(() => {
fireEvent.change(input, {
target: { value: "invalidValue", type: "text" },
});
});
expect(Child).toHaveBeenCalledTimes(2);
expect(mockValidator).toHaveBeenCalledTimes(2);
expect(Child.mock.calls[1][0].formErrors).toMatchObject({
field: "Error",
});
});
it("Update text value.", () => {
fireEvent.change(input, {
target: { value: "newValue", type: "text" },
});
expect(input.value).toBe("newValue");
});
it("Update text value.", () => {
fireEvent.change(input, { target: { value: 123, type: "number" } });
expect(input.value).toBe("123");
});
it("Update checkbox value.", () => {
fireEvent.change(input, {
target: { checked: true, type: "checkbox" },
});
expect(input.checked).toBe(true);
});
it("Fetch data.", () => {
expect(mockAxios.get).toHaveBeenCalledWith(
"testEndpoint",
expect.anything()
);
expect(mockPrepData).toHaveBeenCalledTimes(1);
expect(Child.mock.calls[0][0].formData).toMatchObject({
field: "preparedData",
});
});
it("Submit.", () => {
expect(mockAxios.get).toHaveBeenCalledTimes(1);
expect(mockPrepDataToSubmit).toHaveBeenCalledTimes(0);
fireEvent.submit(form);
expect(mockPrepDataToSubmit).toHaveBeenCalledTimes(1);
expect(mockAxios.post).toHaveBeenCalledTimes(1);
expect(mockAxios.post).toHaveBeenCalledWith(
"testEndpoint",
{ field: "preparedDataToSubmit" },
expect.anything()
);
});
});