Skip to content

Commit ed04e35

Browse files
committed
Update tests
1 parent 65c7b17 commit ed04e35

File tree

2 files changed

+89
-38
lines changed

2 files changed

+89
-38
lines changed
Lines changed: 81 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,13 @@
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";
33
import { Slider } from "./Slider";
4-
import { createChangeHandler } from "@/plugins/mui/common.test";
54
import "@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

89
describe("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
});

chartlets.js/packages/lib/src/plugins/mui/Slider.tsx

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ interface SliderState extends ComponentState {
2222
track?: "inverted" | "normal" | false;
2323
value?: number | number[];
2424
valueLabelDisplay?: "auto" | "on" | "off";
25+
["data-testid"]?: string;
2526
}
2627

2728
interface SliderProps extends ComponentProps, SliderState {}
@@ -45,13 +46,18 @@ export const Slider = ({
4546
value,
4647
valueLabelDisplay,
4748
onChange,
49+
...props
4850
}: SliderProps) => {
51+
// We need to drop children prop because we want to access the data-testid for
52+
// tests and slider does not accept children components
53+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
54+
const { children: _, ...sliderProps } = props;
55+
4956
const handleSlide = (
5057
_event: Event,
5158
value: number | number[],
5259
_activeThumb: number,
5360
) => {
54-
console.log(_event, value, _activeThumb);
5561
if (id) {
5662
onChange({
5763
componentType: type,
@@ -63,6 +69,7 @@ export const Slider = ({
6369
};
6470
return (
6571
<MuiSlider
72+
{...sliderProps}
6673
id={id}
6774
defaultValue={defaultValue}
6875
aria-label={ariaLabel}

0 commit comments

Comments
 (0)