/* eslint no-unused-expressions: 0, react/no-children-prop:0 */ import { render } from '@testing-library/react'; import userEvents from '@testing-library/user-event'; import { EditorState, Modifier } from 'draft-js'; import React from 'react'; import { UndoPuginStore } from '../..'; import Undo from '../index'; describe('UndoButton', () => { function getStore(state = EditorState.createEmpty()): UndoPuginStore { return { getEditorState: () => state, setEditorState: jest.fn(), } as unknown as UndoPuginStore; } it('applies the className based on the theme property `undo`', () => { const theme = { undo: 'custom-class-name' }; const store = getStore(); const { getByRole } = render( undo ); expect(getByRole('button')).toHaveClass('custom-class-name'); }); it('renders the passed in children', () => { const store = getStore(); const { getByRole } = render( undo ); expect(getByRole('button')).toHaveTextContent('undo'); }); it('applies a custom className as well as the theme', () => { const theme = { undo: 'custom-class-name' }; const store = getStore(); const { getByRole } = render( undo ); expect(getByRole('button')).toHaveClass('custom-class-name undo'); }); it('adds disabled attribute to button if the getUndoStack is empty', () => { const store = getStore(); const { getByRole } = render( undo ); expect(getByRole('button')).toHaveProperty('disabled', true); }); it('removes disabled attribute from button if the getUndoStack is not empty and click button', async () => { const editorState = EditorState.createEmpty(); const contentState = editorState.getCurrentContent(); const SelectionState = editorState.getSelection(); const newContent = Modifier.insertText( contentState, SelectionState, 'hello' ); const newEditorState = EditorState.push( editorState, newContent, 'insert-characters' ); const store = getStore(newEditorState); const { getByRole } = render( undo ); expect(getByRole('button')).toHaveProperty('disabled', false); await userEvents.click(getByRole('button')); expect(store.setEditorState).toHaveBeenCalledTimes(1); }); });