gongxiangp2/components/upload/MaterialTypeSelect.test.tsx

54 lines
2.2 KiB
TypeScript

import { render, screen, within } from '@testing-library/react'
import userEvent from '@testing-library/user-event'
import MaterialTypeSelect from '@/components/upload/MaterialTypeSelect'
const options = ['3D场景', '音乐', '直播切片', '任务-其他']
function renderSelect(counts: Record<string, number> = {}) {
const onChange = jest.fn()
render(
<>
<span id="upload-material-type-label">素材类型 *</span>
<MaterialTypeSelect id="upload-material-type" value="3D场景" options={options} counts={counts} onChange={onChange} />
</>,
)
return onChange
}
test('按首页数量降序排列可选类型,同数量保持原顺序,选择后关闭', async () => {
const user = userEvent.setup()
const onChange = renderSelect({ '3D场景': 2, '音乐': 12, '直播切片': 12, '任务-其他': 0 })
await user.click(screen.getByRole('button', { name: '素材类型 *' }))
const list = screen.getByRole('listbox', { name: '素材类型 *' })
expect(within(list).getAllByRole('option').map((option) => option.getAttribute('aria-label')))
.toEqual(['音乐', '直播切片', '3D场景', '任务-其他'])
expect(within(list).getByText('按素材数量排序')).toBeInTheDocument()
await user.click(within(list).getByRole('option', { name: '直播切片' }))
expect(onChange).toHaveBeenCalledWith('直播切片')
expect(screen.queryByRole('listbox')).not.toBeInTheDocument()
})
test('无数量时保留原顺序,键盘可操作并用 Escape 关闭', async () => {
const user = userEvent.setup()
const onChange = renderSelect()
const trigger = screen.getByRole('button', { name: '素材类型 *' })
trigger.focus()
await user.keyboard('{ArrowDown}')
const list = screen.getByRole('listbox')
expect(within(list).getAllByRole('option').map((option) => option.getAttribute('aria-label'))).toEqual(options)
expect(within(list).queryByText('按素材数量排序')).not.toBeInTheDocument()
await user.keyboard('{End}{Enter}')
expect(onChange).toHaveBeenCalledWith('任务-其他')
expect(trigger).toHaveFocus()
await user.click(trigger)
await user.keyboard('{Escape}')
expect(screen.queryByRole('listbox')).not.toBeInTheDocument()
expect(trigger).toHaveFocus()
})