/**
* @jest-environment jsdom
*/
import { Application } from "stimulus";
import toggle_controller from "../../../app/webpacker/controllers/toggle_control_controller";
describe("ToggleControlController", () => {
beforeAll(() => {
const application = Application.start();
application.register("toggle-control", toggle_controller);
});
describe("#disableIfPresent", () => {
describe("with checkbox", () => {
beforeEach(() => {
document.body.innerHTML = `
`;
});
it("Disables when checkbox is checked", () => {
checkbox.click();
expect(checkbox.checked).toBe(true);
expect(control.disabled).toBe(true);
});
it("Enables when checkbox is un-checked", () => {
checkbox.click();
checkbox.click();
expect(checkbox.checked).toBe(false);
expect(control.disabled).toBe(false);
});
});
describe("with input", () => {
beforeEach(() => {
document.body.innerHTML = `
`;
});
it("Disables when input is filled", () => {
input.value = "test";
input.dispatchEvent(new Event("input"));
expect(control.disabled).toBe(true);
});
it("Enables when input is emptied", () => {
input.value = "test";
input.dispatchEvent(new Event("input"));
input.value = "";
input.dispatchEvent(new Event("input"));
expect(control.disabled).toBe(false);
});
});
});
describe("#enableIfPresent", () => {
describe("with input", () => {
beforeEach(() => {
document.body.innerHTML = `
`;
});
it("Enables when input is filled and focuses the control", () => {
input.value = "a";
input.dispatchEvent(new Event("input"));
expect(control.disabled).toBe(false);
expect(document.activeElement).toBe(control);
});
it("Disables when input is emptied", () => {
input.value = "test";
input.dispatchEvent(new Event("input"));
input.value = "";
input.dispatchEvent(new Event("input"));
expect(control.disabled).toBe(true);
});
});
describe("with button as control target", () => {
beforeEach(() => {
document.body.innerHTML = `
`;
});
it("Enables the button control when input is filled, focus remains on input", () => {
// Simulating click on input to focus it
input.focus();
input.value = "test";
input.dispatchEvent(new Event("input"));
expect(control.disabled).toBe(false);
expect(document.activeElement).toBe(input);
});
it("Disables the button control when input is emptied, focus remains on input", () => {
// Simulating click on input to focus it
input.focus();
input.value = "test";
input.dispatchEvent(new Event("input"));
input.value = "";
input.dispatchEvent(new Event("input"));
expect(control.disabled).toBe(true);
expect(document.activeElement).toBe(input);
});
});
});
describe("#displayIfMatch", () => {
describe("with select", () => {
beforeEach(() => {
document.body.innerHTML = `
`;
});
it("Shows when match is selected", () => {
select.value = "items";
select.dispatchEvent(new Event("change"));
expect(control.style.display).toBe("block");
});
it("Hides when match is not selected", () => {
select.value = "weight_1";
select.dispatchEvent(new Event("change"));
expect(control.style.display).toBe("none");
});
});
});
describe("#toggleDisplay", () => {
beforeEach(() => {
document.body.innerHTML = ``;
});
it("toggles the content", () => {
const button = document.getElementById("button");
const content = document.getElementById("content");
expect(content.style.display).toBe("");
button.click();
expect(content.style.display).toBe("block");
});
});
describe("#toggleAdvancedSettings", () => {
beforeEach(() => {
document.body.innerHTML = `
...
`;
});
it("clicking a toggle switches the visibility of the :data-remote-toggle-selector element", () => {
const button = document.getElementById("remote-toggle");
const content = document.getElementById("content");
expect(content.style.display).toBe("");
button.click();
expect(content.style.display).toBe("none");
button.click();
expect(content.style.display).toBe("block");
});
it("clicking a toggle with a chevron icon switches the visibility of content and the direction of the icon", () => {
const button = document.getElementById("remote-toggle-with-chevron");
const chevron = button.querySelector("i");
const content = document.getElementById("content");
expect(content.style.display).toBe("");
expect(chevron.className).toBe("icon-chevron-down");
button.click();
expect(content.style.display).toBe("none");
expect(chevron.className).toBe("icon-chevron-up");
button.click();
expect(content.style.display).toBe("block");
expect(chevron.className).toBe("icon-chevron-down");
});
});
});