import { mount } from 'enzyme'; import React from 'react'; import { asyncMessage, errorMessage, infoMessage, messageMessage, successMessage, warningMessage } from './categories'; import type { IValidationData } from './useValidationData'; import { useValidationData } from './useValidationData'; interface IComponentProps { validationMessage: React.ReactNode; touched: boolean; callback: Function; } describe('useValidationData hook', () => { function Component({ validationMessage, touched, callback }: IComponentProps) { callback(useValidationData(validationMessage, touched)); return <>; } function runUseValidationDataHook(validationMessage?: React.ReactNode, touched = true): IValidationData { let ran = false; let data = null; const callback = (result: IValidationData) => { if (ran) { throw new Error('already ran'); } data = result; ran = true; }; mount(); if (!ran) { throw new Error('Callback never ran'); } return data; } it('should default to error category', () => { const data = runUseValidationDataHook('Test'); expect(data.messageNode).toBe('Test'); expect(data.category).toBe('error'); }); it('should pass JSX.Element nodes through, with category: null and hidden: false', () => { const element =
; const data = runUseValidationDataHook(element); expect(data.messageNode).toBe(element); expect(data.category).toBeNull(); expect(data.hidden).toBe(false); }); it('should pass non-JSX.Element/non-string nodes through, with category: null and hidden: true', () => { const element = { foo: 'bar', baz: [1] }; const data = runUseValidationDataHook(element); expect(data.messageNode).toBe(element); expect(data.category).toBeNull(); expect(data.hidden).toBe(true); }); it('should return async category when asyncMessage is provided', () => { const data = runUseValidationDataHook(asyncMessage('Test')); expect(data.messageNode).toBe('Test'); expect(data.category).toBe('async'); }); it('should return error category when errorMessage is provided', () => { const data = runUseValidationDataHook(errorMessage('Test')); expect(data.messageNode).toBe('Test'); expect(data.category).toBe('error'); }); it('should return info category when infoMessage is provided', () => { const data = runUseValidationDataHook(infoMessage('Test')); expect(data.messageNode).toBe('Test'); expect(data.category).toBe('info'); }); it('should return message category when messageMessage is provided', () => { const data = runUseValidationDataHook(messageMessage('Test')); expect(data.messageNode).toBe('Test'); expect(data.category).toBe('message'); }); it('should return success category when successMessage is provided', () => { const data = runUseValidationDataHook(successMessage('Test')); expect(data.messageNode).toBe('Test'); expect(data.category).toBe('success'); }); it('should return warning category when warningMessage is provided', () => { const data = runUseValidationDataHook(warningMessage('Test')); expect(data.messageNode).toBe('Test'); expect(data.category).toBe('warning'); }); it('should return hidden: true when a message is provided but category == error and touched == false', () => { const data = runUseValidationDataHook(errorMessage('Test'), false); expect(data.messageNode).toBe('Test'); expect(data.category).toBe('error'); expect(data.hidden).toBe(true); }); it('should return hidden: true when a message is provided but category == warning and touched == false', () => { const data = runUseValidationDataHook(warningMessage('Test'), false); expect(data.messageNode).toBe('Test'); expect(data.category).toBe('warning'); expect(data.hidden).toBe(true); }); it('should return hidden: false when a message is provided and category is not (warning || error) even when touched == false', () => { let data = runUseValidationDataHook(asyncMessage('Test'), false); expect(data.messageNode).toBe('Test'); expect(data.category).toBe('async'); expect(data.hidden).toBe(false); data = runUseValidationDataHook(infoMessage('Test'), false); expect(data.messageNode).toBe('Test'); expect(data.category).toBe('info'); expect(data.hidden).toBe(false); data = runUseValidationDataHook(messageMessage('Test'), false); expect(data.messageNode).toBe('Test'); expect(data.category).toBe('message'); expect(data.hidden).toBe(false); data = runUseValidationDataHook(successMessage('Test'), false); expect(data.messageNode).toBe('Test'); expect(data.category).toBe('success'); expect(data.hidden).toBe(false); }); it('should return hidden: true when no message is provided regardless of the value of touched', () => { let data = runUseValidationDataHook(null, false); expect(data.messageNode).toBeNull(); expect(data.category).toBeNull(); expect(data.hidden).toBe(true); data = runUseValidationDataHook(null, true); expect(data.messageNode).toBeNull(); expect(data.category).toBeNull(); expect(data.hidden).toBe(true); data = runUseValidationDataHook(undefined, false); expect(data.messageNode).toBeNull(); expect(data.category).toBeNull(); expect(data.hidden).toBe(true); data = runUseValidationDataHook(undefined, true); expect(data.messageNode).toBeNull(); expect(data.category).toBeNull(); expect(data.hidden).toBe(true); data = runUseValidationDataHook('', false); expect(data.messageNode).toBeNull(); expect(data.category).toBeNull(); expect(data.hidden).toBe(true); data = runUseValidationDataHook('', true); expect(data.messageNode).toBeNull(); expect(data.category).toBeNull(); expect(data.hidden).toBe(true); data = runUseValidationDataHook(errorMessage(''), false); expect(data.messageNode).toBeNull(); expect(data.category).toBeNull(); expect(data.hidden).toBe(true); data = runUseValidationDataHook(errorMessage(''), true); expect(data.messageNode).toBeNull(); expect(data.category).toBeNull(); expect(data.hidden).toBe(true); }); });