| 1 | import { JSDOM } from 'jsdom'; |
| 2 | import React, {act} from 'react'; |
| 3 | import assert from 'node:assert/strict'; |
| 4 | const dom = new JSDOM('<div id="root"></div>', {url:'http://localhost',pretendToBeVisual:true}); |
| 5 | Object.assign(globalThis,{window:dom.window,document:dom.window.document,localStorage:dom.window.localStorage,Node:dom.window.Node,HTMLElement:dom.window.HTMLElement,requestAnimationFrame:dom.window.requestAnimationFrame.bind(dom.window),cancelAnimationFrame:dom.window.cancelAnimationFrame.bind(dom.window),IS_REACT_ACT_ENVIRONMENT:true}); |
| 6 | window.matchMedia = (()=>({matches:true,addEventListener(){},removeEventListener(){}})) as any; |
| 7 | const {createRoot}=await import('react-dom/client'); |
| 8 | const {ModelPicker}=await import('../components/SettingsPanel'); |
| 9 | const {LocaleProvider}=await import('../lib/i18n'); |
| 10 | const root=createRoot(document.getElementById('root')!); |
| 11 | let selected=''; |
| 12 | const providers=['one','two'].map(name=>({name,displayName:`Connection ${name}`,kind:'openai',models:['shared-model'],keySet:true,apiKeyEnv:'KEY',builtIn:true})); |
| 13 | await act(async()=>root.render(<LocaleProvider><ModelPicker s={{providers} as any} refs={['one/shared-model','two/shared-model']} value="one/shared-model" disabled={false} onPick={value=>{selected=value;}}/></LocaleProvider>)); |
| 14 | await act(async()=>(document.querySelector('.settings-model-picker .settings-select') as HTMLButtonElement).click()); |
| 15 | const options=Array.from(document.querySelectorAll<HTMLButtonElement>('[role="option"]')); |
| 16 | assert.equal(options.length,2); |
| 17 | assert.deepEqual(Array.from(document.querySelectorAll('.settings-select-menu__group')).map(n=>n.textContent),['Connection one','Connection two']); |
| 18 | assert.equal(options[0].querySelector('small'),null); |
| 19 | await act(async()=>options[1].click()); |
| 20 | assert.equal(selected,'two/shared-model'); |
| 21 | await act(async()=>root.unmount()); |
| 22 | console.log('PASS: same model in independent connections retains identity and selection'); |
| 23 |