Skip to content

Commit 65c7b17

Browse files
committed
[WIP] Add tests for slider.tsx
1 parent 47868e6 commit 65c7b17

File tree

2 files changed

+137
-6
lines changed

2 files changed

+137
-6
lines changed
Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
import { describe, expect, it } from "vitest";
2+
import { fireEvent, render, screen, waitFor } from "@testing-library/react";
3+
import { Slider } from "./Slider";
4+
import { createChangeHandler } from "@/plugins/mui/common.test";
5+
import "@testing-library/jest-dom";
6+
import { createTheme, ThemeProvider } from "@mui/material";
7+
8+
describe("Slider", () => {
9+
it("should render the Slider component", async () => {
10+
render(
11+
<Slider
12+
id="slider"
13+
type={"Slider"}
14+
min={0}
15+
max={100}
16+
value={50}
17+
onChange={() => {}}
18+
style={{ width: "300px" }}
19+
/>,
20+
);
21+
22+
const slider = await waitFor(() => screen.getByRole("slider"));
23+
expect(slider).toBeDefined();
24+
25+
expect(slider.getAttribute("aria-orientation")).toEqual("horizontal");
26+
expect(slider.getAttribute("min")).toEqual("0");
27+
expect(slider.getAttribute("max")).toEqual("100");
28+
});
29+
30+
it("should fire 'value' property", async () => {
31+
const { recordedEvents, onChange } = createChangeHandler();
32+
const theme = createTheme();
33+
render(
34+
<ThemeProvider theme={theme}>
35+
<Slider
36+
id="sliderId"
37+
type={"Slider"}
38+
ariaLabel={"slider"}
39+
onChange={onChange}
40+
value={60}
41+
/>
42+
</ThemeProvider>,
43+
);
44+
await waitFor(() => {
45+
const slider = screen.getByRole("slider");
46+
expect(slider).toBeInTheDocument();
47+
});
48+
49+
const slider = screen.getByRole("slider");
50+
expect(slider).toBeInTheDocument();
51+
52+
const thumb = document.querySelector(".MuiSlider-thumb");
53+
expect(thumb).toBeInTheDocument();
54+
55+
const input = document.querySelector("input")?.value;
56+
expect(input).toEqual("60");
57+
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+
}
70+
});
71+
});
Lines changed: 66 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,85 @@
11
import MuiSlider from "@mui/material/Slider";
2+
import type { OverridableStringUnion } from "@mui/types";
23

34
import type { ComponentProps, ComponentState } from "@/index";
5+
import type { ReactNode } from "react";
46

5-
interface SliderState extends ComponentState {}
6-
7-
interface SliderProps extends ComponentProps, SliderState {
7+
interface SliderState extends ComponentState {
88
defaultValue?: number;
9+
ariaLabel?: string;
10+
color?: OverridableStringUnion<
11+
"primary" | "secondary" | "success" | "error" | "info" | "warning",
12+
string
13+
>;
14+
disableSwap?: boolean;
15+
getAriaValueText?: (value: number, index: number) => string;
16+
min?: number;
17+
max?: number;
18+
marks?: boolean | { value: number; label?: ReactNode }[];
19+
orientation?: "horizontal" | "vertical";
20+
step?: number;
21+
size?: OverridableStringUnion<"small" | "medium", string>;
22+
track?: "inverted" | "normal" | false;
23+
value?: number | number[];
24+
valueLabelDisplay?: "auto" | "on" | "off";
925
}
1026

27+
interface SliderProps extends ComponentProps, SliderState {}
28+
1129
export const Slider = ({
30+
type,
1231
id,
1332
style,
1433
defaultValue,
15-
// onChange,
34+
ariaLabel,
35+
color,
36+
disableSwap,
37+
getAriaValueText,
38+
min,
39+
max,
40+
marks,
41+
orientation,
42+
step,
43+
size,
44+
track,
45+
value,
46+
valueLabelDisplay,
47+
onChange,
1648
}: SliderProps) => {
49+
const handleSlide = (
50+
_event: Event,
51+
value: number | number[],
52+
_activeThumb: number,
53+
) => {
54+
console.log(_event, value, _activeThumb);
55+
if (id) {
56+
onChange({
57+
componentType: type,
58+
id: id,
59+
property: "value",
60+
value: value,
61+
});
62+
}
63+
};
1764
return (
1865
<MuiSlider
1966
id={id}
20-
style={style}
2167
defaultValue={defaultValue}
22-
// onChange={onChange}
68+
aria-label={ariaLabel}
69+
color={color}
70+
style={style}
71+
disableSwap={disableSwap}
72+
getAriaValueText={getAriaValueText}
73+
min={min}
74+
max={max}
75+
marks={marks}
76+
orientation={orientation}
77+
step={step}
78+
size={size}
79+
track={track}
80+
value={value ?? 0}
81+
valueLabelDisplay={valueLabelDisplay}
82+
onChange={handleSlide}
2383
/>
2484
);
2585
};

0 commit comments

Comments
 (0)