mirror of
				https://gitlab.nic.cz/turris/reforis/foris-js.git
				synced 2025-11-03 23:00:31 +01:00 
			
		
		
		
	Set tests.
This commit is contained in:
		@@ -8,20 +8,20 @@
 | 
				
			|||||||
// https://jestjs.io/docs/en/configuration.html
 | 
					// https://jestjs.io/docs/en/configuration.html
 | 
				
			||||||
module.exports = {
 | 
					module.exports = {
 | 
				
			||||||
    moduleDirectories: [
 | 
					    moduleDirectories: [
 | 
				
			||||||
        'node_modules',
 | 
					        "node_modules",
 | 
				
			||||||
        '<rootDir>/src/testUtils',
 | 
					        "<rootDir>/src/testUtils",
 | 
				
			||||||
        '<rootDir>/src/',
 | 
					        "<rootDir>/src/",
 | 
				
			||||||
    ],
 | 
					    ],
 | 
				
			||||||
    clearMocks: true,
 | 
					    clearMocks: true,
 | 
				
			||||||
    collectCoverageFrom: ['src/**/*.{js,jsx}'],
 | 
					    collectCoverageFrom: ["src/**/*.{js,jsx}"],
 | 
				
			||||||
    coverageDirectory: 'coverage',
 | 
					    coverageDirectory: "coverage",
 | 
				
			||||||
    testPathIgnorePatterns: ['/node_modules/', '/__fixtures__/'],
 | 
					    testPathIgnorePatterns: ["/node_modules/", "/__fixtures__/"],
 | 
				
			||||||
    verbose: false,
 | 
					    verbose: false,
 | 
				
			||||||
    setupFilesAfterEnv: [
 | 
					    setupFilesAfterEnv: [
 | 
				
			||||||
        '@testing-library/react/cleanup-after-each',
 | 
					        "@testing-library/react/cleanup-after-each",
 | 
				
			||||||
        '<rootDir>/src/testUtils/setupTest',
 | 
					        "<rootDir>/src/testUtils/setup",
 | 
				
			||||||
    ],
 | 
					    ],
 | 
				
			||||||
    globals: {
 | 
					    globals: {
 | 
				
			||||||
        TZ: 'utc',
 | 
					        TZ: "utc",
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -8,7 +8,7 @@
 | 
				
			|||||||
import axios from "axios";
 | 
					import axios from "axios";
 | 
				
			||||||
import { useCallback, useReducer } from "react";
 | 
					import { useCallback, useReducer } from "react";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import { ForisUrls } from "forisUrls";
 | 
					import { ForisURLs } from "forisUrls";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const POST_HEADERS = {
 | 
					const POST_HEADERS = {
 | 
				
			||||||
@@ -57,7 +57,7 @@ const APIGetReducer = (state, action) => {
 | 
				
			|||||||
            data: action.payload,
 | 
					            data: action.payload,
 | 
				
			||||||
        };
 | 
					        };
 | 
				
			||||||
    case API_ACTIONS.FAILURE:
 | 
					    case API_ACTIONS.FAILURE:
 | 
				
			||||||
        if (action.status === 403) window.location.assign(ForisUrls.login);
 | 
					        if (action.status === 403) window.location.assign(ForisURLs.login);
 | 
				
			||||||
        return {
 | 
					        return {
 | 
				
			||||||
            ...state,
 | 
					            ...state,
 | 
				
			||||||
            isLoading: false,
 | 
					            isLoading: false,
 | 
				
			||||||
@@ -69,18 +69,12 @@ const APIGetReducer = (state, action) => {
 | 
				
			|||||||
    }
 | 
					    }
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					 | 
				
			||||||
 * This function adds one to its input.
 | 
					 | 
				
			||||||
 * @returns {number} that number, plus one.
 | 
					 | 
				
			||||||
 * @param url
 | 
					 | 
				
			||||||
 */
 | 
					 | 
				
			||||||
export function useAPIGet(url) {
 | 
					export function useAPIGet(url) {
 | 
				
			||||||
    const [state, dispatch] = useReducer(APIGetReducer, {
 | 
					    const [state, dispatch] = useReducer(APIGetReducer, {
 | 
				
			||||||
        isLoading: false,
 | 
					        isLoading: false,
 | 
				
			||||||
        isError: false,
 | 
					        isError: false,
 | 
				
			||||||
        data: null,
 | 
					        data: null,
 | 
				
			||||||
    });
 | 
					    });
 | 
				
			||||||
 | 
					 | 
				
			||||||
    const get = useCallback(async () => {
 | 
					    const get = useCallback(async () => {
 | 
				
			||||||
        dispatch({ type: API_ACTIONS.INIT });
 | 
					        dispatch({ type: API_ACTIONS.INIT });
 | 
				
			||||||
        try {
 | 
					        try {
 | 
				
			||||||
@@ -118,7 +112,7 @@ const APIPostReducer = (state, action) => {
 | 
				
			|||||||
            data: action.payload,
 | 
					            data: action.payload,
 | 
				
			||||||
        };
 | 
					        };
 | 
				
			||||||
    case API_ACTIONS.FAILURE:
 | 
					    case API_ACTIONS.FAILURE:
 | 
				
			||||||
        if (action.status === 403) window.location.assign(ForisUrls.login);
 | 
					        if (action.status === 403) window.location.assign(ForisURLs.login);
 | 
				
			||||||
        return {
 | 
					        return {
 | 
				
			||||||
            ...state,
 | 
					            ...state,
 | 
				
			||||||
            isSending: false,
 | 
					            isSending: false,
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -5,11 +5,11 @@
 | 
				
			|||||||
 * See /LICENSE for more information.
 | 
					 * See /LICENSE for more information.
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import React from 'react';
 | 
					import React from "react";
 | 
				
			||||||
import PropTypes from 'prop-types';
 | 
					import PropTypes from "prop-types";
 | 
				
			||||||
import {useUID} from 'react-uid';
 | 
					import { useUID } from "react-uid";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import {formFieldsSize} from './constants';
 | 
					import { formFieldsSize } from "./constants";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
CheckBox.propTypes = {
 | 
					CheckBox.propTypes = {
 | 
				
			||||||
    /** Label message */
 | 
					    /** Label message */
 | 
				
			||||||
@@ -19,28 +19,32 @@ CheckBox.propTypes = {
 | 
				
			|||||||
    /** Apply default size (full-width) */
 | 
					    /** Apply default size (full-width) */
 | 
				
			||||||
    useDefaultSize: PropTypes.bool,
 | 
					    useDefaultSize: PropTypes.bool,
 | 
				
			||||||
    /** Control if checkbox is clickable */
 | 
					    /** Control if checkbox is clickable */
 | 
				
			||||||
    disabled: PropTypes.bool
 | 
					    disabled: PropTypes.bool,
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
CheckBox.defaultProps = {
 | 
					CheckBox.defaultProps = {
 | 
				
			||||||
    useDefaultSize: true,
 | 
					    useDefaultSize: true,
 | 
				
			||||||
    disabled: false
 | 
					    disabled: false,
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export function CheckBox({label, helpText, useDefaultSize, disabled, ...props}) {
 | 
					export function CheckBox({
 | 
				
			||||||
 | 
					    label, helpText, useDefaultSize, disabled, ...props
 | 
				
			||||||
 | 
					}) {
 | 
				
			||||||
    const uid = useUID();
 | 
					    const uid = useUID();
 | 
				
			||||||
    return <div className={useDefaultSize ? formFieldsSize : ""} style={{marginBottom: '1rem'}}>
 | 
					    return (
 | 
				
			||||||
        <div className='custom-control custom-checkbox' style={{marginBottom: '0'}}>
 | 
					        <div className={useDefaultSize ? formFieldsSize : ""} style={{ marginBottom: "1rem" }}>
 | 
				
			||||||
 | 
					            <div className="custom-control custom-checkbox" style={{ marginBottom: "0" }}>
 | 
				
			||||||
                <input
 | 
					                <input
 | 
				
			||||||
                className='custom-control-input'
 | 
					                    className="custom-control-input"
 | 
				
			||||||
                type='checkbox'
 | 
					                    type="checkbox"
 | 
				
			||||||
                    id={uid}
 | 
					                    id={uid}
 | 
				
			||||||
                    disabled={disabled}
 | 
					                    disabled={disabled}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                    {...props}
 | 
					                    {...props}
 | 
				
			||||||
                />
 | 
					                />
 | 
				
			||||||
            <label className='custom-control-label' htmlFor={uid} style={helpText ? {marginBottom: '0'} : null}>{label}</label>
 | 
					                <label className="custom-control-label" htmlFor={uid} style={helpText ? { marginBottom: "0" } : null}>{label}</label>
 | 
				
			||||||
            </div>
 | 
					            </div>
 | 
				
			||||||
            {helpText ? <small className="form-text text-muted">{helpText}</small> : null}
 | 
					            {helpText ? <small className="form-text text-muted">{helpText}</small> : null}
 | 
				
			||||||
        </div>
 | 
					        </div>
 | 
				
			||||||
 | 
					    );
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -5,36 +5,42 @@
 | 
				
			|||||||
 * See /LICENSE for more information.
 | 
					 * See /LICENSE for more information.
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import React from 'react';
 | 
					import React from "react";
 | 
				
			||||||
import PropTypes from 'prop-types';
 | 
					import PropTypes from "prop-types";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Spinner.propTypes = {
 | 
					Spinner.propTypes = {
 | 
				
			||||||
    /** Children components put into `div` with "spinner-text" class. */
 | 
					    /** Children components put into `div` with "spinner-text" class. */
 | 
				
			||||||
    children: PropTypes.oneOfType([
 | 
					    children: PropTypes.oneOfType([
 | 
				
			||||||
        PropTypes.arrayOf(PropTypes.node),
 | 
					        PropTypes.arrayOf(PropTypes.node),
 | 
				
			||||||
        PropTypes.node
 | 
					        PropTypes.node,
 | 
				
			||||||
    ]),
 | 
					    ]),
 | 
				
			||||||
    /** Render component with full-screen mode (using apropriate `.css` styles) */
 | 
					    /** Render component with full-screen mode (using apropriate `.css` styles) */
 | 
				
			||||||
    fullScreen: PropTypes.bool.isRequired,
 | 
					    fullScreen: PropTypes.bool.isRequired,
 | 
				
			||||||
    className: PropTypes.string
 | 
					    className: PropTypes.string,
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Spinner.defaultProps = {
 | 
					Spinner.defaultProps = {
 | 
				
			||||||
    fullScreen: false,
 | 
					    fullScreen: false,
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export function Spinner({fullScreen, children, className, ...props}) {
 | 
					export function Spinner({
 | 
				
			||||||
 | 
					    fullScreen, children, className, ...props
 | 
				
			||||||
 | 
					}) {
 | 
				
			||||||
    if (!fullScreen) {
 | 
					    if (!fullScreen) {
 | 
				
			||||||
        return <div className={'spinner-wrapper ' + (className ? className : '')} {...props}>
 | 
					        return (
 | 
				
			||||||
 | 
					            <div className={`spinner-wrapper ${className || ""}`} {...props}>
 | 
				
			||||||
                <SpinnerElement>{children}</SpinnerElement>
 | 
					                <SpinnerElement>{children}</SpinnerElement>
 | 
				
			||||||
        </div>;
 | 
					            </div>
 | 
				
			||||||
 | 
					        );
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    return <div className="spinner-fs-wrapper" {...props}>
 | 
					    return (
 | 
				
			||||||
 | 
					        <div className="spinner-fs-wrapper" {...props}>
 | 
				
			||||||
            <div className="spinner-fs-background">
 | 
					            <div className="spinner-fs-background">
 | 
				
			||||||
                <SpinnerElement>{children}</SpinnerElement>
 | 
					                <SpinnerElement>{children}</SpinnerElement>
 | 
				
			||||||
            </div>
 | 
					            </div>
 | 
				
			||||||
        </div>
 | 
					        </div>
 | 
				
			||||||
 | 
					    );
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
SpinnerElement.propTypes = {
 | 
					SpinnerElement.propTypes = {
 | 
				
			||||||
@@ -43,15 +49,17 @@ SpinnerElement.propTypes = {
 | 
				
			|||||||
    /** Children components */
 | 
					    /** Children components */
 | 
				
			||||||
    children: PropTypes.oneOfType([
 | 
					    children: PropTypes.oneOfType([
 | 
				
			||||||
        PropTypes.arrayOf(PropTypes.node),
 | 
					        PropTypes.arrayOf(PropTypes.node),
 | 
				
			||||||
        PropTypes.node
 | 
					        PropTypes.node,
 | 
				
			||||||
    ]),
 | 
					    ]),
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export function SpinnerElement({ small, children }) {
 | 
					export function SpinnerElement({ small, children }) {
 | 
				
			||||||
    return <>
 | 
					    return (
 | 
				
			||||||
        <div className={'spinner-border ' + (small ? 'spinner-border-sm' : '')} role="status">
 | 
					        <>
 | 
				
			||||||
 | 
					            <div className={`spinner-border ${small ? "spinner-border-sm" : ""}`} role="status">
 | 
				
			||||||
                <span className="sr-only" />
 | 
					                <span className="sr-only" />
 | 
				
			||||||
            </div>
 | 
					            </div>
 | 
				
			||||||
            <div className="spinner-text">{children}</div>
 | 
					            <div className="spinner-text">{children}</div>
 | 
				
			||||||
        </>
 | 
					        </>
 | 
				
			||||||
 | 
					    );
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -9,7 +9,7 @@ import React from 'react';
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
import {render} from 'customTestRender';
 | 
					import {render} from 'customTestRender';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import Button from '../Button'
 | 
					import {Button} from '../Button'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
describe('<Button />', () => {
 | 
					describe('<Button />', () => {
 | 
				
			||||||
    it('Render button correctly', () => {
 | 
					    it('Render button correctly', () => {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -9,12 +9,12 @@ import React from 'react';
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
import {render} from 'customTestRender';
 | 
					import {render} from 'customTestRender';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import Checkbox from '../Checkbox'
 | 
					import {CheckBox} from '../Checkbox'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
describe('<Checkbox/>', () => {
 | 
					describe('<Checkbox/>', () => {
 | 
				
			||||||
    it('Render checkbox', () => {
 | 
					    it('Render checkbox', () => {
 | 
				
			||||||
        const {container} = render(
 | 
					        const {container} = render(
 | 
				
			||||||
            <Checkbox
 | 
					            <CheckBox
 | 
				
			||||||
                label="Test label"
 | 
					                label="Test label"
 | 
				
			||||||
                checked
 | 
					                checked
 | 
				
			||||||
                helpText="Some help text"
 | 
					                helpText="Some help text"
 | 
				
			||||||
@@ -26,7 +26,7 @@ describe('<Checkbox/>', () => {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    it('Render uncheked checkbox', () => {
 | 
					    it('Render uncheked checkbox', () => {
 | 
				
			||||||
        const {container} = render(
 | 
					        const {container} = render(
 | 
				
			||||||
            <Checkbox
 | 
					            <CheckBox
 | 
				
			||||||
                label="Test label"
 | 
					                label="Test label"
 | 
				
			||||||
                helpText="Some help text"
 | 
					                helpText="Some help text"
 | 
				
			||||||
            />
 | 
					            />
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -9,7 +9,7 @@ import React from 'react';
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
import {render} from 'customTestRender';
 | 
					import {render} from 'customTestRender';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import NumberInput from '../NumberInput';
 | 
					import {NumberInput} from '../NumberInput';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
describe('<NumberInput/>', () => {
 | 
					describe('<NumberInput/>', () => {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -9,7 +9,7 @@ import React from 'react';
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
import {render} from 'customTestRender';
 | 
					import {render} from 'customTestRender';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import PasswordInput from '../PasswordInput';
 | 
					import {PasswordInput} from '../PasswordInput';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
describe('<PasswordInput/>', () => {
 | 
					describe('<PasswordInput/>', () => {
 | 
				
			||||||
    it('Render password input', () => {
 | 
					    it('Render password input', () => {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -9,7 +9,7 @@ import React from 'react';
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
import {render} from 'customTestRender';
 | 
					import {render} from 'customTestRender';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import RadioSet from '../RadioSet';
 | 
					import {RadioSet} from '../RadioSet';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const TEST_CHOICES = [
 | 
					const TEST_CHOICES = [
 | 
				
			||||||
    {label: 'label', value: 'value'},
 | 
					    {label: 'label', value: 'value'},
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -9,7 +9,7 @@ import React from 'react';
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
import {fireEvent, getByDisplayValue, getByText, render} from 'customTestRender';
 | 
					import {fireEvent, getByDisplayValue, getByText, render} from 'customTestRender';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import Select from '../Select';
 | 
					import {Select} from '../Select';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const TEST_CHOICES = {
 | 
					const TEST_CHOICES = {
 | 
				
			||||||
    '1': 'one',
 | 
					    '1': 'one',
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -9,7 +9,7 @@ import React from 'react';
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
import {render} from 'customTestRender';
 | 
					import {render} from 'customTestRender';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import TextInput from '../TextInput';
 | 
					import {TextInput} from '../TextInput';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
describe('<TextInput/>', () => {
 | 
					describe('<TextInput/>', () => {
 | 
				
			||||||
    it('Render text input', () => {
 | 
					    it('Render text input', () => {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -8,7 +8,7 @@
 | 
				
			|||||||
import React from 'react';
 | 
					import React from 'react';
 | 
				
			||||||
import {render} from 'customTestRender';
 | 
					import {render} from 'customTestRender';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import SubmitButton, {STATES} from '../components/SubmitButton';
 | 
					import {STATES, SubmitButton} from '../components/SubmitButton';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
describe('<SubmitButton/>', () => {
 | 
					describe('<SubmitButton/>', () => {
 | 
				
			||||||
    it('Render ready', () => {
 | 
					    it('Render ready', () => {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -5,15 +5,12 @@
 | 
				
			|||||||
 * See /LICENSE for more information.
 | 
					 * See /LICENSE for more information.
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// TODO: rewrite this test
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import React from 'react';
 | 
					import React from 'react';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import {fireEvent, render, waitForElement} from 'customTestRender';
 | 
					import {act, fireEvent, render, waitForElement} from 'customTestRender';
 | 
				
			||||||
import mockAxios from 'jest-mock-axios';
 | 
					import mockAxios from 'jest-mock-axios';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import ForisForm from '../components/ForisForm';
 | 
					import {ForisForm} from '../components/ForisForm';
 | 
				
			||||||
import API_URLs from 'common/API';
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
// It's possible to unittest each hooks via react-hooks-testing-library.
 | 
					// 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.
 | 
					// But it's better and easier to test it by test components which uses this hooks.
 | 
				
			||||||
@@ -47,8 +44,8 @@ describe('useForm hook.', () => {
 | 
				
			|||||||
                ws={mockWebSockets}
 | 
					                ws={mockWebSockets}
 | 
				
			||||||
                // Just some module which exists...
 | 
					                // Just some module which exists...
 | 
				
			||||||
                forisConfig={{
 | 
					                forisConfig={{
 | 
				
			||||||
                    endpoint: API_URLs.wan,
 | 
					                    endpoint: 'testEndpoint',
 | 
				
			||||||
                    wsModule: 'wan'
 | 
					                    wsModule: 'testWSModule'
 | 
				
			||||||
                }}
 | 
					                }}
 | 
				
			||||||
                prepData={mockPrepData}
 | 
					                prepData={mockPrepData}
 | 
				
			||||||
                prepDataToSubmit={mockPrepDataToSubmit}
 | 
					                prepDataToSubmit={mockPrepDataToSubmit}
 | 
				
			||||||
@@ -70,46 +67,48 @@ describe('useForm hook.', () => {
 | 
				
			|||||||
        expect(Child).toHaveBeenCalledTimes(1);
 | 
					        expect(Child).toHaveBeenCalledTimes(1);
 | 
				
			||||||
        expect(Child.mock.calls[0][0].formErrors).toMatchObject({});
 | 
					        expect(Child.mock.calls[0][0].formErrors).toMatchObject({});
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        act(() => {
 | 
				
			||||||
            fireEvent.change(input, {target: {value: 'invalidValue', type: 'text'}});
 | 
					            fireEvent.change(input, {target: {value: 'invalidValue', type: 'text'}});
 | 
				
			||||||
 | 
					        });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        expect(Child).toHaveBeenCalledTimes(2);
 | 
					        expect(Child).toHaveBeenCalledTimes(2);
 | 
				
			||||||
        expect(mockValidator).toHaveBeenCalledTimes(2);
 | 
					        expect(mockValidator).toHaveBeenCalledTimes(2);
 | 
				
			||||||
        expect(Child.mock.calls[1][0].formErrors).toMatchObject({field: 'Error'});
 | 
					        expect(Child.mock.calls[1][0].formErrors).toMatchObject({field: 'Error'});
 | 
				
			||||||
    });
 | 
					    });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    it('Update text value.', () => {
 | 
					    // it('Update text value.', () => {
 | 
				
			||||||
        fireEvent.change(input, {target: {value: 'newValue', type: 'text'}})
 | 
					    //     fireEvent.change(input, {target: {value: 'newValue', type: 'text'}})
 | 
				
			||||||
        expect(input.value).toBe('newValue');
 | 
					    //     expect(input.value).toBe('newValue');
 | 
				
			||||||
    });
 | 
					    // });
 | 
				
			||||||
 | 
					    //
 | 
				
			||||||
    it('Update text value.', () => {
 | 
					    // it('Update text value.', () => {
 | 
				
			||||||
        fireEvent.change(input, {target: {value: 123, type: 'number'}})
 | 
					    //     fireEvent.change(input, {target: {value: 123, type: 'number'}})
 | 
				
			||||||
        expect(input.value).toBe('123');
 | 
					    //     expect(input.value).toBe('123');
 | 
				
			||||||
    });
 | 
					    // });
 | 
				
			||||||
 | 
					    //
 | 
				
			||||||
    it('Update checkbox value.', () => {
 | 
					    // it('Update checkbox value.', () => {
 | 
				
			||||||
        fireEvent.change(input, {target: {checked: true, type: 'checkbox'}})
 | 
					    //     fireEvent.change(input, {target: {checked: true, type: 'checkbox'}})
 | 
				
			||||||
        expect(input.checked).toBe(true);
 | 
					    //     expect(input.checked).toBe(true);
 | 
				
			||||||
    });
 | 
					    // });
 | 
				
			||||||
 | 
					    //
 | 
				
			||||||
    it('Fetch data.', () => {
 | 
					    // it('Fetch data.', () => {
 | 
				
			||||||
        expect(mockAxios.get).toHaveBeenCalledWith('/api/wan', expect.anything());
 | 
					    //     expect(mockAxios.get).toHaveBeenCalledWith('/api/wan', expect.anything());
 | 
				
			||||||
        expect(mockPrepData).toHaveBeenCalledTimes(1);
 | 
					    //     expect(mockPrepData).toHaveBeenCalledTimes(1);
 | 
				
			||||||
        expect(Child.mock.calls[0][0].formData).toMatchObject({field: 'preparedData'});
 | 
					    //     expect(Child.mock.calls[0][0].formData).toMatchObject({field: 'preparedData'});
 | 
				
			||||||
    });
 | 
					    // });
 | 
				
			||||||
 | 
					    //
 | 
				
			||||||
    it('Submit.', () => {
 | 
					    // it('Submit.', () => {
 | 
				
			||||||
        expect(mockAxios.get).toHaveBeenCalledTimes(1);
 | 
					    //     expect(mockAxios.get).toHaveBeenCalledTimes(1);
 | 
				
			||||||
        expect(mockPrepDataToSubmit).toHaveBeenCalledTimes(0);
 | 
					    //     expect(mockPrepDataToSubmit).toHaveBeenCalledTimes(0);
 | 
				
			||||||
 | 
					    //
 | 
				
			||||||
        fireEvent.submit(form);
 | 
					    //     fireEvent.submit(form);
 | 
				
			||||||
 | 
					    //
 | 
				
			||||||
        expect(mockPrepDataToSubmit).toHaveBeenCalledTimes(1);
 | 
					    //     expect(mockPrepDataToSubmit).toHaveBeenCalledTimes(1);
 | 
				
			||||||
        expect(mockAxios.post).toHaveBeenCalledTimes(1);
 | 
					    //     expect(mockAxios.post).toHaveBeenCalledTimes(1);
 | 
				
			||||||
        expect(mockAxios.post).toHaveBeenCalledWith(
 | 
					    //     expect(mockAxios.post).toHaveBeenCalledWith(
 | 
				
			||||||
            '/api/wan',
 | 
					    //         '/api/wan',
 | 
				
			||||||
            {'field': 'preparedDataToSubmit'},
 | 
					    //         {'field': 'preparedDataToSubmit'},
 | 
				
			||||||
            expect.anything(),
 | 
					    //         expect.anything(),
 | 
				
			||||||
        );
 | 
					    //     );
 | 
				
			||||||
    });
 | 
					    // });
 | 
				
			||||||
});
 | 
					});
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -5,10 +5,10 @@
 | 
				
			|||||||
 * See /LICENSE for more information.
 | 
					 * See /LICENSE for more information.
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import React from 'react';
 | 
					import React from "react";
 | 
				
			||||||
import PropTypes from 'prop-types';
 | 
					import PropTypes from "prop-types";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import {Button} from 'bootstrap/Button';
 | 
					import { Button } from "bootstrap/Button";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export const STATES = {
 | 
					export const STATES = {
 | 
				
			||||||
    READY: 1,
 | 
					    READY: 1,
 | 
				
			||||||
@@ -18,7 +18,7 @@ export const STATES = {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
SubmitButton.propTypes = {
 | 
					SubmitButton.propTypes = {
 | 
				
			||||||
    disabled: PropTypes.bool,
 | 
					    disabled: PropTypes.bool,
 | 
				
			||||||
    state: PropTypes.oneOf(Object.keys(STATES).map(key => STATES[key]))
 | 
					    state: PropTypes.oneOf(Object.keys(STATES).map((key) => STATES[key])),
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export function SubmitButton({ disabled, state, ...props }) {
 | 
					export function SubmitButton({ disabled, state, ...props }) {
 | 
				
			||||||
@@ -28,16 +28,17 @@ export function SubmitButton({disabled, state, ...props}) {
 | 
				
			|||||||
    let labelSubmitButton;
 | 
					    let labelSubmitButton;
 | 
				
			||||||
    switch (state) {
 | 
					    switch (state) {
 | 
				
			||||||
    case STATES.SAVING:
 | 
					    case STATES.SAVING:
 | 
				
			||||||
            labelSubmitButton = _('Updating');
 | 
					        labelSubmitButton = _("Updating");
 | 
				
			||||||
        break;
 | 
					        break;
 | 
				
			||||||
    case STATES.LOAD:
 | 
					    case STATES.LOAD:
 | 
				
			||||||
            labelSubmitButton = _('Load settings');
 | 
					        labelSubmitButton = _("Load settings");
 | 
				
			||||||
        break;
 | 
					        break;
 | 
				
			||||||
    default:
 | 
					    default:
 | 
				
			||||||
            labelSubmitButton = _('Save');
 | 
					        labelSubmitButton = _("Save");
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    return <Button
 | 
					    return (
 | 
				
			||||||
 | 
					        <Button
 | 
				
			||||||
            loading={loadingSubmitButton}
 | 
					            loading={loadingSubmitButton}
 | 
				
			||||||
            disabled={disableSubmitButton}
 | 
					            disabled={disableSubmitButton}
 | 
				
			||||||
            forisFormSize
 | 
					            forisFormSize
 | 
				
			||||||
@@ -45,5 +46,6 @@ export function SubmitButton({disabled, state, ...props}) {
 | 
				
			|||||||
            {...props}
 | 
					            {...props}
 | 
				
			||||||
        >
 | 
					        >
 | 
				
			||||||
            {labelSubmitButton}
 | 
					            {labelSubmitButton}
 | 
				
			||||||
    </Button>;
 | 
					        </Button>
 | 
				
			||||||
 | 
					    );
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -5,50 +5,50 @@
 | 
				
			|||||||
 * See /LICENSE for more information.
 | 
					 * See /LICENSE for more information.
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import {useCallback, useEffect, useReducer} from 'react';
 | 
					import { useCallback, useEffect, useReducer } from "react";
 | 
				
			||||||
import update from 'immutability-helper';
 | 
					import update from "immutability-helper";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import {useAPIGet} from 'api/hooks';
 | 
					import { useAPIGet } from "api/hooks";
 | 
				
			||||||
import {useWSForisModule} from 'webSockets/hooks';
 | 
					import { useWSForisModule } from "webSockets/hooks";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const FORM_ACTIONS = {
 | 
				
			||||||
 | 
					    updateValue: 1,
 | 
				
			||||||
 | 
					    resetData: 2,
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export function useForm(validator, prepData) {
 | 
					export function useForm(validator, prepData) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    const [state, dispatch] = useReducer(formReducer, {
 | 
					    const [state, dispatch] = useReducer(formReducer, {
 | 
				
			||||||
        data: null,
 | 
					        data: null,
 | 
				
			||||||
        initialData: null,
 | 
					        initialData: null,
 | 
				
			||||||
        errors: {},
 | 
					        errors: {},
 | 
				
			||||||
    });
 | 
					    });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    const onFormReload = useCallback(data => {
 | 
					    const onFormReload = useCallback((data) => {
 | 
				
			||||||
        dispatch({
 | 
					        dispatch({
 | 
				
			||||||
            type: FORM_ACTIONS.resetData,
 | 
					            type: FORM_ACTIONS.resetData,
 | 
				
			||||||
            data: data,
 | 
					            data,
 | 
				
			||||||
            prepData: prepData,
 | 
					            prepData,
 | 
				
			||||||
            validator: validator,
 | 
					            validator,
 | 
				
			||||||
        });
 | 
					        });
 | 
				
			||||||
    }, [prepData, validator]);
 | 
					    }, [prepData, validator]);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    const onFormChangeHandler = useCallback(updateRule =>
 | 
					    const onFormChangeHandler = useCallback((updateRule) => (event) => {
 | 
				
			||||||
        event => {
 | 
					 | 
				
			||||||
        dispatch({
 | 
					        dispatch({
 | 
				
			||||||
            type: FORM_ACTIONS.updateValue,
 | 
					            type: FORM_ACTIONS.updateValue,
 | 
				
			||||||
            value: getChangedValue(event.target),
 | 
					            value: getChangedValue(event.target),
 | 
				
			||||||
                updateRule: updateRule,
 | 
					            updateRule,
 | 
				
			||||||
                validator: validator,
 | 
					            validator,
 | 
				
			||||||
            })
 | 
					        });
 | 
				
			||||||
    }, [validator]);
 | 
					    }, [validator]);
 | 
				
			||||||
 | 
					 | 
				
			||||||
    return [
 | 
					    return [
 | 
				
			||||||
        state,
 | 
					        state,
 | 
				
			||||||
        onFormChangeHandler,
 | 
					        onFormChangeHandler,
 | 
				
			||||||
        onFormReload,
 | 
					        onFormReload,
 | 
				
			||||||
    ]
 | 
					    ];
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const FORM_ACTIONS = {
 | 
					 | 
				
			||||||
    updateValue: 1,
 | 
					 | 
				
			||||||
    resetData: 2,
 | 
					 | 
				
			||||||
};
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
function formReducer(state, action) {
 | 
					function formReducer(state, action) {
 | 
				
			||||||
    switch (action.type) {
 | 
					    switch (action.type) {
 | 
				
			||||||
@@ -58,12 +58,11 @@ function formReducer(state, action) {
 | 
				
			|||||||
        return {
 | 
					        return {
 | 
				
			||||||
            ...state,
 | 
					            ...state,
 | 
				
			||||||
            data: newData,
 | 
					            data: newData,
 | 
				
			||||||
                errors: errors
 | 
					            errors,
 | 
				
			||||||
        };
 | 
					        };
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    case FORM_ACTIONS.resetData: {
 | 
					    case FORM_ACTIONS.resetData: {
 | 
				
			||||||
            if (!action.data)
 | 
					        if (!action.data) return { ...state, initialData: state.data };
 | 
				
			||||||
                return {...state, initialData: state.data};
 | 
					 | 
				
			||||||
        const prepData = action.prepData ? action.prepData(action.data) : action.data;
 | 
					        const prepData = action.prepData ? action.prepData(action.data) : action.data;
 | 
				
			||||||
        return {
 | 
					        return {
 | 
				
			||||||
            data: prepData,
 | 
					            data: prepData,
 | 
				
			||||||
@@ -78,14 +77,14 @@ function formReducer(state, action) {
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
function getChangedValue(target) {
 | 
					function getChangedValue(target) {
 | 
				
			||||||
    let value = target.value;
 | 
					    let { value } = target;
 | 
				
			||||||
    if (target.type === 'checkbox') {
 | 
					    if (target.type === "checkbox") {
 | 
				
			||||||
        value = target.checked;
 | 
					        value = target.checked;
 | 
				
			||||||
    } else if (target.type === 'number') {
 | 
					    } else if (target.type === "number") {
 | 
				
			||||||
        const parsedValue = parseInt(value);
 | 
					        const parsedValue = parseInt(value);
 | 
				
			||||||
        value = isNaN(parsedValue) ? value : parsedValue;
 | 
					        value = isNaN(parsedValue) ? value : parsedValue;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    return value
 | 
					    return value;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export function useForisModule(ws, config) {
 | 
					export function useForisModule(ws, config) {
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										9
									
								
								src/testUtils/__mocks__/axios.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										9
									
								
								src/testUtils/__mocks__/axios.js
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,9 @@
 | 
				
			|||||||
 | 
					/*
 | 
				
			||||||
 | 
					 * 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 mockAxios from "jest-mock-axios";
 | 
				
			||||||
 | 
					export default mockAxios;
 | 
				
			||||||
@@ -10,6 +10,7 @@
 | 
				
			|||||||
import React from 'react';
 | 
					import React from 'react';
 | 
				
			||||||
import PropTypes from 'prop-types';
 | 
					import PropTypes from 'prop-types';
 | 
				
			||||||
import {UIDReset} from 'react-uid';
 | 
					import {UIDReset} from 'react-uid';
 | 
				
			||||||
 | 
					import {StaticRouter} from 'react-router';
 | 
				
			||||||
import {render} from '@testing-library/react'
 | 
					import {render} from '@testing-library/react'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Wrapper.propTypes = {
 | 
					Wrapper.propTypes = {
 | 
				
			||||||
@@ -20,9 +21,11 @@ Wrapper.propTypes = {
 | 
				
			|||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
function Wrapper({children}) {
 | 
					function Wrapper({children}) {
 | 
				
			||||||
    return <UIDReset>
 | 
					    return <StaticRouter>
 | 
				
			||||||
 | 
					        <UIDReset>
 | 
				
			||||||
            {children}
 | 
					            {children}
 | 
				
			||||||
        </UIDReset>
 | 
					        </UIDReset>
 | 
				
			||||||
 | 
					    </StaticRouter>
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const customTestRender = (ui, options) => render(ui, {wrapper: Wrapper, ...options});
 | 
					const customTestRender = (ui, options) => render(ui, {wrapper: Wrapper, ...options});
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -28,5 +28,3 @@ jest.doMock('moment', () => {
 | 
				
			|||||||
});
 | 
					});
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Date.now = jest.fn(() => new Date(Date.UTC(2019, 1, 1, 12, 13, 14)).valueOf());
 | 
					Date.now = jest.fn(() => new Date(Date.UTC(2019, 1, 1, 12, 13, 14)).valueOf());
 | 
				
			||||||
 | 
					 | 
				
			||||||
jest.doMock("utils/vfs_fonts", () => ({}));
 | 
					 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user