import { useState } from "react";
import { CheckboxOption } from "../../src/components/ui/Checkbox";
// First real component test — mounts CheckboxOption in isolation (no
// router, no backend), unlike everything under cypress/e2e/ which always
// visits a full routed page. See cypress.config.ts's `component` block.
describe("CheckboxOption", () => {
it("renders its label content", () => {
cy.mount(
{}}>
Végétarien
,
);
cy.contains("label", "Végétarien").should("be.visible");
});
it("reflects the checked prop on the native input, and the is-selected class", () => {
cy.mount(
{}}>
Végétarien
,
);
cy.get("input[type=checkbox]").should("not.be.checked");
cy.get("label").should("not.have.class", "is-selected");
cy.mount(
{}}>
Végétarien
,
);
cy.get("input[type=checkbox]").should("be.checked");
cy.get("label").should("have.class", "is-selected");
});
it("calls onChange with the toggled value when clicked", () => {
const onChange = cy.stub().as("onChange");
cy.mount(
Végétarien
,
);
cy.get("input[type=checkbox]").click();
cy.get("@onChange").should("have.been.calledOnceWith", true);
});
it("is a controlled component — stays checked only while the parent says so", () => {
// A tiny stateful wrapper, since CheckboxOption itself takes no
// internal state — this is what actually exercises the checked/onChange
// contract the way a real caller (AllergySelect, the theme picker…)
// would.
function Wrapper() {
const [checked, setChecked] = useState(false);
return (
Végétarien
);
}
cy.mount();
cy.get("input[type=checkbox]").should("not.be.checked").click();
cy.get("input[type=checkbox]").should("be.checked");
});
});