gongxiangp2/components/upload/CertificateDatePicker.test.tsx

82 lines
3.9 KiB
TypeScript
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import { fireEvent, render, screen } from '@testing-library/react'
import CertificateDatePicker from '@/components/upload/CertificateDatePicker'
describe('CertificateDatePicker', () => {
test('检测日期和到期时间分别选择,日历使用独立的名称和状态', () => {
const onTested = jest.fn()
const onExpires = jest.fn()
render(<>
<CertificateDatePicker id="tested-on" label="证书检测日期" value="2026-09-23" onChange={onTested} />
<CertificateDatePicker id="expires-on" label="证书到期时间" value="2027-09-23" onChange={onExpires} />
</>)
const expires = screen.getByRole('button', { name: /证书到期时间/ })
fireEvent.click(expires)
expect(screen.getByRole('dialog', { name: '选择证书到期时间' })).toBeInTheDocument()
fireEvent.click(expires)
expect(screen.queryByRole('dialog')).not.toBeInTheDocument()
fireEvent.click(expires)
fireEvent.click(screen.getByRole('button', { name: '2027年9月24日' }))
expect(onExpires).toHaveBeenCalledWith('2027-09-24')
expect(onTested).not.toHaveBeenCalled()
})
test('日历图标可反复展开和收起,Escape 也会关闭', () => {
render(<CertificateDatePicker id="tested-on" label="证书检测日期" value="2026-09-23" onChange={jest.fn()} />)
const trigger = screen.getByRole('button', { name: /证书检测日期/ })
const icon = trigger.querySelector('svg')
expect(icon).not.toBeNull()
fireEvent.click(icon!)
expect(screen.getByRole('dialog', { name: '选择证书检测日期' })).toBeInTheDocument()
expect(trigger).toHaveAttribute('aria-expanded', 'true')
fireEvent.click(icon!)
expect(screen.queryByRole('dialog', { name: '选择证书检测日期' })).not.toBeInTheDocument()
expect(trigger).toHaveAttribute('aria-expanded', 'false')
fireEvent.click(icon!)
fireEvent.keyDown(document, { key: 'Escape' })
expect(screen.queryByRole('dialog', { name: '选择证书检测日期' })).not.toBeInTheDocument()
expect(trigger).toHaveFocus()
})
test('按日历选择日期时返回统一格式,并关闭日历', () => {
const onChange = jest.fn()
render(<CertificateDatePicker id="tested-on" label="证书检测日期" value="2026-09-23" onChange={onChange} />)
fireEvent.click(screen.getByRole('button', { name: /证书检测日期/ }))
expect(screen.getByText('2026年9月')).toBeInTheDocument()
fireEvent.click(screen.getByRole('button', { name: '下个月' }))
expect(screen.getByText('2026年10月')).toBeInTheDocument()
fireEvent.click(screen.getByRole('button', { name: '2026年10月5日' }))
expect(onChange).toHaveBeenCalledWith('2026-10-05')
expect(screen.queryByRole('dialog', { name: '选择证书检测日期' })).not.toBeInTheDocument()
})
test('点击日历外部会关闭,不改动已选择的日期', () => {
const onChange = jest.fn()
render(<CertificateDatePicker id="tested-on" label="证书检测日期" value="2026-09-23" onChange={onChange} />)
fireEvent.click(screen.getByRole('button', { name: /证书检测日期/ }))
fireEvent.pointerDown(document.body)
expect(screen.queryByRole('dialog', { name: '选择证书检测日期' })).not.toBeInTheDocument()
expect(onChange).not.toHaveBeenCalled()
})
test('可以直接切换年份和月份选择较远的检测日期', () => {
const onChange = jest.fn()
render(<CertificateDatePicker id="tested-on" label="证书检测日期" value="2026-09-23" onChange={onChange} />)
fireEvent.click(screen.getByRole('button', { name: /证书检测日期/ }))
fireEvent.click(screen.getByRole('button', { name: '选择年份和月份' }))
fireEvent.click(screen.getByRole('button', { name: '下一年' }))
fireEvent.click(screen.getByRole('button', { name: '12月' }))
fireEvent.click(screen.getByRole('button', { name: '2027年12月1日' }))
expect(onChange).toHaveBeenCalledWith('2027-12-01')
})
})