PettyUI/packages/core/tests/utilities/focus-trap.test.ts
2026-03-29 04:36:00 +07:00

61 lines
1.9 KiB
TypeScript

import { createRoot } from "solid-js";
import { describe, expect, it } from "vitest";
import { createFocusTrap } from "../../src/utilities/focus-trap/create-focus-trap";
describe("createFocusTrap", () => {
it("focuses the first focusable element when activated", () => {
const container = document.createElement("div");
const button1 = document.createElement("button");
const button2 = document.createElement("button");
button1.textContent = "First";
button2.textContent = "Second";
container.appendChild(button1);
container.appendChild(button2);
document.body.appendChild(container);
createRoot((dispose) => {
const trap = createFocusTrap(() => container);
trap.activate();
expect(document.activeElement).toBe(button1);
trap.deactivate();
dispose();
});
document.body.removeChild(container);
});
it("does nothing when container is null", () => {
createRoot((dispose) => {
const trap = createFocusTrap(() => null);
// Should not throw
expect(() => trap.activate()).not.toThrow();
dispose();
});
});
it("returns focus to previously focused element on deactivate", () => {
const outside = document.createElement("button");
outside.textContent = "Outside";
document.body.appendChild(outside);
outside.focus();
const container = document.createElement("div");
const inner = document.createElement("button");
inner.textContent = "Inner";
container.appendChild(inner);
document.body.appendChild(container);
createRoot((dispose) => {
const trap = createFocusTrap(() => container);
trap.activate();
expect(document.activeElement).toBe(inner);
trap.deactivate();
expect(document.activeElement).toBe(outside);
dispose();
});
document.body.removeChild(outside);
document.body.removeChild(container);
});
});