Skip to content

Commit

Permalink
Merge branch 'main' into create-useIntegerField
Browse files Browse the repository at this point in the history
  • Loading branch information
AlexShukel committed Aug 27, 2023
2 parents 6301354 + 0676ac5 commit fbc42f6
Showing 1 changed file with 66 additions and 58 deletions.
124 changes: 66 additions & 58 deletions packages/x/tests/useConverterField.test.tsx
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import React from 'react';
import { ReactiveFormProvider, useForm } from '@reactive-forms/core';
import { act, renderHook } from '@testing-library/react';
import { act, renderHook, waitFor } from '@testing-library/react';

import { ConversionError, useConverterField } from '../src/useConverterField';

Expand Down Expand Up @@ -63,58 +63,68 @@ describe('Converter field', () => {
expect(converterFieldBag.current.value).toBe(0);
expect(converterFieldBag.current.text).toBe('0');

await act(async () => {
await onTextChange('1');
await act(() => {
onTextChange('1');
});

expect(converterFieldBag.current.value).toBe(1);
expect(converterFieldBag.current.text).toBe('1');
await waitFor(() => {
expect(converterFieldBag.current.value).toBe(1);
expect(converterFieldBag.current.text).toBe('1');
});
});

it('Should set an error if conversion fails', async () => {
const [{ result: converterFieldBag }] = renderUseConverterField();
const { onTextChange } = converterFieldBag.current;

await act(async () => {
await onTextChange('a');
await act(() => {
onTextChange('a');
});

expect(converterFieldBag.current.meta.error?.$error).toBe('hello');
expect(converterFieldBag.current.value).toBe(0);
expect(converterFieldBag.current.text).toBe('a');
await waitFor(() => {
expect(converterFieldBag.current.meta.error?.$error).toBe('hello');
expect(converterFieldBag.current.value).toBe(0);
expect(converterFieldBag.current.text).toBe('a');
});
});

it('Should update text when form value changes', async () => {
const [{ result: converterFieldBag }, { result: formBag }] = renderUseConverterField();

const { paths } = formBag.current;

await act(async () => {
await formBag.current.setFieldValue(paths.test, 1);
await act(() => {
formBag.current.setFieldValue(paths.test, 1);
});

expect(converterFieldBag.current.value).toBe(1);
expect(converterFieldBag.current.text).toBe('1');
await waitFor(() => {
expect(converterFieldBag.current.value).toBe(1);
expect(converterFieldBag.current.text).toBe('1');
});
});

it('Should clear conversion error', async () => {
const [{ result: converterFieldBag }] = renderUseConverterField();

const { onTextChange } = converterFieldBag.current;

await act(async () => {
await onTextChange('a');
await act(() => {
onTextChange('a');
});

expect(converterFieldBag.current.meta.error?.$error).toBe('hello');
await waitFor(() => {
expect(converterFieldBag.current.meta.error?.$error).toBe('hello');
});

await act(async () => {
await onTextChange('1');
await act(() => {
onTextChange('1');
});

expect(converterFieldBag.current.meta.error?.$error).toBeUndefined();
expect(converterFieldBag.current.value).toBe(1);
expect(converterFieldBag.current.text).toBe('1');
await waitFor(() => {
expect(converterFieldBag.current.meta.error?.$error).toBeUndefined();
expect(converterFieldBag.current.value).toBe(1);
expect(converterFieldBag.current.text).toBe('1');
});
});

it('Should rethrow an error in case it is not ConversionError', () => {
Expand All @@ -134,16 +144,15 @@ describe('Converter field', () => {
const { onTextChange } = converterFieldBag.current;
const { setFieldValue, paths } = formBag.current;

await act(async () => {
await onTextChange('a');
await act(() => {
onTextChange('a');
setFieldValue(paths.test, 1);
});

await act(async () => {
await setFieldValue(paths.test, 1);
await waitFor(() => {
expect(converterFieldBag.current.value).toBe(1);
expect(converterFieldBag.current.text).toBe('a');
});

expect(converterFieldBag.current.value).toBe(1);
expect(converterFieldBag.current.text).toBe('a');
});

it('Should return error from validator', async () => {
Expand All @@ -152,12 +161,11 @@ describe('Converter field', () => {
const { onTextChange } = converterFieldBag.current;
const { validateForm, values } = formBag.current;

await act(async () => {
await onTextChange('a');
await act(() => {
onTextChange('a');
});

const errors = await validateForm(values.getValues());

expect(errors.test?.$error).toBe('hello');
});

Expand All @@ -167,35 +175,38 @@ describe('Converter field', () => {
const { onFocus, onBlur } = converterFieldBag.current;
const { setFieldValue, paths } = formBag.current;

await act(async () => {
await onFocus();
await act(() => {
onFocus();
setFieldValue(paths.test, 1);
});

await act(async () => {
await setFieldValue(paths.test, 1);
await waitFor(() => {
expect(converterFieldBag.current.text).toBe('0');
expect(converterFieldBag.current.value).toBe(1);
});

expect(converterFieldBag.current.text).toBe('0');
expect(converterFieldBag.current.value).toBe(1);

await act(async () => {
await onBlur();
await act(() => {
onBlur();
});

expect(converterFieldBag.current.text).toBe('0');
expect(converterFieldBag.current.value).toBe(0);
await waitFor(() => {
expect(converterFieldBag.current.text).toBe('0');
expect(converterFieldBag.current.value).toBe(0);
});
});

it('Should set field touched=true on blur', async () => {
const [{ result: converterFieldBag }] = renderUseConverterField();

const { onBlur } = converterFieldBag.current;

await act(async () => {
await onBlur();
await act(() => {
onBlur();
});

expect(converterFieldBag.current.meta.touched?.$touched).toBe(true);
await waitFor(() => {
expect(converterFieldBag.current.meta.touched?.$touched).toBe(true);
});
});

it('Should set value both in form state and local text state', async () => {
Expand All @@ -206,36 +217,33 @@ describe('Converter field', () => {
onFocus,
} = converterFieldBag.current;

await act(async () => {
await onFocus();
await act(() => {
onFocus();
setValue(1);
});

await act(async () => {
await setValue(1);
await waitFor(() => {
expect(converterFieldBag.current.value).toBe(1);
expect(converterFieldBag.current.text).toBe('1');
});

expect(converterFieldBag.current.value).toBe(1);
expect(converterFieldBag.current.text).toBe('1');
});

it('Should reformat value when format function changes', () => {
const [converterFieldBag] = renderUseConverterField();

const format = jest.fn(() => 'test');

act(() => {
converterFieldBag.rerender({ format, parse: defaultParse });
});
converterFieldBag.rerender({ format, parse: defaultParse });

expect(converterFieldBag.result.current.text).toBe('test');
});

it('Should parse text again when parse function changes', () => {
it('Should parse text again when parse function changes', async () => {
const [converterFieldBag] = renderUseConverterField();

const parse = jest.fn(() => 1);

act(() => {
await act(() => {
converterFieldBag.rerender({ format: defaultFormat, parse });
});

Expand Down

0 comments on commit fbc42f6

Please sign in to comment.