import * as React from 'react';
import userEvent from '@testing-library/user-event';
import { render, screen } from '../../../test-utils/testing-library';
import RenameDialog from '../RenameDialog';
import { ERROR_CODE_ITEM_NAME_TOO_LONG, ERROR_CODE_ITEM_NAME_IN_USE } from '../../../constants';
jest.mock('react-modal', () => {
return jest.fn(({ children }) =>
{children}
);
});
const defaultProps = {
appElement: document.createElement('div'),
errorCode: '',
isLoading: false,
isOpen: true,
item: { name: 'test.txt', extension: 'txt' },
onCancel: jest.fn(),
onRename: jest.fn(),
parentElement: document.createElement('div'),
};
describe('elements/content-explorer/RenameDialog', () => {
const renderComponent = (props = {}) => render();
test('renders the dialog with the correct initial state', () => {
renderComponent();
expect(screen.getByText('Please enter a new name for test:')).toBeInTheDocument();
expect(screen.getByRole('textbox')).toHaveValue('test');
expect(screen.getByDisplayValue('test')).toBeInTheDocument();
expect(screen.getByRole('button', { name: 'Rename' })).toBeInTheDocument();
expect(screen.getByRole('button', { name: 'Cancel' })).toBeInTheDocument();
});
test('calls onCancel when cancel button is clicked', async () => {
const onCancel = jest.fn();
renderComponent({ onCancel });
await userEvent.click(screen.getByRole('button', { name: 'Cancel' }));
expect(onCancel).toHaveBeenCalled();
});
test('calls onRename with the correct values when rename button is clicked', async () => {
const onRename = jest.fn();
renderComponent({ onRename });
const input = screen.getByRole('textbox');
await userEvent.clear(input);
await userEvent.type(input, 'newname');
await userEvent.click(screen.getByRole('button', { name: 'Rename' }));
expect(onRename).toHaveBeenCalledWith('newname', '.txt');
});
test('displays an error message is neither ERROR_CODE_ITEM_NAME_IN_USE or ERROR_CODE_ITEM_NAME_TOO_LONG', () => {
renderComponent({ errorCode: 'something else' });
expect(screen.getByText('This name is invalid.')).toBeInTheDocument();
});
test('displays an error message when errorCode is ERROR_CODE_ITEM_NAME_IN_USE', () => {
renderComponent({ errorCode: ERROR_CODE_ITEM_NAME_IN_USE });
expect(screen.getByText('An item with the same name already exists.')).toBeInTheDocument();
});
test('displays an error message when errorCode is ERROR_CODE_ITEM_NAME_TOO_LONG', () => {
renderComponent({ errorCode: ERROR_CODE_ITEM_NAME_TOO_LONG });
expect(screen.getByText('This name is too long.')).toBeInTheDocument();
});
test('does not call onRename if the name has not changed', async () => {
const onCancel = jest.fn();
const onRename = jest.fn();
renderComponent({ onCancel, onRename });
await userEvent.click(screen.getByText('Rename'));
expect(onRename).not.toHaveBeenCalled();
expect(onCancel).toHaveBeenCalled();
});
test('calls handleRename on Enter key press', async () => {
const onRename = jest.fn();
renderComponent({ onRename });
const input = screen.getByRole('textbox');
await userEvent.clear(input);
await userEvent.type(input, 'newname');
await userEvent.type(input, '{enter}');
expect(onRename).toHaveBeenCalledWith('newname', '.txt');
});
});