import { afterEach, describe, expect, it, vi } from "vite-plus/test"; import { isInsideCollapsedComposerControls, isInsideComposerFloatingLayer, isInsideRestingComposerControlScope,} from "./composerEventScope"; class FakeElement { constructor(private readonly matchingSelector: string | null) {} closest(selector: string): FakeElement | null { return this.matchingSelector !== null && selector.split(",").some((candidate) => candidate === this.matchingSelector) ? this : null; }} afterEach(() => { vi.unstubAllGlobals();}); describe("composer event scopes", () => { it("recognizes events from the portaled resting controls", () => { vi.stubGlobal("Element", FakeElement); const target = new FakeElement('[data-chat-composer-resting-controls="true"]'); expect(isInsideRestingComposerControlScope(target as unknown as EventTarget)).toBe(true); }); it("recognizes events from the composer context strip controls", () => { vi.stubGlobal("Element", FakeElement); const target = new FakeElement("[data-composer-context-control]"); expect(isInsideRestingComposerControlScope(target as unknown as EventTarget)).toBe(true); }); it("keeps resting image previews focused without expanding their subtree", () => { vi.stubGlobal("Element", FakeElement); const target = new FakeElement('[data-chat-composer-resting-images="true"]'); expect(isInsideRestingComposerControlScope(target as unknown as EventTarget)).toBe(true); }); it("includes composer-owned floating layers in the resting control scope", () => { vi.stubGlobal("Element", FakeElement); const target = new FakeElement('[data-chat-composer-floating-layer="true"]'); expect(isInsideComposerFloatingLayer(target as unknown as EventTarget)).toBe(true); expect(isInsideRestingComposerControlScope(target as unknown as EventTarget)).toBe(true); }); it("leaves unrelated floating layers outside the composer scope", () => { vi.stubGlobal("Element", FakeElement); const target = new FakeElement('[data-slot="popover-popup"]'); expect(isInsideComposerFloatingLayer(target as unknown as EventTarget)).toBe(false); expect(isInsideRestingComposerControlScope(target as unknown as EventTarget)).toBe(false); }); it("leaves ordinary composer targets outside the portaled control scope", () => { vi.stubGlobal("Element", FakeElement); const target = new FakeElement(null); expect(isInsideRestingComposerControlScope(target as unknown as EventTarget)).toBe(false); expect(isInsideRestingComposerControlScope(null)).toBe(false); }); it("recognizes banner and drawer controls docked above the surface", () => { vi.stubGlobal("Element", FakeElement); const target = new FakeElement('[data-chat-composer-collapsed-controls="true"]'); expect(isInsideCollapsedComposerControls(target as unknown as EventTarget)).toBe(true); expect(isInsideCollapsedComposerControls(new FakeElement(null) as unknown as EventTarget)).toBe( false, ); expect(isInsideCollapsedComposerControls(null)).toBe(false); });});
import { afterEach, describe, expect, it, vi } from "vite-plus/test";
import {
isInsideCollapsedComposerControls,
isInsideComposerFloatingLayer,
isInsideRestingComposerControlScope,
} from "./composerEventScope";
class FakeElement {
constructor(private readonly matchingSelector: string | null) {}
closest(selector: string): FakeElement | null {
return this.matchingSelector !== null &&
selector.split(",").some((candidate) => candidate === this.matchingSelector)
? this
: null;
}
}
afterEach(() => {
vi.unstubAllGlobals();
});
describe("composer event scopes", () => {
it("recognizes events from the portaled resting controls", () => {
vi.stubGlobal("Element", FakeElement);
const target = new FakeElement('[data-chat-composer-resting-controls="true"]');
expect(isInsideRestingComposerControlScope(target as unknown as EventTarget)).toBe(true);
});
it("recognizes events from the composer context strip controls", () => {
vi.stubGlobal("Element", FakeElement);
const target = new FakeElement("[data-composer-context-control]");
expect(isInsideRestingComposerControlScope(target as unknown as EventTarget)).toBe(true);
});
it("keeps resting image previews focused without expanding their subtree", () => {
vi.stubGlobal("Element", FakeElement);
const target = new FakeElement('[data-chat-composer-resting-images="true"]');
expect(isInsideRestingComposerControlScope(target as unknown as EventTarget)).toBe(true);
});
it("includes composer-owned floating layers in the resting control scope", () => {
vi.stubGlobal("Element", FakeElement);
const target = new FakeElement('[data-chat-composer-floating-layer="true"]');
expect(isInsideComposerFloatingLayer(target as unknown as EventTarget)).toBe(true);
expect(isInsideRestingComposerControlScope(target as unknown as EventTarget)).toBe(true);
});
it("leaves unrelated floating layers outside the composer scope", () => {
vi.stubGlobal("Element", FakeElement);
const target = new FakeElement('[data-slot="popover-popup"]');
expect(isInsideComposerFloatingLayer(target as unknown as EventTarget)).toBe(false);
expect(isInsideRestingComposerControlScope(target as unknown as EventTarget)).toBe(false);
});
it("leaves ordinary composer targets outside the portaled control scope", () => {
vi.stubGlobal("Element", FakeElement);
const target = new FakeElement(null);
expect(isInsideRestingComposerControlScope(target as unknown as EventTarget)).toBe(false);
expect(isInsideRestingComposerControlScope(null)).toBe(false);
});
it("recognizes banner and drawer controls docked above the surface", () => {
vi.stubGlobal("Element", FakeElement);
const target = new FakeElement('[data-chat-composer-collapsed-controls="true"]');
expect(isInsideCollapsedComposerControls(target as unknown as EventTarget)).toBe(true);
expect(isInsideCollapsedComposerControls(new FakeElement(null) as unknown as EventTarget)).toBe(
false,
);
expect(isInsideCollapsedComposerControls(null)).toBe(false);
});
});