import { resolve } from "node:path";
import { describe, expect, it, vi } from "vitest";
import { render, fireEvent } from "@testing-library/preact";
import { Slider } from "./Slider.js";
describe("Slider", () => {
it("renders a range input", () => {
const { getByRole } = render();
expect(getByRole("slider")).toBeTruthy();
});
it("has correct default min/max/step", () => {
const { getByRole } = render();
const slider = getByRole("slider");
expect(slider).toHaveAttribute("min", "0");
expect(slider).toHaveAttribute("max", "100");
expect(slider).toHaveAttribute("step", "1");
});
it("accepts custom min/max/step", () => {
const { getByRole } = render(
);
const slider = getByRole("slider");
expect(slider).toHaveAttribute("min", "10");
expect(slider).toHaveAttribute("max", "50");
expect(slider).toHaveAttribute("step", "5");
});
it("calls onChange on input", () => {
const onChange = vi.fn();
const { getByRole } = render(
);
fireEvent.change(getByRole("slider"), { target: { value: "50" } });
expect(onChange).toHaveBeenCalled();
});
it("sets disabled attribute when disabled", () => {
const { getByRole } = render();
expect(getByRole("slider")).toBeDisabled();
});
it("applies disabled class to wrapper when disabled", () => {
const { container } = render();
expect(container.querySelector(".strand-slider--disabled")).toBeTruthy();
});
it("sets value on the input", () => {
const { getByRole } = render();
expect((getByRole("slider") as HTMLInputElement).value).toBe("42");
});
it("has aria-valuemin attribute", () => {
const { getByRole } = render();
expect(getByRole("slider")).toHaveAttribute("aria-valuemin", "5");
});
it("has aria-valuemax attribute", () => {
const { getByRole } = render();
expect(getByRole("slider")).toHaveAttribute("aria-valuemax", "200");
});
it("has aria-valuenow attribute", () => {
const { getByRole } = render();
expect(getByRole("slider")).toHaveAttribute("aria-valuenow", "75");
});
it("forwards ref to input element", () => {
let inputEl: HTMLInputElement | null = null;
render(
{ inputEl = el; }}
/>
);
expect(inputEl).toBeInstanceOf(HTMLInputElement);
});
});
import { snapshotFixtures } from "../../test/snapshot.js";
import { snapshotStylesheet } from "../../test/stylesheet.js";
import { fixtures } from "./Slider.fixtures.js";
snapshotFixtures(Slider, fixtures);
snapshotStylesheet(resolve(__dirname, "./Slider.css"));