vueless
Version:
Vue Styleless UI Component Library, powered by Tailwind CSS.
315 lines (241 loc) • 8.67 kB
text/typescript
import { flushPromises, mount } from "@vue/test-utils";
import { describe, it, expect } from "vitest";
import UCheckbox from "../UCheckbox.vue";
import UIcon from "../../ui.image-icon/UIcon.vue";
import ULabel from "../../ui.form-label/ULabel.vue";
import type { Props } from "../types.ts";
describe("UCheckbox.vue", () => {
describe("Props", () => {
it("Model Value – sets the correct model value", async () => {
const modelValue = true;
const component = mount(UCheckbox, {
props: {
modelValue,
"onUpdate:modelValue": (e) => component.setProps({ modelValue: e }),
},
});
const inputElement = component.find("input");
await inputElement.trigger("change");
expect(component.emitted("update:modelValue")![0][0]).toBe(false);
await inputElement.trigger("change");
expect(component.emitted("update:modelValue")![1][0]).toBe(true);
});
it("Value – returns correct value type when checkbox is checked", async () => {
const testValues = ["string-value", 42, true, { id: 1, name: "test" }, [1, 2, 3]];
testValues.forEach(async (testValue) => {
const component = mount(UCheckbox, {
props: {
value: testValue,
modelValue: [],
},
});
const inputElement = component.find("input");
await inputElement.setValue(true);
const emittedValues = component.emitted("update:modelValue");
expect(emittedValues![0][0]).toEqual([testValue]);
});
});
it("TrueValue and FalseValue – returns correct values when checkbox is checked and unchecked", async () => {
const testValuePairs = [
{ trueValue: "checked", falseValue: "unchecked" },
{ trueValue: 1, falseValue: 0 },
{ trueValue: { status: "active" }, falseValue: { status: "inactive" } },
{ trueValue: true, falseValue: false },
];
testValuePairs.forEach(async ({ trueValue, falseValue }) => {
const component = mount(UCheckbox, {
props: {
trueValue,
falseValue,
modelValue: falseValue,
},
});
const inputElement = component.find("input");
await inputElement.setValue(true);
let emittedValues = component.emitted("update:modelValue");
expect(emittedValues![0][0]).toEqual(trueValue);
await component.setProps({ modelValue: trueValue });
await inputElement.setValue(false);
emittedValues = component.emitted("update:modelValue");
expect(emittedValues![1][0]).toEqual(falseValue);
});
});
it("Partial – displays correct icon when checkbox is partially checked", () => {
const normalComponent = mount(UCheckbox, {
props: {
modelValue: true,
partial: false,
},
});
const normalIcon = normalComponent.findComponent(UIcon);
expect(normalIcon.props("name")).toBe("check");
const partialComponent = mount(UCheckbox, {
props: {
modelValue: true,
partial: true,
},
});
const partialIcon = partialComponent.findComponent(UIcon);
expect(partialIcon.props("name")).toBe("remove");
});
it("Name – sets the correct name attribute", async () => {
const name = "checkbox-name";
const component = mount(UCheckbox, {
props: {
name,
},
});
await flushPromises();
expect(component.find("input").attributes("name")).toBe(name);
});
it("Label – passes label to ULabel component", () => {
const labelText = "Test Label";
const component = mount(UCheckbox, {
props: {
label: labelText,
},
});
expect(component.getComponent(ULabel).props("label")).toBe(labelText);
});
it("Label Align – passes labelAlign prop to ULabel component", () => {
const labelAlign = "left";
const component = mount(UCheckbox, {
props: {
label: "Test Label",
labelAlign,
},
});
expect(component.getComponent(ULabel).props("align")).toBe(labelAlign);
});
it("Description – passes description to ULabel component", () => {
const descriptionText = "This is a description";
const component = mount(UCheckbox, {
props: {
description: descriptionText,
},
});
expect(component.getComponent(ULabel).props("description")).toBe(descriptionText);
});
it("Size – applies the correct size class", () => {
const size = {
sm: "size-4",
md: "size-5",
lg: "size-6",
};
Object.entries(size).forEach(([size, classes]) => {
const component = mount(UCheckbox, {
props: {
size: size as Props["size"],
},
});
expect(component.get("[vl-key='checkbox']").attributes("class")).toContain(classes);
});
});
it("Color – applies the correct color class when checked", () => {
const colors = [
"primary",
"secondary",
"error",
"warning",
"success",
"info",
"notice",
"neutral",
"grayscale",
];
colors.forEach((color) => {
const component = mount(UCheckbox, {
props: {
color: color as Props["color"],
modelValue: true,
},
});
expect(component.find("label").attributes("class")).toContain(color);
});
});
it("Disabled – applies disabled attribute when disabled prop is true", () => {
const disabledOpacityVar = "--vl-disabled-opacity";
const component = mount(UCheckbox, {
props: {
disabled: true,
},
});
expect(component.find("input").attributes("disabled")).toBeDefined();
const labelComponent = component.findComponent(ULabel);
const checkboxInput = component.get("[vl-key='checkbox']");
expect(labelComponent.props("disabled")).toBe(true);
expect(checkboxInput.attributes("class")).toContain(disabledOpacityVar);
});
it("Id – applies the correct id attribute", () => {
const id = "test-switch-id";
const component = mount(UCheckbox, {
props: {
id,
},
});
expect(component.find("input").attributes("id")).toBe(id);
});
it("Data Test – applies the correct data-test attribute", () => {
const dataTest = "test-checkbox";
const labelDataTest = "test-checkbox-label";
const component = mount(UCheckbox, {
props: {
label: "Test",
dataTest,
},
});
expect(component.findComponent(ULabel).attributes("data-test")).toBe(labelDataTest);
expect(component.get("input").attributes("data-test")).toBe(dataTest);
});
});
describe("Slots", () => {
it("Label – renders custom content from label slot", () => {
const customLabelContent = "Custom Label Content";
const component = mount(UCheckbox, {
props: {
label: "Default Label",
},
slots: {
label: customLabelContent,
},
});
const labelComponent = component.getComponent(ULabel);
const labelElement = labelComponent.find("label");
expect(labelElement.text()).toBe(customLabelContent);
});
it("Label – exposes label prop to slot", () => {
const defaultLabel = "Test Label";
const component = mount(UCheckbox, {
props: {
label: defaultLabel,
},
slots: {
label: "Modified {{ params.label }}",
},
});
const labelComponent = component.getComponent(ULabel);
const labelElement = labelComponent.find("label");
expect(labelElement.text()).toBe(`Modified ${defaultLabel}`);
});
it("Bottom – renders custom content from bottom slot", () => {
const customBottomContent = "Custom Bottom Content";
const component = mount(UCheckbox, {
props: {
label: "Test Label",
},
slots: {
bottom: customBottomContent,
},
});
const labelComponent = component.getComponent(ULabel);
expect(labelComponent.text()).toContain(customBottomContent);
});
});
describe("Events", () => {
it("Input – emits input event when checkbox is toggled", async () => {
const component = mount(UCheckbox);
await component.find("input").setValue(true);
expect(component.emitted("input")![0]).toEqual([true]);
});
});
});