import { mount, signal } from "$volt";
import { describe, expect, it } from "vitest";
describe("integration: mount", () => {
it("creates a reactive counter", () => {
const container = document.createElement("div");
container.innerHTML = `
`;
const count = signal(0);
const countClass = signal({ positive: false, zero: true });
mount(container, { count, countClass });
const textElement = container.querySelector("p:first-child");
const classElement = container.querySelector("p:last-child");
expect(textElement?.textContent).toBe("0");
expect(classElement?.classList.contains("zero")).toBe(true);
expect(classElement?.classList.contains("positive")).toBe(false);
count.set(5);
countClass.set({ positive: true, zero: false });
expect(textElement?.textContent).toBe("5");
expect(classElement?.classList.contains("zero")).toBe(false);
expect(classElement?.classList.contains("positive")).toBe(true);
});
it("handles complex nested structures", () => {
const container = document.createElement("div");
container.innerHTML = `
Title
`;
const title = signal("My App");
const items = { first: "Item 1", second: "Item 2" };
const footer = signal("© 2025");
mount(container, { title, items, footer });
expect(container.querySelector("[data-volt-text='title']")?.textContent).toBe("My App");
expect(container.querySelector("li:first-child")?.textContent).toBe("Item 1");
expect(container.querySelector("li:last-child")?.textContent).toBe("Item 2");
expect(container.querySelector("footer")?.innerHTML).toBe("© 2025");
title.set("Updated App");
footer.set("New Footer");
expect(container.querySelector("[data-volt-text='title']")?.textContent).toBe("Updated App");
expect(container.querySelector("footer")?.innerHTML).toBe("New Footer");
});
it("properly cleans up all bindings", () => {
const container = document.createElement("div");
container.innerHTML = `
A
B
C
`;
const a = signal("A");
const b = signal("B");
const c = signal("C");
const cleanup = mount(container, { a, b, c });
const divs = [...container.querySelectorAll("div")];
expect(divs[0]?.textContent).toBe("A");
expect(divs[1]?.textContent).toBe("B");
expect(divs[2]?.textContent).toBe("C");
a.set("A1");
b.set("B1");
c.set("C1");
expect(divs[0]?.textContent).toBe("A1");
expect(divs[1]?.textContent).toBe("B1");
expect(divs[2]?.textContent).toBe("C1");
cleanup();
a.set("A2");
b.set("B2");
c.set("C2");
expect(divs[0]?.textContent).toBe("A1");
expect(divs[1]?.textContent).toBe("B1");
expect(divs[2]?.textContent).toBe("C1");
});
it("supports mixed static and reactive values", () => {
const container = document.createElement("div");
container.innerHTML = `
Title
Content
Visible
`;
const staticTitle = "Welcome";
const dynamicContent = signal("Loading...");
mount(container, { staticTitle, dynamicContent });
expect(container.querySelector("h1")?.textContent).toBe("Welcome");
expect(container.querySelector("p")?.textContent).toBe("Loading...");
expect(container.querySelector("span")?.classList.contains("always-visible")).toBe(true);
dynamicContent.set("Content loaded!");
expect(container.querySelector("p")?.textContent).toBe("Content loaded!");
});
});