import * as React from 'react'; import "regenerator-runtime/runtime"; import { act, cleanup, render } from '@testing-library/react'; import Countdown from '.'; const originalError = console.error; describe('Countdown component', () => { beforeAll(() => { console.error = (...args: any[]) => { if (/Warning.*not wrapped in act/.test(args[0])) { return } originalError.call(console, ...args) } }) afterEach(cleanup); afterAll(() => { console.error = originalError }) test('Should render countdown', async (end) => { const { container, } = render(); expect(container.textContent).toBe('00:04'); await new Promise((res) => setTimeout(() => res(), 1000)); expect(['00:03', '00:02']).toContain(container.textContent); await new Promise((res) => setTimeout(() => res(), 3000)); expect(container.textContent).toBe('00:00'); end(); }); test('Should use [EN] locale and "m:s" format', async (end) => { const { container, } = render(); expect(container.textContent).toBe('00:04'); end(); }); test('Should respect locale [EN]', async (end) => { const { container, rerender } = render(); expect(container.textContent).toBe('2 minutes 1 second'); rerender(); expect(container.textContent).toBe('02:01'); rerender(); expect(container.textContent).toBe('3'); rerender(); expect(container.textContent).toBe('3 minutes'); rerender(); expect(container.textContent).toBe('121'); rerender(); expect(container.textContent).toBe('121 seconds'); const { container: container2 } = render(); expect(container2.textContent).toBe('10 minutes'); const { container: container3 } = render(); expect(container3.textContent).toBe('30 seconds'); end(); }); test('Should respect locale [RU]', async (end) => { const { container, rerender } = render(); expect(container.textContent).toBe('2 минуты 1 секунда'); rerender(); expect(container.textContent).toBe('02:01'); rerender(); expect(container.textContent).toBe('3'); rerender(); expect(container.textContent).toBe('3 минуты'); rerender(); expect(container.textContent).toBe('121'); rerender(); expect(container.textContent).toBe('121 секунда'); const { container: container2 } = render(); expect(container2.textContent).toBe('2 минуты 8 секунд'); const { container: container3 } = render(); expect(container3.textContent).toBe('30 секунд'); end(); }); test('Should respect locale [RU-PASSIVE]', async (end) => { const { container, rerender } = render(); expect(container.textContent).toBe('2 минуты 1 секунду'); rerender(); expect(container.textContent).toBe('02:01'); rerender(); expect(container.textContent).toBe('3'); rerender(); expect(container.textContent).toBe('3 минуты'); rerender(); expect(container.textContent).toBe('121'); rerender(); expect(container.textContent).toBe('121 секунду'); const { container: container2 } = render(); expect(container2.textContent).toBe('128 секунд'); const { container: container3 } = render(); expect(container3.textContent).toBe('30 секунд'); end(); }); test('Should add leading zeros for "m" and "s"', async (end) => { const { container } = render(); expect(container.textContent).toBe('00:04'); const { container: container2 } = render(); expect(container2.textContent).toBe('10:30'); end(); }); test('Should execute callback at the end', async (end) => { const onExpire = jest.fn(() => undefined); const { container } = render(); expect(container.textContent).toBe('00:04'); await new Promise((res) => setTimeout(() => res(), 4000)); expect(onExpire).toBeCalled(); end(); }); test('Should call onChange', (end) => { const onChange = jest.fn(() => undefined); const { container } = render(); expect(container.textContent).toBe('00:10'); setTimeout(() => { expect(onChange).toBeCalledTimes(1); end(); }, 1000); }); test('Should pause if pause set in true', (end) => { const onChange = jest.fn(() => undefined); const { container } = render(); expect(container.textContent).toBe('00:10'); setTimeout(() => { expect(onChange).toBeCalledTimes(0); expect(container.textContent).toBe('00:10'); end(); }, 1500); }); });