import { describe, it, expect, vi, beforeEach, afterEach } from "vitest";
import { Render } from "./index";
import { Late, Of } from "silentium";
vi.mock("morphdom", () => ({
default: vi.fn((node, html) => {
node.innerHTML = html;
return node;
}),
}));
describe("Render function", () => {
let rootElement: HTMLElement;
let testContainer: HTMLDivElement;
beforeEach(() => {
testContainer = document.createElement("div");
document.body.appendChild(testContainer);
rootElement = document.createElement("div");
testContainer.appendChild(rootElement);
});
afterEach(() => {
document.body.removeChild(testContainer);
vi.clearAllMocks();
});
it("should create a child div and render HTML content", async () => {
const htmlContent = '
Hello World
';
const htmlMessage = Of(htmlContent);
const rootMessage = Of(rootElement);
const resultMessage = Render(rootMessage, htmlMessage);
const renderedElementPromise = new Promise((resolve) => {
resultMessage.then((element) => {
resolve(element);
});
});
const renderedElement = await Promise.race([
renderedElementPromise,
new Promise((_, reject) =>
setTimeout(() => reject(new Error("Timeout")), 100),
),
]);
expect(renderedElement).toBeTruthy();
expect(renderedElement.tagName).toBe("DIV");
expect(renderedElement.innerHTML).toBe(htmlContent);
});
it("should handle null root element gracefully", async () => {
const htmlContent = "Test";
const htmlMessage = Of(htmlContent);
const nullRootMessage = Of(null as any as HTMLElement);
const resultMessage = Render(nullRootMessage, htmlMessage);
const renderedElementPromise = new Promise(
(resolve) => {
resultMessage
.then((element) => {
resolve(element);
})
.catch(() => {
resolve(null);
});
},
);
const renderedElement = await Promise.race([
renderedElementPromise,
new Promise((resolve) =>
setTimeout(() => resolve(null), 100),
),
]);
expect(renderedElement).toBeNull();
});
it("should update content when HTML message changes", async () => {
const currentHtml = "Initial";
const htmlMessage = Late(currentHtml);
const rootMessage = Of(rootElement);
const resultMessage = Render(rootMessage, htmlMessage);
expect((await resultMessage).outerHTML).toBe("Initial
");
htmlMessage.use("Changed!");
expect((await resultMessage).outerHTML).toBe("Changed!
");
});
it("section tag", async () => {
const currentHtml = "";
const rootMessage = Of(rootElement);
const resultMessage = Render(rootMessage, Of(currentHtml));
expect((await resultMessage).outerHTML).toBe(
"",
);
});
});