// @vitest-environment jsdom import { act, useState } from 'react'; import { createRoot } from 'react-dom/client'; import { expect, it, vi } from 'vitest'; import { FloatingResultsWindow } from '../../src/features/linked-results/FloatingResultsWindow'; import { makeSheet } from '../../src/importers/sheet-factory'; vi.mock('../../src/app/AppProvider', () => ({useOptionalApp:()=>undefined})); vi.mock('../../src/features/related-findings/RelatedFindings',()=>({RelatedFindingRing:({record}:{record:{id:string}})=>record.id==='grouped'?:null})); it.each(['light','dark'])('keeps title and actions separate with a stable optional group slot through minimize/restore (%s)',async theme=>{ vi.stubGlobal('IS_REACT_ACT_ENVIRONMENT',true);vi.stubGlobal('ResizeObserver',class{observe(){}disconnect(){}}); document.documentElement.dataset.theme=theme; const record=makeSheet('Synthetic',[['Name'],['Evidence']],'','synthetic.csv').analysis.records[0]; const before=JSON.stringify(record);const bookmark=vi.fn(),open=vi.fn(),close=vi.fn(); const host=document.createElement('div');document.body.append(host);const root=createRoot(host); const long='Unexpected principal with metadata edit permission on a GPO linked to a critical AD container '.repeat(8); function Example(){const [minimized,setMinimized]=useState(true);return <>{['grouped','ungrouped'].map((id,index)=>setMinimized(value=>!value)} onActivate={()=>{}} onClose={close} onToggleBookmark={bookmark} onOpenRecord={open}/>)}} try{ await act(async()=>root.render()); const windows=()=>[...host.querySelectorAll('.results-window')]; for(const node of windows()){ expect(node.querySelector('.results-window-actions .results-window-related-slot')).not.toBeNull(); expect(node.querySelector('.results-window-head > .related-finding-ring')).toBeNull(); expect(node.querySelector('.results-window-actions')?.lastElementChild?.classList.contains('results-window-close')).toBe(true); expect(node.querySelector('.results-window-close')?.previousElementSibling?.classList.contains('results-window-related-slot')).toBe(true); } expect(windows()[0].querySelector('.results-window-related-slot button')).not.toBeNull(); expect(windows()[1].querySelector('.results-window-related-slot')?.children).toHaveLength(0); expect(windows()[1].querySelector('.results-window-name')?.getAttribute('title')).toBe(long.trim()); await act(async()=>windows()[1].querySelector('.results-window-bookmark')!.click());expect(bookmark).toHaveBeenCalledOnce(); await act(async()=>windows()[1].querySelector('.results-window-action')!.click());expect(open).toHaveBeenCalledOnce(); await act(async()=>windows()[1].querySelector('.results-window-toggle')!.click()); expect(windows().every(node=>!node.classList.contains('is-minimized'))).toBe(true); expect(windows().every(node=>node.querySelector('.results-window-actions')?.lastElementChild?.classList.contains('results-window-close'))).toBe(true); expect(windows()[0].querySelector('.results-window-related-slot button')).not.toBeNull(); await act(async()=>windows()[1].querySelector('.results-window-close')!.click());expect(close).toHaveBeenCalledOnce(); expect(JSON.stringify(record)).toBe(before); }finally{await act(async()=>root.unmount());host.remove();vi.unstubAllGlobals();delete document.documentElement.dataset.theme;} });