import React from 'react'; import { fireEvent, render, screen, waitForElementToBeRemoved, } from '@testing-library/react'; import userEvent from '@testing-library/user-event'; import { AmountInput } from './'; import { GrapesProvider } from '../GrapesProvider'; import { LOCALES } from '../GrapesProvider/exampleLocales'; import { FormField } from '../FormField'; describe('AmountInput component', () => { const currencies = [ { key: 'EUR', label: '€ - Euro' }, { key: 'GBP', label: '£ - British Pound', }, { key: 'USD', label: '$ - US Dollar', }, { key: 'JPY', label: '¥ - Yen' }, ]; it('allows user to only enter positive value', async () => { const Wrapper = () => { const [value, setValue] = React.useState(0); return ( <> ) => setValue(e.target.valueAsNumber) } currency={currencies[0]} /> ); }; render(); expect(screen.getByText('€')).toBeVisible(); await userEvent.type( screen.getByRole('spinbutton', { name: 'Money' }), '10', ); expect(screen.getByRole('spinbutton', { name: 'Money' })).toHaveValue(10); await userEvent.clear(screen.getByRole('spinbutton', { name: 'Money' })); await userEvent.type( screen.getByRole('spinbutton', { name: 'Money' }), '-2', ); expect(screen.getByRole('spinbutton', { name: 'Money' })).toHaveValue(2); }); it('allows user to enter negative value with the `hasNegativeValueAllowed` prop', async () => { const Wrapper = () => { const [value, setValue] = React.useState(0); return ( <> ) => setValue(e.target.valueAsNumber) } currency={currencies[0]} hasNegativeValueAllowed /> ); }; render(); await userEvent.clear(screen.getByRole('spinbutton', { name: 'Money' })); await userEvent.type( screen.getByRole('spinbutton', { name: 'Money' }), '-2', ); expect(screen.getByRole('spinbutton', { name: 'Money' })).toHaveValue(-2); }); it('rounds the value to 2 decimals for EUR', async () => { const Wrapper = () => { const [value, setValue] = React.useState(0); return ( <> ) => setValue(e.target.valueAsNumber) } currency={currencies[0]} hasNegativeValueAllowed /> ); }; render(); await userEvent.clear(screen.getByRole('spinbutton', { name: 'Money' })); await userEvent.type( screen.getByRole('spinbutton', { name: 'Money' }), '5.559', ); expect(screen.getByRole('spinbutton', { name: 'Money' })).toHaveValue(5.56); await userEvent.clear(screen.getByRole('spinbutton', { name: 'Money' })); await userEvent.type( screen.getByRole('spinbutton', { name: 'Money' }), '-5.559', ); expect(screen.getByRole('spinbutton', { name: 'Money' })).toHaveValue( -5.56, ); }); it('rounds the value to 0 decimals for JPY', async () => { const Wrapper = () => { const [value, setValue] = React.useState(0); return ( <> ) => setValue(e.target.valueAsNumber) } currency={currencies[3]} hasNegativeValueAllowed /> ); }; render(); await userEvent.clear(screen.getByRole('spinbutton', { name: 'Money' })); await userEvent.type( screen.getByRole('spinbutton', { name: 'Money' }), '5.6', ); expect(screen.getByRole('spinbutton', { name: 'Money' })).toHaveValue(6); await userEvent.clear(screen.getByRole('spinbutton', { name: 'Money' })); await userEvent.type( screen.getByRole('spinbutton', { name: 'Money' }), '-5.9', ); expect(screen.getByRole('spinbutton', { name: 'Money' })).toHaveValue(-6); }); it('allows user to select a currency', async () => { const Wrapper = () => { const [value, setValue] = React.useState(0); const [currency, setCurrency] = React.useState(currencies[0]); return ( ) => setValue(e.target.valueAsNumber) } currencies={currencies} onSelectCurrency={setCurrency} currency={currency} /> ); }; render(); expect(screen.getByText(currencies[0].key)).toBeVisible(); // Open menu await userEvent.click( screen.getByRole('combobox', { name: 'Select currency' }), ); await userEvent.click( await screen.findByRole('option', { name: currencies[2].label }), ); await waitForElementToBeRemoved(screen.getByText(currencies[2].label)); expect(screen.getByText(currencies[2].key)).toBeVisible(); expect(screen.queryByText(currencies[0].key)).not.toBeInTheDocument(); }); it('should remove focus when user scroll into the component', async () => { render( , ); await userEvent.type( screen.getByRole('spinbutton', { name: 'Money' }), '55', ); expect(screen.getByRole('spinbutton', { name: 'Money' })).toHaveFocus(); fireEvent.wheel(screen.getByRole('spinbutton', { name: 'Money' })); expect(screen.getByRole('spinbutton', { name: 'Money' })).not.toHaveFocus(); }); });