import React from 'react'; import { render, screen } from '@testing-library/react'; import userEvent from '@testing-library/user-event'; import { PanelEditableSection } from './'; import { Callout } from '../../Callout'; import { GrapesProvider } from '../../GrapesProvider/GrapesProvider'; import { LOCALES } from '../../GrapesProvider/exampleLocales'; describe('PanelEditableSection component', () => { describe('given default props and not in edit mode', () => { it('should render a panel editable section with a title and content', () => { render( Edit} cancelTranslation="Cancel" saveTranslation="Save changes" onSave={() => console.log('on save')} onCancel={() => console.log('on cancel')} >
Content
, ); expect(screen.getByText('Title')).toBeVisible(); expect(screen.getByText('Content')).toBeVisible(); expect(screen.queryByText('Edit')).not.toBeInTheDocument(); }); }); describe('given default props and in edit mode', () => { it('should render a panel editable section with a title and content', async () => { render( Edit} cancelTranslation="Cancel" saveTranslation="Save changes" onSave={() => console.log('on save')} onCancel={() => console.log('on cancel')} >
Content
, ); // Click on edit button to start edit mode await userEvent.click(screen.getByRole('button')); expect(screen.getByText('Title')).toBeVisible(); expect(screen.queryByText('Content')).not.toBeInTheDocument(); expect(screen.getByText('Edit')).toBeVisible(); }); }); describe('given `onSave` props', () => { it('calls `onSave` when clicking on the onSave button', async () => { const handleSave = vi.fn(); render( Edit} cancelTranslation="Cancel" saveTranslation="Save changes" onSave={handleSave} onCancel={() => console.log('on cancel')} >
Content
, ); // Click on edit button to start edit mode await userEvent.click(screen.getByRole('button')); // Click on Save changes await userEvent.click( screen.getByRole('button', { name: 'Save changes' }), ); expect(handleSave).toHaveBeenCalledTimes(1); }); }); describe('given `onCancel` props', () => { it('calls `onCancel` when clicking on the onCancel button', async () => { const handleCancel = vi.fn(); render( Edit} cancelTranslation="Cancel" saveTranslation="Save changes" onSave={() => console.log('on save')} onCancel={handleCancel} >
Content
, ); // Click on edit button to start edit mode await userEvent.click(screen.getByRole('button')); // Click on Cancel await userEvent.click(screen.getByRole('button', { name: 'Cancel' })); expect(handleCancel).toHaveBeenCalledTimes(1); }); }); describe('given `disableSave` props', () => { it('does not call `onSave` when clicking on the onSave button', async () => { const handleSave = vi.fn(); render( Edit} cancelTranslation="Cancel" saveTranslation="Save changes" disableSave onSave={handleSave} onCancel={() => console.log('on cancel')} >
Content
, ); // Click on edit button to start edit mode await userEvent.click(screen.getByRole('button')); // Click on Save changes await userEvent.click( screen.getByRole('button', { name: 'Save changes' }), ); expect(handleSave).not.toHaveBeenCalled(); }); }); describe('given `renderError`, `onError` props', () => { it('calls `renderError`, `onError` when an error occurs', async () => { const onError = vi.fn(); render( Edit} cancelTranslation="Cancel" saveTranslation="Save changes" renderError={() => ( )} onError={onError} onSave={() => { throw new Error('error'); }} onCancel={() => console.log('on cancel')} >
Content
, ); // Click on edit button to start edit mode await userEvent.click(screen.getByRole('button')); // Click on Save changes await userEvent.click( screen.getByRole('button', { name: 'Save changes' }), ); expect(screen.getByRole('complementary')).toHaveTextContent( 'An error occured', ); expect(onError).toHaveBeenCalledTimes(1); }); }); });