diff --git a/components/mentions/__tests__/__snapshots__/demo.test.js.snap b/components/mentions/__tests__/__snapshots__/demo.test.ts.snap similarity index 100% rename from components/mentions/__tests__/__snapshots__/demo.test.js.snap rename to components/mentions/__tests__/__snapshots__/demo.test.ts.snap diff --git a/components/mentions/__tests__/__snapshots__/index.test.js.snap b/components/mentions/__tests__/__snapshots__/index.test.tsx.snap similarity index 100% rename from components/mentions/__tests__/__snapshots__/index.test.js.snap rename to components/mentions/__tests__/__snapshots__/index.test.tsx.snap diff --git a/components/mentions/__tests__/demo.test.js b/components/mentions/__tests__/demo.test.ts similarity index 100% rename from components/mentions/__tests__/demo.test.js rename to components/mentions/__tests__/demo.test.ts diff --git a/components/mentions/__tests__/index.test.js b/components/mentions/__tests__/index.test.js deleted file mode 100644 index 57e9abf289..0000000000 --- a/components/mentions/__tests__/index.test.js +++ /dev/null @@ -1,97 +0,0 @@ -import { mount } from 'enzyme'; -import React from 'react'; -import Mentions from '..'; -import focusTest from '../../../tests/shared/focusTest'; -import mountTest from '../../../tests/shared/mountTest'; -import rtlTest from '../../../tests/shared/rtlTest'; -import { act } from '../../../tests/utils'; - -const { getMentions } = Mentions; - -function simulateInput(wrapper, text, keyEvent) { - const lastChar = text[text.length - 1]; - const myKeyEvent = keyEvent || { - which: lastChar.charCodeAt(0), - key: lastChar, - target: { - value: text, - selectionStart: text.length, - }, - }; - - wrapper.find('textarea').simulate('keyDown', myKeyEvent); - - const textareaInstance = wrapper.find('textarea').instance(); - textareaInstance.value = text; - textareaInstance.selectionStart = text.length; - textareaInstance.selectionStart = text.length; - - if (!keyEvent) { - wrapper.find('textarea').simulate('change', { - target: { value: text }, - }); - } - - wrapper.find('textarea').simulate('keyUp', myKeyEvent); - wrapper.update(); -} - -describe('Mentions', () => { - beforeAll(() => { - jest.useFakeTimers(); - }); - - afterAll(() => { - jest.useRealTimers(); - }); - - it('getMentions', () => { - const mentions = getMentions('@light #bamboo cat', { prefix: ['@', '#'] }); - expect(mentions).toEqual([ - { - prefix: '@', - value: 'light', - }, - { - prefix: '#', - value: 'bamboo', - }, - ]); - }); - - it('focus', () => { - const onFocus = jest.fn(); - const onBlur = jest.fn(); - - const wrapper = mount(); - wrapper.find('textarea').simulate('focus'); - expect(wrapper.find('.ant-mentions').hasClass('ant-mentions-focused')).toBeTruthy(); - expect(onFocus).toHaveBeenCalled(); - - wrapper.find('textarea').simulate('blur'); - act(() => { - jest.runAllTimers(); - }); - wrapper.update(); - expect(wrapper.find('.ant-mentions').hasClass('ant-mentions-focused')).toBeFalsy(); - expect(onBlur).toHaveBeenCalled(); - }); - - focusTest(Mentions, { refFocus: true }); - mountTest(Mentions); - rtlTest(Mentions); - - it('loading', () => { - const wrapper = mount(); - simulateInput(wrapper, '@'); - expect(wrapper.find('li.ant-mentions-dropdown-menu-item').length).toBe(1); - expect(wrapper.find('.ant-spin').length).toBeTruthy(); - }); - - it('notFoundContent', () => { - const wrapper = mount(} />); - simulateInput(wrapper, '@'); - expect(wrapper.find('li.ant-mentions-dropdown-menu-item').length).toBe(1); - expect(wrapper.find('.bamboo-light').length).toBeTruthy(); - }); -}); diff --git a/components/mentions/__tests__/index.test.tsx b/components/mentions/__tests__/index.test.tsx new file mode 100644 index 0000000000..320336eafd --- /dev/null +++ b/components/mentions/__tests__/index.test.tsx @@ -0,0 +1,87 @@ +import React from 'react'; +import Mentions from '..'; +import focusTest from '../../../tests/shared/focusTest'; +import mountTest from '../../../tests/shared/mountTest'; +import rtlTest from '../../../tests/shared/rtlTest'; +import { act, render, fireEvent } from '../../../tests/utils'; + +const { getMentions } = Mentions; + +function simulateInput(wrapper: ReturnType, text: string, keyEvent?: Event): void { + const lastChar = text[text.length - 1]; + const myKeyEvent = keyEvent || { + which: lastChar.charCodeAt(0), + key: lastChar, + target: { + value: text, + selectionStart: text.length, + }, + }; + + fireEvent.keyDown(wrapper.container.querySelector('textarea')!, myKeyEvent); + + const textareaInstance = wrapper.container.querySelector('textarea'); + + if (textareaInstance) { + textareaInstance.value = text; + textareaInstance.selectionStart = text.length; + textareaInstance.selectionStart = text.length; + } + + if (!keyEvent) { + fireEvent.change(wrapper.container.querySelector('textarea')!, { target: { value: text } }); + } + fireEvent.keyUp(wrapper.container.querySelector('textarea')!, myKeyEvent); +} + +describe('Mentions', () => { + beforeAll(() => { + jest.useFakeTimers(); + }); + + afterAll(() => { + jest.useRealTimers(); + }); + + it('getMentions', () => { + const mentions = getMentions('@light #bamboo cat', { prefix: ['@', '#'] }); + expect(mentions).toEqual([ + { prefix: '@', value: 'light' }, + { prefix: '#', value: 'bamboo' }, + ]); + }); + + it('focus', () => { + const onFocus = jest.fn(); + const onBlur = jest.fn(); + + const { container } = render(); + fireEvent.focus(container.querySelector('textarea')!); + expect(container.querySelector('.ant-mentions')).toHaveClass('ant-mentions-focused'); + expect(onFocus).toHaveBeenCalled(); + fireEvent.blur(container.querySelector('textarea')!); + act(() => { + jest.runAllTimers(); + }); + expect(container.querySelector('.ant-mentions')).not.toHaveClass('ant-mentions-focused'); + expect(onBlur).toHaveBeenCalled(); + }); + + focusTest(Mentions, { refFocus: true }); + mountTest(Mentions); + rtlTest(Mentions); + + it('loading', () => { + const wrapper = render(); + simulateInput(wrapper, '@'); + expect(wrapper.container.querySelectorAll('li.ant-mentions-dropdown-menu-item').length).toBe(1); + expect(wrapper.container.querySelectorAll('.ant-spin').length).toBeTruthy(); + }); + + it('notFoundContent', () => { + const wrapper = render(} />); + simulateInput(wrapper, '@'); + expect(wrapper.container.querySelectorAll('li.ant-mentions-dropdown-menu-item').length).toBe(1); + expect(wrapper.container.querySelectorAll('.bamboo-light').length).toBeTruthy(); + }); +});