From 6906bc8c4230e356a56b3a37cad02c899e7bcf6c Mon Sep 17 00:00:00 2001 From: v_lfanglliu <1531997687@qq.com> Date: Thu, 18 Sep 2025 16:04:20 +0800 Subject: [PATCH] test(slider): add slider test --- src/slider/Slider.tsx | 2 +- src/slider/__tests__/slider.test.tsx | 268 +++++++++++++++++++++++++++ 2 files changed, 269 insertions(+), 1 deletion(-) create mode 100644 src/slider/__tests__/slider.test.tsx diff --git a/src/slider/Slider.tsx b/src/slider/Slider.tsx index daaa4555a..eda001b03 100644 --- a/src/slider/Slider.tsx +++ b/src/slider/Slider.tsx @@ -151,7 +151,7 @@ const Slider: FC = (props) => { if (isFunction(label)) { return label(value); } - if (label) { + if (label && !REGEXP.test(label)) { return value; } if (REGEXP.test(label)) { diff --git a/src/slider/__tests__/slider.test.tsx b/src/slider/__tests__/slider.test.tsx new file mode 100644 index 000000000..118dbd178 --- /dev/null +++ b/src/slider/__tests__/slider.test.tsx @@ -0,0 +1,268 @@ +import React from 'react'; +import { describe, expect, vi, it, test, beforeEach } from '@test/utils'; +import { render, fireEvent, screen } from '@testing-library/react'; +import Slider from '../index'; + +const prefix = 't'; +const name = `.${prefix}-slider`; +describe('Slider', () => { + describe('props', () => { + it(': className', () => { + const { container } = render(); + expect(container.firstChild).toHaveClass('custom-class'); + }); + + it(': style', () => { + const { container } = render(); + expect(container.firstChild).toHaveStyle('color: #fff'); + }); + + it(': defaultValue', () => { + const { container } = render(); + expect(container.querySelector(`${name}__bar--default`)).toBeTruthy(); + }); + it(': label', () => { + const label1 = (value) => `Processed: ${value}`; + const { container: container1 } = render(); + const { container: container2 } = render(); + expect(container1.querySelector(`${name}__dot-value`)).toBeTruthy(); + expect(container2.querySelector(`${name}__dot-value`)).not.toBeTruthy(); + // eslint-disable-next-line + const label3 = '${value} is a variable'; + const value3 = 123; + const { container: container3 } = render(); + expect(container3.querySelector(`${name}__dot-value`)).toBeTruthy(); + }); + it(': value', () => { + const { container: container1 } = render(); + expect(container1.querySelector(`${name}__dot-value`)).toBeTruthy(); + }); + it(': step', () => { + const { container } = render(); + const slider = container.querySelector(`${name}__line`); + fireEvent.click(slider, { clientX: 20 }); + const { container: container1 } = render(); + const slider1 = container1.querySelector(`${name}__line`); + fireEvent.click(slider1, { clientX: 0.1 }); + }); + it(':disabled', () => { + const { container } = render(); + const sliderContainer = container.querySelector(`${name}--disabled`); + expect(sliderContainer).toHaveClass('t-slider--disabled'); + }); + + it(': range', () => { + const { container } = render(); + const sliderContainer = container.querySelector(`${name}`); + const sliders = sliderContainer?.querySelectorAll(`${name}__dot-slider`); + expect(sliders?.length).toBe(2); + }); + + it(': marks', () => { + const marks1 = { 0: '0°C', 50: '50°C', 100: '100°C' }; + const marks2 = { 10: (val) => `${val }%` }; + const { container: container1 } = render(); + const { container: container2 } = render(); + const scaleItems1 = container1.querySelectorAll(`${name}__scale-item`); + const scaleItems2 = container2.querySelectorAll(`${name}__scale-item`); + expect(scaleItems1.length).toBe(3); + expect(scaleItems2.length).toBe(1); + expect(screen.getByText('0°C')).toBeInTheDocument(); + }); + it(': marks array', () => { + const testMarks = [10, 20, 30]; + const { container } = render(); + const scaleItems = container.querySelectorAll(`${name}__scale-item`); + expect(scaleItems).toHaveLength(testMarks.length); + }); + it(': showExtremeValue', () => { + render(); + expect(screen.getByText('0')).toBeInTheDocument(); + expect(screen.getByText('100')).toBeInTheDocument(); + }); + + it(': showExtremeValue label', () => { + render(); + expect(screen.getByText('100')).toBeInTheDocument(); + }); + + it(': min range showExtremeValue', () => { + render(); + expect(screen.getByText('10')).toBeInTheDocument(); + }); + + it(': theme', () => { + const themes = ['default', 'capsule'] as const; + themes.forEach((theme) => { + const { container } = render(); + const sliderBar = container.querySelector(`${name}__bar`); + expect(sliderBar).toHaveClass(`t-slider__bar--${theme}`); + }); + }); + }); + + describe('event', () => { + it(': onChange (single slider)', () => { + const handleChange = vi.fn(); + const { container } = render(); + const sliderLine = container.querySelector(`${name}__line`); + fireEvent.click(sliderLine, { clientX: 200 }); + expect(handleChange).toHaveBeenCalled(); + }); + + it(': onChange (touch interaction)', () => { + const handleChange = vi.fn(); + const { container: container1 } = render(); + const { container: container2 } = render(); + const dot1 = container1.querySelector(`${name}__dot`); + const dot2 = container2.querySelector(`${name}__dot`); + fireEvent.touchMove(dot1, { + changedTouches: [{ pageX: 250 } as Touch], + }); + fireEvent.touchMove(dot1, { + changedTouches: undefined, + }); + fireEvent.touchMove(dot2, { + changedTouches: [{ pageX: 250 } as Touch], + }); + fireEvent.touchMove(dot2, { + changedTouches: undefined, + }); + expect(handleChange).toHaveBeenCalled(); + }); + it(': click handleRangeClick', () => { + const onChange = vi.fn(); + const { container: container1 } = render( + , + ); + const { container: container2 } = render( + , + ); + const sliderLine1 = container1.querySelector(`${name}__line`) as HTMLElement; + const sliderLine2 = container2.querySelector(`${name}__line`) as HTMLElement; + + fireEvent.click(sliderLine1, { clientX: 190 }); + fireEvent.click(sliderLine2, { clientX: 190 }); + expect(onChange).toHaveBeenCalled(); + }); + + it(': click disabled', () => { + const onChange = vi.fn(); + const { container: container1 } = render( + , + ); + const { container: container2 } = render( + , + ); + const sliderLine1 = container1.querySelector(`${name}__line`) as HTMLElement; + const sliderLine2 = container2.querySelector(`${name}__line`) as HTMLElement; + fireEvent.click(sliderLine1, { clientX: 190 }); + fireEvent.click(sliderLine2, { clientX: 190 }); + expect(onChange).not.toHaveBeenCalled(); + }); + + it(': onTouchMoveLeft', () => { + const onChange = vi.fn(); + const { container } = render( + , + ); + const leftDot = container.querySelector(`${name}__dot--left`); + Object.defineProperty(container.querySelector(`${name}__bar`), 'getBoundingClientRect', { + value: () => ({ left: 100, right: 500, width: 400 }) as DOMRect, + }); + fireEvent.touchMove(leftDot, { + changedTouches: undefined as unknown, + }); + + fireEvent.touchMove(leftDot, { + changedTouches: [{ pageX: 200 } as Touch], + }); + expect(onChange).toHaveBeenCalledWith(expect.arrayContaining([expect.any(Number), 80])); + }); + + it(': onTouchMoveRight', () => { + const onChange = vi.fn(); + const { container } = render( + , + ); + const rightDot = container.querySelector(`${name}__dot--right`); + Object.defineProperty(container.querySelector(`${name}__bar`), 'getBoundingClientRect', { + value: () => ({ left: 100, right: 500, width: 400 }) as DOMRect, + }); + fireEvent.touchMove(rightDot, { + changedTouches: undefined as unknown, + }); + fireEvent.touchMove(rightDot, { + changedTouches: [{ pageX: 300 } as Touch], + }); + expect(onChange).toHaveBeenCalledWith(expect.arrayContaining([20, expect.any(Number)])); + }); + + it(': touchMove disabled', () => { + const onChange = vi.fn(); + const { container } = render( + , + ); + const leftDot = container.querySelector(`${name}__dot--left`); + const rightDot = container.querySelector(`${name}__dot--right`); + fireEvent.touchMove(rightDot, { + changedTouches: undefined as unknown, + }); + fireEvent.touchMove(leftDot, { + changedTouches: undefined as unknown, + }); + fireEvent.touchMove(rightDot, { + changedTouches: [{ pageX: 300 } as Touch], + }); + fireEvent.touchMove(leftDot, { + changedTouches: [{ pageX: 200 } as Touch], + }); + expect(onChange).not.toHaveBeenCalled(); + }); + }); + + describe('slider handleRangeClick', () => { + const defaultProps = { + range: true, + min: 0, + max: 100, + step: 1, + defaultValue: [20, 80], + onChange: vi.fn(), + }; + const TRACK_WIDTH = 400; + const TRACK_LEFT = 100; + + // 模拟轨道位置和宽度 + const mockBoundingClientRect = () => { + vi.spyOn(HTMLDivElement.prototype, 'getBoundingClientRect').mockImplementation(() => ({ + left: TRACK_LEFT, + right: TRACK_LEFT + TRACK_WIDTH, + top: 0, + bottom: 0, + width: TRACK_WIDTH, + height: 0, + x: TRACK_LEFT, + y: 0, + toJSON: vi.fn(), + })); + }; + + beforeEach(() => { + vi.clearAllMocks(); + }); + test('click left', () => { + mockBoundingClientRect(); + const { container } = render(); + const sliderLine = container.querySelector(`${name}__line`) as HTMLElement; + fireEvent.click(sliderLine, { clientX: TRACK_LEFT + 100 }); + }); + + test('click right', () => { + mockBoundingClientRect(); + const { container } = render(); + const sliderLine = container.querySelector(`${name}__line`) as HTMLElement; + fireEvent.click(sliderLine, { clientX: TRACK_LEFT + 300 }); + }); + }); +});