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,
onValueChange: (): any => null,
};
const button1 = {
command: "SHRINK",
style: { padding: 35 },
icon: "TestingIcon",
};
const button2 = {
command: "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 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 onValueChange = jest.fn();
const { debug, getByTestId, queryByText } = render(
);
fireEvent.click(getByTestId("ButtonSliderGroup-Button1"));
expect(queryByText(button1.icon)).not.toBe(null);
expect(onValueChange.mock.calls[0][0]).toBe(button1.command);
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 onValueChange = jest.fn();
render(
document.write(value)}
/>
);
fireEvent.click(screen.getByTestId("ButtonSliderGroup-Button2"));
expect(screen.queryByText(button2.icon)).not.toBe(null);
expect(onValueChange.mock.calls[0][0]).toBe(button2.command);
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);
});
});
describe(" Events >", () => {
afterEach(cleanup);
it(`Should trigger the onValueChange() event with the new value when either of the buttons are clicked`, () => {
const onValueChange = jest.fn();
// render the component
const { container, debug } = render(
);
// click one of the buttons
fireEvent.click(screen.getByTestId("ButtonSliderGroup-Button1"));
// confirm that the onValueChange event was fired and the value was passed
expect(onValueChange.mock.calls[0][0]).toBe(button1.command);
});
it(`Should trigger the onValueChange() event with the new value when the slider is moved`, () => {
const value = 66;
const onValueChange = jest.fn();
// render the component
const { container, debug } = render(
);
// change the slider position
fireEvent.click(screen.getByTestId("__testSliderValueUpdate"));
// console.log(onValueChange.mock.calls);
// confirm that the onValueChange event was fired and the value was passed
expect(onValueChange.mock.calls[0][1]).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)`, () => {});
});