77 lines
2.2 KiB
TypeScript
77 lines
2.2 KiB
TypeScript
import { createRoot } from "solid-js";
|
|
import { describe, expect, it, vi } from "vitest";
|
|
import { createDisclosureState } from "../../src/primitives/create-disclosure-state";
|
|
|
|
describe("createDisclosureState", () => {
|
|
it("starts closed by default", () => {
|
|
createRoot((dispose) => {
|
|
const state = createDisclosureState({});
|
|
expect(state.isOpen()).toBe(false);
|
|
dispose();
|
|
});
|
|
});
|
|
|
|
it("respects defaultOpen", () => {
|
|
createRoot((dispose) => {
|
|
const state = createDisclosureState({ defaultOpen: true });
|
|
expect(state.isOpen()).toBe(true);
|
|
dispose();
|
|
});
|
|
});
|
|
|
|
it("open() sets state to true", () => {
|
|
createRoot((dispose) => {
|
|
const state = createDisclosureState({});
|
|
state.open();
|
|
expect(state.isOpen()).toBe(true);
|
|
dispose();
|
|
});
|
|
});
|
|
|
|
it("close() sets state to false", () => {
|
|
createRoot((dispose) => {
|
|
const state = createDisclosureState({ defaultOpen: true });
|
|
state.close();
|
|
expect(state.isOpen()).toBe(false);
|
|
dispose();
|
|
});
|
|
});
|
|
|
|
it("toggle() flips state", () => {
|
|
createRoot((dispose) => {
|
|
const state = createDisclosureState({});
|
|
state.toggle();
|
|
expect(state.isOpen()).toBe(true);
|
|
state.toggle();
|
|
expect(state.isOpen()).toBe(false);
|
|
dispose();
|
|
});
|
|
});
|
|
|
|
it("calls onOpenChange when state changes", () => {
|
|
createRoot((dispose) => {
|
|
const onChange = vi.fn();
|
|
const state = createDisclosureState({ onOpenChange: onChange });
|
|
state.open();
|
|
expect(onChange).toHaveBeenCalledWith(true);
|
|
state.close();
|
|
expect(onChange).toHaveBeenCalledWith(false);
|
|
dispose();
|
|
});
|
|
});
|
|
|
|
it("respects controlled open prop", () => {
|
|
createRoot((dispose) => {
|
|
const state = createDisclosureState({ open: true });
|
|
expect(state.isOpen()).toBe(true);
|
|
// Calling close() fires onChange but does not change internal state
|
|
const onChange = vi.fn();
|
|
const controlled = createDisclosureState({ open: true, onOpenChange: onChange });
|
|
controlled.close();
|
|
expect(controlled.isOpen()).toBe(true); // still controlled
|
|
expect(onChange).toHaveBeenCalledWith(false);
|
|
dispose();
|
|
});
|
|
});
|
|
});
|