1- import { describe , expect , it } from "vitest" ;
2- import { fireEvent , render , screen , waitFor } from "@testing-library/react" ;
1+ import { describe , expect , it , vi } from "vitest" ;
2+ import { fireEvent , render , screen } from "@testing-library/react" ;
33import { Slider } from "./Slider" ;
4- import { createChangeHandler } from "@/plugins/mui/common.test" ;
54import "@testing-library/jest-dom" ;
6- import { createTheme , ThemeProvider } from "@mui/material" ;
5+ import { createChangeHandler } from "@/plugins/mui/common.test" ;
6+ import { useState } from "react" ;
7+ import type { ComponentChangeEvent } from "@/types/state/event" ;
78
89describe ( "Slider" , ( ) => {
9- it ( "should render the Slider component" , async ( ) => {
10+ it ( "should render the Slider component" , ( ) => {
1011 render (
1112 < Slider
1213 id = "slider"
@@ -15,57 +16,100 @@ describe("Slider", () => {
1516 max = { 100 }
1617 value = { 50 }
1718 onChange = { ( ) => { } }
18- style = { { width : "300px" } }
1919 /> ,
2020 ) ;
2121
22- const slider = await waitFor ( ( ) => screen . getByRole ( "slider" ) ) ;
22+ const slider = screen . getByRole ( "slider" ) ;
2323 expect ( slider ) . toBeDefined ( ) ;
2424
2525 expect ( slider . getAttribute ( "aria-orientation" ) ) . toEqual ( "horizontal" ) ;
2626 expect ( slider . getAttribute ( "min" ) ) . toEqual ( "0" ) ;
2727 expect ( slider . getAttribute ( "max" ) ) . toEqual ( "100" ) ;
28+ expect ( slider . getAttribute ( "value" ) ) . toEqual ( "50" ) ;
2829 } ) ;
2930
30- it ( "should fire 'value' property" , async ( ) => {
31- const { recordedEvents, onChange } = createChangeHandler ( ) ;
32- const theme = createTheme ( ) ;
31+ it ( "should render the Slider component" , ( ) => {
3332 render (
34- < ThemeProvider theme = { theme } >
33+ < Slider
34+ id = "slider"
35+ type = { "Slider" }
36+ min = { 0 }
37+ max = { 100 }
38+ value = { 50 }
39+ onChange = { ( ) => { } }
40+ /> ,
41+ ) ;
42+
43+ const slider = screen . getByRole ( "slider" ) ;
44+ expect ( slider ) . toBeDefined ( ) ;
45+
46+ expect ( slider . getAttribute ( "aria-orientation" ) ) . toEqual ( "horizontal" ) ;
47+ expect ( slider . getAttribute ( "min" ) ) . toEqual ( "0" ) ;
48+ expect ( slider . getAttribute ( "max" ) ) . toEqual ( "100" ) ;
49+ expect ( slider . getAttribute ( "value" ) ) . toEqual ( "50" ) ;
50+ } ) ;
51+
52+ it ( "should fire 'value' property" , ( ) => {
53+ const { recordedEvents, onChange } = createChangeHandler ( ) ;
54+
55+ const TestSlider = ( ) => {
56+ const [ sliderValue , setSliderValue ] = useState ( 60 ) ;
57+
58+ const handleChange = ( event : ComponentChangeEvent ) => {
59+ setSliderValue ( event . value as number ) ;
60+ onChange ( event ) ;
61+ } ;
62+
63+ return (
3564 < Slider
36- id = "sliderId"
3765 type = { "Slider" }
38- ariaLabel = { "slider" }
39- onChange = { onChange }
40- value = { 60 }
66+ data-testid = "sliderId"
67+ id = "sliderId"
68+ aria-label = { "slider" }
69+ min = { 0 }
70+ max = { 1000 }
71+ onChange = { handleChange } // Use the local handleChange
72+ value = { sliderValue } // Connect the value
4173 />
42- </ ThemeProvider > ,
43- ) ;
44- await waitFor ( ( ) => {
45- const slider = screen . getByRole ( "slider" ) ;
46- expect ( slider ) . toBeInTheDocument ( ) ;
47- } ) ;
74+ ) ;
75+ } ;
4876
49- const slider = screen . getByRole ( "slider" ) ;
77+ render ( < TestSlider /> ) ;
78+ const slider = screen . getByTestId ( "sliderId" ) ;
5079 expect ( slider ) . toBeInTheDocument ( ) ;
51-
52- const thumb = document . querySelector ( ".MuiSlider-thumb" ) ;
53- expect ( thumb ) . toBeInTheDocument ( ) ;
80+ expect ( screen . getByRole ( "slider" ) ) . toHaveValue ( "60" ) ;
5481
5582 const input = document . querySelector ( "input" ) ?. value ;
5683 expect ( input ) . toEqual ( "60" ) ;
5784
58- if ( thumb ) {
59- fireEvent . mouseDown ( slider , { clientX : 0.1 } ) ;
60- fireEvent . mouseMove ( slider , { clientX : 0.1 } ) ;
61- fireEvent . mouseUp ( slider ) ;
62- expect ( recordedEvents . length ) . toEqual ( 1 ) ;
63- expect ( recordedEvents [ 0 ] ) . toEqual ( {
64- componentType : "Slider" ,
65- id : "sliderId" ,
66- property : "value" ,
67- value : 2 , //expect.any(Number),
68- } ) ;
69- }
85+ const sliderBounds = {
86+ left : 100 ,
87+ width : 200 ,
88+ top : 0 ,
89+ bottom : 0 ,
90+ height : 20 ,
91+ } ;
92+ vi . spyOn ( slider , "getBoundingClientRect" ) . mockReturnValue (
93+ sliderBounds as DOMRect ,
94+ ) ;
95+
96+ // The value selected should be 100
97+ const clientX = sliderBounds . left + sliderBounds . width * 0.1 ;
98+
99+ fireEvent . mouseDown ( slider , { clientX : clientX } ) ;
100+ fireEvent . mouseMove ( slider , { clientX : clientX } ) ;
101+ fireEvent . mouseUp ( slider ) ;
102+ expect ( recordedEvents . length ) . toEqual ( 1 ) ;
103+
104+ expect ( recordedEvents [ 0 ] ) . toEqual ( {
105+ componentType : "Slider" ,
106+ id : "sliderId" ,
107+ property : "value" ,
108+ value : 100 ,
109+ } ) ;
110+
111+ expect ( screen . getByRole ( "slider" ) ) . toHaveValue ( "100" ) ;
112+ const updated_input = document . querySelector ( "input" ) ;
113+ expect ( updated_input ?. value ) . toEqual ( "100" ) ;
70114 } ) ;
71115} ) ;
0 commit comments