vueless
Version:
Vue Styleless UI Component Library, powered by Tailwind CSS.
205 lines (164 loc) • 5.5 kB
text/typescript
import { mount } from "@vue/test-utils";
import { describe, it, expect } from "vitest";
import UGroup from "../UGroup.vue";
import UHeader from "../../ui.text-header/UHeader.vue";
describe("UGroup", () => {
// Props
describe("Props", () => {
// Title prop
it("renders with title prop", () => {
const title = "Group Title";
const component = mount(UGroup, {
props: {
title,
},
});
const header = component.findComponent(UHeader);
expect(header.exists()).toBe(true);
expect(header.props("label")).toBe(title);
});
// Title prop - no header without a title
it("does not show header when title prop is not provided", () => {
const component = mount(UGroup);
const header = component.findComponent(UHeader);
expect(header.exists()).toBe(false);
});
// Upperlined prop
it("applies upperlined class when upperlined prop is true", () => {
const upperlined = true;
const title = "Group Title";
const expectedClass = "border-t";
const component = mount(UGroup, {
props: {
title,
upperlined,
},
});
const header = component.find("[vl-key='header']");
expect(header.exists()).toBe(true);
expect(header.classes()).toContain(expectedClass);
});
// Underlined prop
it("applies underlined class when underlined prop is true", () => {
const underlined = true;
const title = "Group Title";
const expectedClass = "border-b";
const component = mount(UGroup, {
props: {
title,
underlined,
},
});
const header = component.find("[vl-key='header']");
expect(header.exists()).toBe(true);
expect(header.classes()).toContain(expectedClass);
});
// DataTest prop
it("applies data-test attribute", () => {
const dataTest = "group-test";
const component = mount(UGroup, {
props: {
dataTest,
},
});
expect(component.attributes("data-test")).toBe(dataTest);
});
});
// Slots
describe("Slots", () => {
// Default slot
it("renders content in default slot", () => {
const slotClass = "default-content";
const slotContent = "Default Content";
const component = mount(UGroup, {
slots: {
default: `<div class="${slotClass}">${slotContent}</div>`,
},
});
expect(component.find(`.${slotClass}`).exists()).toBe(true);
expect(component.text()).toContain(slotContent);
});
// Title slot
it("renders custom content in title slot", () => {
const title = "Group Title";
const slotClass = "custom-title";
const slotContent = "Custom Title";
const component = mount(UGroup, {
props: { title },
slots: {
title: `<div class="${slotClass}">${slotContent}</div>`,
},
});
expect(component.find(`.${slotClass}`).exists()).toBe(true);
expect(component.text()).toContain(slotContent);
expect(component.findComponent(UHeader).exists()).toBe(false);
});
it("provides title binding to title slot", () => {
const title = "Group Title";
const component = mount(UGroup, {
props: { title },
slots: {
title: `
<template #default="{ title }">
<div class="custom-title" :data-title="title"></div>
</template>
`,
},
});
const titleElement = component.find(".custom-title");
expect(titleElement.exists()).toBe(true);
expect(titleElement.attributes("data-title")).toBe(title);
});
// Before-title slot
it("renders content in before-title slot", () => {
const title = "Group Title";
const slotClass = "before-title";
const slotContent = "Before Title";
const component = mount(UGroup, {
props: { title },
slots: {
"before-title": `<div class="${slotClass}">${slotContent}</div>`,
},
});
expect(component.find(`.${slotClass}`).exists()).toBe(true);
expect(component.text()).toContain(slotContent);
});
// After-title slot
it("renders content in after-title slot", () => {
const title = "Group Title";
const slotClass = "after-title";
const slotContent = "After Title";
const component = mount(UGroup, {
props: { title },
slots: {
"after-title": `<div class="${slotClass}">${slotContent}</div>`,
},
});
expect(component.find(`.${slotClass}`).exists()).toBe(true);
expect(component.text()).toContain(slotContent);
});
// Actions slot
it("renders content in actions slot", () => {
const title = "Group Title";
const slotClass = "actions";
const slotContent = "Actions";
const component = mount(UGroup, {
props: { title },
slots: {
actions: `<div class="${slotClass}">${slotContent}</div>`,
},
});
expect(component.find(`.${slotClass}`).exists()).toBe(true);
expect(component.text()).toContain(slotContent);
});
});
// Exposed refs
describe("Exposed refs", () => {
// WrapperRef
it("exposes wrapperRef", () => {
const component = mount(UGroup);
expect(component.vm.wrapperRef).toBeDefined();
expect(component.vm.wrapperRef instanceof HTMLDivElement).toBe(true);
});
});
});