@oruga-ui/oruga-next
Version:
UI components for Vue.js and CSS framework agnostic
225 lines (169 loc) • 6.73 kB
text/typescript
import { createVNode, h } from "vue";
import { describe, test, expect, afterEach, vi, beforeEach } from "vitest";
import { enableAutoUnmount, flushPromises } from "@vue/test-utils";
import InstanceRegistry from "../InstanceRegistry";
import ComponentProgrammatic from "../useProgrammatic";
describe("useProgrammatic tests", () => {
beforeEach(() => {
vi.useFakeTimers();
});
afterEach(() => {
// clear body after each test
document.body.innerHTML = "";
vi.useRealTimers();
});
enableAutoUnmount(afterEach);
test("test mounting component correctly", async () => {
const component = createVNode({
template: `<button id="mycomp"></button>`,
});
// open element
const { close, promise } = ComponentProgrammatic.open(component);
// check promise get called
const handler = vi.fn();
promise.then(() => handler());
expect(handler).not.toHaveBeenCalled();
// check element exist
let el = document.body.querySelector("#mycomp");
expect(el).not.toBeNull();
// close element through handler
close();
vi.runAllTimers();
// check element does not exist
el = document.body.querySelector("#mycomp");
expect(el).toBeNull();
await flushPromises(); // await promise finished
expect(handler).toHaveBeenCalledOnce();
});
test("test mounting with target correctly", async () => {
const container = document.createElement("div");
container.id = "my-cool-container";
document.body.appendChild(container);
const component = createVNode({
template: `<button id="mycomp"></button>`,
});
// open element
const { close } = ComponentProgrammatic.open(component, {
target: "#my-cool-container",
});
// check element exist
let el = document.body.querySelector("#mycomp");
expect(el).not.toBeNull();
let bodyElements = document.body.querySelectorAll("body > *");
expect(bodyElements).toHaveLength(1);
// close element through handler
close();
vi.runAllTimers();
// check element does not exist
el = document.body.querySelector("#mycomp");
expect(el).toBeNull();
// check container still exists
bodyElements = document.body.querySelectorAll("body > *");
expect(bodyElements).toHaveLength(1);
});
test("test close event working correctly", async () => {
const component = createVNode({
template: `<button id="mycomp" @click="$emit('close', 'abc')"></button>`,
});
const onClose = vi.fn();
// open element
ComponentProgrammatic.open(component, { onClose });
// check element exist
let el = document.body.querySelector("button");
expect(el).not.toBeNull();
// close element through click
el?.click();
vi.runAllTimers();
// check element does not exist
el = document.body.querySelector("button");
expect(el).toBeNull();
expect(onClose).toHaveBeenCalledOnce();
});
test("test props working correctly", async () => {
const component = createVNode({
template: `<button id="mycomp"></button>`,
});
// open element
const { close } = ComponentProgrammatic.open(component, {
props: { "data-oruga": "programmatic" },
});
// check element exist
let el = document.body.querySelector<HTMLButtonElement>(
'[data-oruga="programmatic"]',
);
expect(el).not.toBeNull();
// close element through click
close();
vi.runAllTimers();
// check element does not exist
el = document.body.querySelector<HTMLButtonElement>(
'[data-oruga="programmatic"]',
);
expect(el).toBeNull();
});
test("test using custom instance registry", async () => {
const instanceRegistry = new InstanceRegistry();
expect(instanceRegistry.entries).toHaveLength(0);
const { close } = ComponentProgrammatic.open("div", {
registry: instanceRegistry,
});
expect(instanceRegistry.entries).toHaveLength(1);
close();
vi.runAllTimers();
expect(instanceRegistry.entries).toHaveLength(0);
});
test("test closeAll is working correctly", async () => {
const root = document.createElement("div");
// open elements
ComponentProgrammatic.open("div", { target: root });
ComponentProgrammatic.open("div", { target: root });
let apps = root.querySelectorAll("#programmatic-app");
expect(apps).toHaveLength(2);
// close all elements
ComponentProgrammatic.closeAll();
vi.runAllTimers();
// check elements are removed
apps = root.querySelectorAll("#programmatic-app");
expect(apps).toHaveLength(0);
});
test("test close last is working correctly", async () => {
// open elements
ComponentProgrammatic.open("div");
ComponentProgrammatic.open("div");
let bodyElements = document.body.querySelectorAll("#programmatic-app");
expect(bodyElements).toHaveLength(2);
// close last element
ComponentProgrammatic.close();
vi.runAllTimers();
bodyElements = document.body.querySelectorAll("#programmatic-app");
expect(bodyElements).toHaveLength(1);
// close last element
ComponentProgrammatic.close();
vi.runAllTimers();
bodyElements = document.body.querySelectorAll("#programmatic-app");
expect(bodyElements).toHaveLength(0);
});
test("test render slot correctly", async () => {
// create inner slot element
const slot = h("p", { "data-oruga": "inner-slot" }, "HELP");
const component = createVNode(
{ template: `<button id="mycomp"><slot /></button>` },
null,
() => slot,
);
// open elements
const { close } = ComponentProgrammatic.open(component);
// check element exist
const button = document.body.querySelector("button");
expect(button).not.toBeNull();
// check if slot element exist
expect(button?.innerHTML).toBe(`<p data-oruga="inner-slot">HELP</p>`);
const innerSlot = document.body.querySelector(
'[data-oruga="inner-slot"]',
);
expect(innerSlot).not.toBeNull();
// close element
close();
vi.runAllTimers();
});
});