You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

index.spec.tsx 3.0KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. import { fireEvent, render, screen } from '@testing-library/react'
  2. import { InputNumber } from './index'
  3. jest.mock('react-i18next', () => ({
  4. useTranslation: () => ({
  5. t: (key: string) => key,
  6. }),
  7. }))
  8. describe('InputNumber Component', () => {
  9. const defaultProps = {
  10. onChange: jest.fn(),
  11. }
  12. afterEach(() => {
  13. jest.clearAllMocks()
  14. })
  15. it('renders input with default values', () => {
  16. render(<InputNumber {...defaultProps} />)
  17. const input = screen.getByRole('textbox')
  18. expect(input).toBeInTheDocument()
  19. })
  20. it('handles increment button click', () => {
  21. render(<InputNumber {...defaultProps} value={5} />)
  22. const incrementBtn = screen.getByRole('button', { name: /increment/i })
  23. fireEvent.click(incrementBtn)
  24. expect(defaultProps.onChange).toHaveBeenCalledWith(6)
  25. })
  26. it('handles decrement button click', () => {
  27. render(<InputNumber {...defaultProps} value={5} />)
  28. const decrementBtn = screen.getByRole('button', { name: /decrement/i })
  29. fireEvent.click(decrementBtn)
  30. expect(defaultProps.onChange).toHaveBeenCalledWith(4)
  31. })
  32. it('respects max value constraint', () => {
  33. render(<InputNumber {...defaultProps} value={10} max={10} />)
  34. const incrementBtn = screen.getByRole('button', { name: /increment/i })
  35. fireEvent.click(incrementBtn)
  36. expect(defaultProps.onChange).not.toHaveBeenCalled()
  37. })
  38. it('respects min value constraint', () => {
  39. render(<InputNumber {...defaultProps} value={0} min={0} />)
  40. const decrementBtn = screen.getByRole('button', { name: /decrement/i })
  41. fireEvent.click(decrementBtn)
  42. expect(defaultProps.onChange).not.toHaveBeenCalled()
  43. })
  44. it('handles direct input changes', () => {
  45. render(<InputNumber {...defaultProps} />)
  46. const input = screen.getByRole('textbox')
  47. fireEvent.change(input, { target: { value: '42' } })
  48. expect(defaultProps.onChange).toHaveBeenCalledWith(42)
  49. })
  50. it('handles empty input', () => {
  51. render(<InputNumber {...defaultProps} value={0} />)
  52. const input = screen.getByRole('textbox')
  53. fireEvent.change(input, { target: { value: '' } })
  54. expect(defaultProps.onChange).toHaveBeenCalledWith(undefined)
  55. })
  56. it('handles invalid input', () => {
  57. render(<InputNumber {...defaultProps} />)
  58. const input = screen.getByRole('textbox')
  59. fireEvent.change(input, { target: { value: 'abc' } })
  60. expect(defaultProps.onChange).not.toHaveBeenCalled()
  61. })
  62. it('displays unit when provided', () => {
  63. const unit = 'px'
  64. render(<InputNumber {...defaultProps} unit={unit} />)
  65. expect(screen.getByText(unit)).toBeInTheDocument()
  66. })
  67. it('disables controls when disabled prop is true', () => {
  68. render(<InputNumber {...defaultProps} disabled />)
  69. const input = screen.getByRole('textbox')
  70. const incrementBtn = screen.getByRole('button', { name: /increment/i })
  71. const decrementBtn = screen.getByRole('button', { name: /decrement/i })
  72. expect(input).toBeDisabled()
  73. expect(incrementBtn).toBeDisabled()
  74. expect(decrementBtn).toBeDisabled()
  75. })
  76. })