import * as React from "react";
import { render, screen, fireEvent, cleanup } from "@testing-library/react";
import ButtonSliderGroup from "./ButtonSliderGroup";
const props = {
value: 10,
maxValue: 95,
minValue: 0,
onChange: (): any => null,
};
const button1 = {
value: 23,
style: { padding: 35 },
icon: "TestingIcon",
};
const button2 = {
value: "GROW",
style: { padding: 25 },
icon: "ButtonTwoIconTest",
};
const getSliderValue = (container) => {
return parseInt(container.querySelectorAll("input[type='hidden']")[0].value);
};
describe(" Rendering >", () => {
afterEach(cleanup);
it(`Should render component in the dom`, () => {
render();
expect(screen.getByTestId("ButtonSliderGroup")).not.toBe(null);
});
it(`Should render a _Max Value_ checkbox when the showMaxCheck prop is true`, () => {
render();
expect(screen.queryByTestId("ButtonSliderGroup-maxCheck")).toBeTruthy();
});
it(`Should render the _Auto Set_ checkbox when the showAutoCheck prop is set to true`, () => {
render();
expect(screen.queryByTestId("ButtonSliderGroup-autoCheck")).toBeTruthy();
});
it("Should render a slider if the showSlider prop is set to true", () => {
render();
expect(screen.queryByTestId("ButtonSliderGroup-slider")).toBeTruthy();
});
it(`Slider should be positioned at the value provided in the prop`, () => {
const value = 50;
const { container } = render(
);
const sliderValue = getSliderValue(container);
expect(sliderValue).toBe(value);
});
it(`Should not show a slider when the showSlider prop is set to false`, () => {
render();
expect(screen.queryByTestId("ButtonSliderGroup-slider")).toBe(null);
});
it(`Should show a label caption for the group using the label prop`, () => {
const randomText = Math.random()
.toString(36)
.slice(2);
render();
expect(screen.getByText(randomText)).not.toBe(null);
});
it(`Should render a button with the value, style, events, icon attributes provided in the button1 prop`, () => {
const onChange = jest.fn();
const { debug, getByTestId, queryByText } = render(
);
fireEvent.click(getByTestId("ButtonSliderGroup-Button1"));
expect(queryByText(button1.icon)).not.toBe(null);
expect(onChange.mock.calls[0][0]).toBe(button1.value);
expect(getByTestId("ButtonSliderGroup-Button1").getAttribute("style")).toBe(
`padding: ${button1.style.padding}px;`
);
});
it(`Should render a button with the value, style, events, icon attributes provided in the button2 prop`, () => {
const onChange = jest.fn();
render(
document.write(value)}
/>
);
fireEvent.click(screen.getByTestId("ButtonSliderGroup-Button2"));
expect(screen.queryByText(button2.icon)).not.toBe(null);
expect(onChange.mock.calls[0][0]).toBe(button2.value);
expect(
screen.getByTestId("ButtonSliderGroup-Button2").getAttribute("style")
).toBe(`padding: ${button2.style.padding}px;`);
});
it(`Should not allow any values below the provided minValue prop`, () => {
const { container } = render(
);
expect(getSliderValue(container)).toBe(44);
});
it(`Should not allow any values above the provided maxValue prop`, () => {
const { container } = render(
);
expect(getSliderValue(container)).toBe(75);
});
test.skip(`Should show a tooltip when the group is hovered over`, () => {});
});
describe(" Actions >", () => {
afterEach(cleanup);
// it(`Should set the value to the autoCheckValue prop's value when the _Auto_ checkbox is checked`, () => {
// expect(true).toBe(false);
// });
it(`Should set the value to the maxCheckValue prop's value when the _Max_ checkbox is checked`, () => {
// render it
const { container, debug } = render(
);
// click the checkbox
fireEvent.click(container.querySelectorAll("input[type='checkbox']")[0]);
// confirm that the value is the maxValue
expect(getSliderValue(container)).toBe(props.maxValue);
});
it(`Should immediately uncheck the MaxCheck checkbox when the button is clicked or slider is changed`, () => {
// render it
const { container, debug } = render(
);
// click the max check box (on)
fireEvent.click(container.querySelectorAll('input[type="checkbox"]')[0]);
// confirm that the max checkbox is on
expect(getSliderValue(container)).toBe(props.maxValue);
expect(
screen.getByTestId("ButtonSliderGroup-maxCheck").getAttribute("class")
).toContain("Mui-checked");
// set the slider value
fireEvent.click(screen.getByTestId("__testSliderValueUpdate"));
// confirm that the max checkbox is off
expect(
screen.getByTestId("ButtonSliderGroup-maxCheck").getAttribute("class")
).not.toContain("Mui-checked");
});
it(`Should immediately uncheck the AutoCheck checkbox when the button is clicked or slider is changed`, () => {
// render it
const { container, debug } = render(
);
// click the max check box (on)
fireEvent.click(container.querySelectorAll('input[type="checkbox"]')[0]);
// confirm that the auto check checkbox is on
expect(
screen.getByTestId("ButtonSliderGroup-autoCheck").getAttribute("class")
).toContain("Mui-checked");
// set the slider value
fireEvent.click(screen.getByTestId("__testSliderValueUpdate"));
// confirm that the autoCheck checkbox is off
expect(
screen.getByTestId("ButtonSliderGroup-autoCheck").getAttribute("class")
).not.toContain("Mui-checked");
});
it(`Should automatically check the MaxCheck Checkbox when the slider is at the maximum position`, () => {
// render it normally
const { container, debug } = render(
);
// set the slider to the max position
fireEvent.click(screen.getByTestId("__testSliderValueUpdate"));
// confirm that the checkbox is on
expect(
screen.getByTestId("ButtonSliderGroup-maxCheck").getAttribute("class")
).toContain("Mui-checked");
});
it(`Should position the value of the slider to the max position if the MaxCheck checkbox is checked`, () => {
// render the component
const { container, debug } = render(
);
// click the max checkbox
fireEvent.click(container.querySelectorAll('input[type="checkbox"]')[0]);
// confirm that the slider value is the same as the max value
expect(getSliderValue(container)).toBe(props.maxValue);
});
it(`Should revert the value back to the original value if the _Auto_ checkbox is un-checked`, () => {
const value = 64;
// render the component
const { container, debug } = render(
);
// click the autocheck checkbox
fireEvent.click(container.querySelectorAll('input[type="checkbox"]')[0]);
// confirm that the slider value matches the originalValue prop
expect(getSliderValue(container)).toBe(value);
});
});
describe(" Events >", () => {
afterEach(cleanup);
it(`Should trigger the onChange() event with the new value when either of the buttons are clicked`, () => {
const onChange = jest.fn();
// render the component
const { container, debug } = render(
);
// click one of the buttons
fireEvent.click(screen.getByTestId("ButtonSliderGroup-Button1"));
// confirm that the onChange event was fired and the value was passed
expect(onChange.mock.calls[0][0]).toBe(button1.value);
});
it(`Should trigger the onChange() event with the new value when the slider is moved`, () => {
const value = 66;
const onChange = jest.fn();
// render the component
const { container, debug } = render(
);
// change the slider position
fireEvent.click(screen.getByTestId("__testSliderValueUpdate"));
// confirm that the onChange event was fired and the value was passed
expect(onChange.mock.calls[0][0]).toBe(value);
});
});
describe(" Hooks >", () => {
afterEach(cleanup);
test.skip(`Should trigger the _onButtonSliderGroupRender_ plugin hook when the ButtonSliderGroup component renders`, () => {});
test.skip(`Should trigger the _onButtonSliderGroupChange_ plugin hook when the value of the ButtonSliderGroup property changes`, () => {});
test.skip(`Should trigger the onButtonSliderGroupFinish plugin hook when the mouse button is released (on the button or slider)`, () => {});
});