import React, {ReactElement} from 'react'; import {shallow, mount, ReactWrapper} from 'enzyme'; import TimeField from '../src/index'; describe('Component', () => { let a: ReactWrapper | null; let b: ReactWrapper | null; let persist: jest.Mock; let onChangeA: jest.Mock; let onChangeB: jest.Mock; beforeEach(() => { persist = jest.fn(); onChangeA = jest.fn(); onChangeB = jest.fn(); a = mount(); b = mount(); }); afterEach(() => { if (a) { a.unmount(); } a = null; if (b) { b.unmount(); } b = null; }); test('should render input field', () => { expect(a.find('input')).toHaveLength(1); expect(b.find('input')).toHaveLength(1); }); test('should render custom input field', () => { const customInput = shallow(} />); expect(customInput.find('input')).toHaveLength(1); expect(customInput.find('input').getElement().props.id).toEqual('lol'); }); test('should render time value from props', () => { expect(a.find('input').getElement().props.value).toEqual('12:34'); expect(b.find('input').getElement().props.value).toEqual('12:34:56'); }); test('should render reserved props', () => { expect(a.setProps({value: '21:43'}).state('value')).toEqual('21:43'); expect(b.setProps({value: '21:43:13'}).state('value')).toEqual('21:43:13'); }); test('should keep old values w/o changes', () => { expect(a.setProps({value: '12:34'}).state('value')).toEqual('12:34'); expect(b.setProps({value: '12:34:56'}).state('value')).toEqual('12:34:56'); }); test('should validate reserved props before render', () => { expect(a.setProps({value: '30:60'}).state('value')).toEqual('00:00'); expect(b.setProps({value: '30:60:90'}).state('value')).toEqual('00:00:00'); }); test('should validate value after input change', () => { const eventA = {target: {value: '12:34'}, persist}; expect(a.simulate('change', eventA).state('value')).toEqual('12:34'); const eventB = {target: {value: '12:34:56'}, persist}; expect(b.simulate('change', eventB).state('value')).toEqual('12:34:56'); }); test('should handle added number character', () => { const eventA = {target: {value: '212:34', selectionEnd: 1}, persist}; expect(a.simulate('change', eventA).state('value')).toEqual('22:34'); const eventB = {target: {value: '12:34:156', selectionEnd: 7}, persist}; expect(b.simulate('change', eventB).state('value')).toEqual('12:34:16'); }); test('should handle added ":" character', () => { const eventA = {target: {value: '12::34', selectionEnd: 3}, persist}; expect(a.simulate('change', eventA).state('value')).toEqual('12:34'); const eventB = {target: {value: '12:34::56', selectionEnd: 6}, persist}; expect(b.simulate('change', eventB).state('value')).toEqual('12:34:56'); }); test('should handle added number character before ":"', () => { const eventA = {target: {value: '121:34', selectionEnd: 3}, persist}; expect(a.simulate('change', eventA).state('value')).toEqual('12:14'); const eventB = {target: {value: '12:341:56', selectionEnd: 6}, persist}; expect(b.simulate('change', eventB).state('value')).toEqual('12:34:16'); }); test('should handle added number character before ":" (update position)', () => { const eventA = {target: {value: '132:34', selectionEnd: 2}, persist}; expect(a.simulate('change', eventA).state('value')).toEqual('13:34'); const eventB = {target: {value: '12:334:56', selectionEnd: 5}, persist}; expect(b.simulate('change', eventB).state('value')).toEqual('12:33:56'); }); test('should keep old value if position is out pf range', () => { const eventA = {target: {value: '12:341', selectionEnd: 6}, persist}; expect(a.simulate('change', eventA).state('value')).toEqual('12:34'); const eventB = {target: {value: '12:34:561', selectionEnd: 9}, persist}; expect(b.simulate('change', eventB).state('value')).toEqual('12:34:56'); }); test('should keep old value if not a number was typed', () => { const eventA = {target: {value: 'a12:34', selectionEnd: 1}, persist}; expect(a.simulate('change', eventA).state('value')).toEqual('12:34'); const eventB = {target: {value: '12:34:a56', selectionEnd: 7}, persist}; expect(b.simulate('change', eventB).state('value')).toEqual('12:34:56'); }); test('should handle removed character', () => { const eventA = {target: {value: '1:34', selectionEnd: 1}, persist}; expect(a.simulate('change', eventA).state('value')).toEqual('10:34'); const eventB = {target: {value: '12:34:6', selectionEnd: 6}, persist}; expect(b.simulate('change', eventB).state('value')).toEqual('12:34:06'); }); test('should handle removed ":" character', () => { const eventA = {target: {value: '1234', selectionEnd: 2}, persist}; expect(a.simulate('change', eventA).state('value')).toEqual('10:34'); const eventB = {target: {value: '12:3456', selectionEnd: 5}, persist}; expect(b.simulate('change', eventB).state('value')).toEqual('12:30:56'); }); test('should handle single character replacement', () => { const eventA = {target: {value: '12:44', selectionEnd: 4}, persist}; expect(a.simulate('change', eventA).state('value')).toEqual('12:44'); const eventB = {target: {value: '12:34:46', selectionEnd: 7}, persist}; expect(b.simulate('change', eventB).state('value')).toEqual('12:34:46'); }); test('should handle single ":" character replacement', () => { const eventA = {target: {value: '12a34', selectionEnd: 3}, persist}; expect(a.simulate('change', eventA).state('value')).toEqual('12:34'); const eventB = {target: {value: '12:34a56', selectionEnd: 6}, persist}; expect(b.simulate('change', eventB).state('value')).toEqual('12:34:56'); }); test('should handle more than 2 characters replacement (number)', () => { const eventA = {target: {value: '12:2', selectionEnd: 4}, persist}; expect(a.simulate('change', eventA).state('value')).toEqual('12:20'); const eventB = {target: {value: '12:34:2', selectionEnd: 7}, persist}; expect(b.simulate('change', eventB).state('value')).toEqual('12:34:20'); }); test('should handle 2 characters replacement (invalid character)', () => { const eventA = {target: {value: '12:a', selectionEnd: 4}, persist}; expect(a.simulate('change', eventA).state('value')).toEqual('12:34'); const eventB = {target: {value: '12:34:a', selectionEnd: 7}, persist}; expect(b.simulate('change', eventB).state('value')).toEqual('12:34:56'); }); test('should handle more than 2 characters replacement (invalid character)', () => { const eventA = {target: {value: '12a', selectionEnd: 3}, persist}; expect(a.simulate('change', eventA).state('value')).toEqual('12:34'); const eventB = {target: {value: '12:34a', selectionEnd: 6}, persist}; expect(b.simulate('change', eventB).state('value')).toEqual('12:34:56'); }); test('should handle all characters replacement (invalid character)', () => { const eventA = {target: {value: 'a', selectionEnd: 1}, persist}; expect(a.simulate('change', eventA).state('value')).toEqual('12:34'); }); });