vueless
Version:
Vue Styleless UI Component Library, powered by Tailwind CSS.
300 lines (237 loc) • 7.73 kB
text/typescript
import { mount } from "@vue/test-utils";
import { describe, it, expect, beforeAll } from "vitest";
import UBadge from "../UBadge.vue";
import UIcon from "../../ui.image-icon/UIcon.vue";
import type { Props } from "../types";
describe("UBadge.vue", () => {
let label: string;
beforeAll(() => {
label = "Badge";
});
describe("Props", () => {
it("Variant – applies the correct variant class", async () => {
const variants = {
solid: "text-inverted bg-primary",
outlined: "border-primary text-primary",
subtle: "border-primary/15 text-primary bg-primary/10",
soft: "text-primary bg-primary/10",
};
Object.entries(variants).forEach(([variant, classes]) => {
const component = mount(UBadge, {
props: {
variant: variant as Props["variant"],
color: "primary",
},
});
expect(component.attributes("class")).toContain(classes);
});
});
it("Size – applies the correct size class", async () => {
const size = {
sm: "text-tiny",
md: "text-small",
lg: "text-medium",
};
Object.entries(size).forEach(([size, classes]) => {
const component = mount(UBadge, {
props: {
size: size as Props["size"],
},
});
expect(component.attributes("class")).toContain(classes);
});
});
it("Color – applies the correct color class", async () => {
const colors = [
"primary",
"secondary",
"error",
"warning",
"success",
"info",
"notice",
"neutral",
"grayscale",
];
colors.forEach((color) => {
const component = mount(UBadge, {
props: {
color: color as Props["color"],
},
});
expect(component.attributes("class")).toContain(color);
});
});
it("Label – renders the correct label text", () => {
const component = mount(UBadge, {
props: {
label,
},
});
expect(component.text()).toBe(label);
});
it("Icon – renders icon when icon prop is provided", () => {
const icon = "close";
const component = mount(UBadge, {
props: {
icon,
},
});
const nestedUIconComponents = component.findAllComponents(UIcon);
expect(component.text()).toBe("");
expect(nestedUIconComponents.length).toBe(1);
expect(nestedUIconComponents[0].props("name")).toBe(icon);
});
it("Left – renders left icon when leftIcon prop is provided", () => {
const leftIcon = "close";
const label = "Badge";
const component = mount(UBadge, {
props: {
leftIcon,
label,
},
});
const nestedUIconComponents = component.findAllComponents(UIcon);
expect(component.text()).toContain(label);
expect(nestedUIconComponents.length).toBe(1);
expect(nestedUIconComponents[0].props("name")).toBe(leftIcon);
});
it("Right – renders right icon when rightIcon prop is provided", () => {
const rightIcon = "close";
const label = "Badge";
const component = mount(UBadge, {
props: {
rightIcon,
label,
},
});
const nestedUIconComponents = component.findAllComponents(UIcon);
expect(component.text()).toContain(label);
expect(nestedUIconComponents.length).toBe(1);
expect(nestedUIconComponents[0].props("name")).toBe(rightIcon);
});
it("Round – applies round class when round prop is true", () => {
const round = true;
const roundClasses = "rounded-full";
const component = mount(UBadge, {
props: {
round,
},
});
expect(component.attributes("class")).toContain(roundClasses);
});
it("Tabindex – applies the correct tabindex attribute", () => {
const tabindex = "2";
const component = mount(UBadge, {
props: {
tabindex,
},
});
expect(component.attributes("tabindex")).toBe(tabindex);
});
it("DataTest – applies the correct data-test attribute", () => {
const dataTest = "test-badge";
const component = mount(UBadge, {
props: {
dataTest,
},
});
expect(component.attributes("data-test")).toBe(dataTest);
});
});
describe("Slots", () => {
it("Default – renders content from default slot", () => {
const slotContent = "Custom Content";
const label = "Badge";
const component = mount(UBadge, {
props: {
label,
},
slots: {
default: slotContent,
},
});
expect(component.text()).not.toContain(label);
expect(component.text()).toContain(slotContent);
});
it("Left – renders content from left slot", () => {
const slotText = "Left";
const slotClass = "left-content";
const component = mount(UBadge, {
props: {
label,
},
slots: {
left: `<span class='${slotClass}'>${slotText}</span>`,
},
});
expect(component.text()).toContain(label);
expect(component.find(`.${slotClass}`).exists()).toBe(true);
expect(component.find(`.${slotClass}`).text()).toBe(slotText);
});
it("Right – renders content from right slot", () => {
const slotText = "Right";
const slotClass = "right-content";
const component = mount(UBadge, {
props: {
label,
},
slots: {
right: `<span class='${slotClass}'>${slotText}</span>`,
},
});
expect(component.text()).toContain(label);
expect(component.find(`.${slotClass}`).exists()).toBe(true);
expect(component.find(`.${slotClass}`).text()).toBe(slotText);
});
it("Slot – provides correct bindings to slots", () => {
const icon = "star";
const labelClass = "badge-label";
const iconClass = "badge-icon";
const component = mount(UBadge, {
props: {
label,
icon,
},
slots: {
default: `
<template #default="{ label, iconName }">
<span class="${labelClass}">{{ label }}</span>
<span class="${iconClass}">{{ iconName }}</span>
</template>
`,
},
});
expect(component.find(`.${labelClass}`).text()).toBe(label);
expect(component.find(`.${iconClass}`).text()).toBe(icon);
});
});
describe("Events", () => {
it("Click – emits click event when clicked", async () => {
const component = mount(UBadge, {});
await component.trigger("click");
expect(component.emitted("click")).toBeTruthy();
});
it("Focus – emits focus event when focused", async () => {
const component = mount(UBadge, {});
await component.trigger("focus");
expect(component.emitted("focus")).toBeTruthy();
});
it("Blur – emits blur event when blurred", async () => {
const component = mount(UBadge, {});
await component.trigger("blur");
expect(component.emitted("blur")).toBeTruthy();
});
it("Keydown – emits keydown event when key is pressed", async () => {
const component = mount(UBadge, {});
await component.trigger("keydown");
expect(component.emitted("keydown")).toBeTruthy();
});
});
describe("Exposed refs", () => {
it("wrapperRef – exposes wrapperRef", () => {
const component = mount(UBadge, {});
expect(component.vm.wrapperRef).toBeDefined();
});
});
});