From a4bacf5e42f586b5f7af1eb4ca0625be4834b23b Mon Sep 17 00:00:00 2001 From: v_lfanglliu <1531997687@qq.com> Date: Mon, 15 Sep 2025 14:40:09 +0800 Subject: [PATCH] test(search): add search test --- src/search/Search.tsx | 2 +- src/search/__tests__/search.test.tsx | 132 +++++++++++++++++++++++++++ 2 files changed, 133 insertions(+), 1 deletion(-) create mode 100644 src/search/__tests__/search.test.tsx diff --git a/src/search/Search.tsx b/src/search/Search.tsx index 3b96dcfa0..f86f5918e 100644 --- a/src/search/Search.tsx +++ b/src/search/Search.tsx @@ -134,7 +134,7 @@ const Search: FC = (props) => { placeholder={placeholder} readOnly={readonly} disabled={disabled} - onKeyPress={handleSearch} + onKeyDown={handleSearch} onFocus={handleFocus} onBlur={handleBlur} onInput={handleInput} diff --git a/src/search/__tests__/search.test.tsx b/src/search/__tests__/search.test.tsx new file mode 100644 index 000000000..bed207ffb --- /dev/null +++ b/src/search/__tests__/search.test.tsx @@ -0,0 +1,132 @@ +import React from 'react'; +import { describe, expect, vi, it, cleanup } from '@test/utils'; +import { render, fireEvent, screen } from '@testing-library/react'; + +import Search from '../index'; + +const getSearch = () => screen.getByRole('searchbox'); +const getActionBtn = () => screen.queryByText('搜索'); +const prefix = 't'; +const name = `.${prefix}-search`; + +describe('Search', () => { + describe('props', () => { + it(': leftIcon', () => { + const CustomSuffix = () => ; + render(} />); + expect(screen.getByTestId('custom-suffix')).toBeInTheDocument(); + const { container } = render(); + expect(container.querySelector('.t-search__input-box .t-icon')).toBeTruthy(); + }); + it(': clearable', () => { + const { container } = render(); + expect(container.querySelector(`${name}__clear`)).toBeTruthy(); + }); + + it(': action', () => { + const { rerender } = render(); + rerender(); + expect(screen.getByText('搜索').parentElement).toBeInTheDocument(); + rerender(); + expect(getActionBtn()).not.toBeInTheDocument(); + rerender(); + expect(getActionBtn()).not.toBeInTheDocument(); + }); + it(': center', () => { + const { container } = render(); + expect(container.querySelector(`${name}--center`)).toBeTruthy(); + }); + it(': disabled', () => { + render(); + expect(getSearch()).toBeDisabled(); + expect(getActionBtn()).not.toBeInTheDocument(); + cleanup(); + + render(); + expect(getSearch()).toBeDisabled(); + }); + it(':focus', () => { + render(); + expect(getSearch()).toHaveFocus(); + + cleanup(); + render(); + expect(getSearch()).not.toHaveFocus(); + }); + it(': placeholder', () => { + const customPlaceholder = '自定义占位符'; + render(); + expect(getSearch()).toHaveAttribute('placeholder', customPlaceholder); + }); + it(': readonly', () => { + const { container } = render(); + expect(container.querySelector(`${name}__input-box`)).toBeTruthy(); + }); + it(': shape', () => { + const shapes = ['square', 'round'] as const; + shapes.forEach((shape) => { + const { container } = render(); + expect(container.querySelector(`${name}__input-box--${shape}`)).toBeTruthy(); + }); + }); + it(': value', () => { + render(); + expect(getSearch()).toHaveValue('search'); + }); + it(': defaultValue', () => { + const { container } = render(); + expect(container.querySelector('.t-search')).not.toBe(null); + }); + }); + + describe('event', () => { + it(': onActionClick', () => { + const handleActionClick = vi.fn(); + render(); + fireEvent.click(screen.getByText('搜索')); + expect(handleActionClick).toHaveBeenCalledTimes(1); + }); + + it(': onBlur', () => { + const handleBlur = vi.fn(); + render(); + fireEvent.blur(getSearch()); + expect(handleBlur).toHaveBeenCalled(); + }); + + it(':onClear', () => { + const handleClear = vi.fn(); + const { container } = render(); + fireEvent.click(container.querySelector(`${name}__clear`) as HTMLElement); + expect(handleClear).toHaveBeenCalled(); + }); + + it(':onFocus', () => { + const handleFocus = vi.fn(); + render(); + fireEvent.focus(getSearch()); + expect(handleFocus).toHaveBeenCalled(); + }); + it(': onChange', () => { + const handleChange = vi.fn(); + render(); + const search = getSearch(); + fireEvent.input(search, { target: { value: '20' } }); + expect(handleChange).toHaveBeenCalledTimes(1); + }); + + it(': onSubmit', () => { + const handleSubmit = vi.fn(); + render(); + const input = getSearch(); + const testValue = '提交内容'; + fireEvent.input(input, { target: { value: testValue } }); + fireEvent.keyDown(input, { key: 'Enter', code: 'Enter' }); + expect(handleSubmit).toHaveBeenCalledTimes(1); + expect(handleSubmit).toHaveBeenCalledWith({ + value: testValue, + e: expect.anything(), + }); + }); + }); +});