// @vitest-environment jsdom import { afterEach, describe, expect, it } from 'vitest'; import { handleInteractivePickerMessage } from '@/components/scene-renderers/InteractiveIframeHost'; import { useCanvasStore } from '@/lib/store/canvas'; import { useElementRefsStore } from '@/lib/store/element-refs'; import { ELEMENT_REF_SELECTOR_MAX, ELEMENT_SNAPSHOT_MAX, INTERACTIVE_OUTERHTML_MAX, } from '@/lib/workbench/element-refs'; const translate = (key: string) => key; const picked = { __maicInteractive: true, kind: 'element-picked', selector: '#cta', outerHTML: '', text: 'Start', }; afterEach(() => { useCanvasStore.getState().resetCanvasState(); useElementRefsStore.setState({ ownerSessionId: null, refs: [], hovered: null, nextGeneration: 1, }); }); describe('InteractiveIframeHost picker messages', () => { it('ignores a forged pick while this iframe is not armed', () => { useElementRefsStore.getState().attachOwner('session-a'); expect(handleInteractivePickerMessage('scene-web', picked, translate)).toBe(false); expect(useElementRefsStore.getState().refs).toEqual([]); }); it('validates, bounds, and toggles a picked GenUI element while armed', () => { useElementRefsStore.getState().attachOwner('session-a'); useCanvasStore.getState().setPickTarget({ purpose: 'element-ref', stageId: 'stage-1', sceneId: 'scene-web', ownerSessionId: 'session-a', }); const longPick = { ...picked, selector: `#${'s'.repeat(ELEMENT_REF_SELECTOR_MAX + 20)}`, outerHTML: `