| 1 | import { JSDOM } from "jsdom"; |
| 2 | import React, { act, useState } from "react"; |
| 3 | import { createRoot } from "react-dom/client"; |
| 4 | import assert from "node:assert/strict"; |
| 5 | import { ProviderConnections } from "../components/ProviderConnections"; |
| 6 | import { LocaleProvider } from "../lib/i18n"; |
| 7 | import type { ProviderAccessGroup } from "../components/SettingsPanel"; |
| 8 | const dom = new JSDOM('<div id="root"></div>', { url: "http://localhost" }); |
| 9 | Object.assign(globalThis, { window: dom.window, document: dom.window.document, IS_REACT_ACT_ENVIRONMENT: true }); |
| 10 | const groups = ['a', 'b'].map(id => ({id, label:id, models:[], providers:[], kind:'openai', baseUrl:'', configured:true})) as ProviderAccessGroup[]; |
| 11 | function Draft({id}:{id:string}) { const [n,setN]=useState(0);return <button data-draft={id} onClick={()=>setN(n+1)}>{n}</button>; } |
| 12 | const root=createRoot(document.getElementById('root')!); |
| 13 | const render=(items=groups,hidden=false)=> <LocaleProvider><ProviderConnections groups={items} presets={[]} revealedProvider={null} hidden={hidden} busy={false} onAdd={()=>{}} renderDetail={g=><Draft id={g.id}/>} /></LocaleProvider>; |
| 14 | await act(async()=>root.render(render())); |
| 15 | await act(async()=> (document.querySelector('[data-draft="a"]') as HTMLElement).click()); |
| 16 | await act(async()=> (document.querySelectorAll('.provider-connections__item')[1] as HTMLElement).click()); |
| 17 | assert.equal(document.querySelector('[data-draft="a"]')!.parentElement!.hidden,true); |
| 18 | await act(async()=> (document.querySelectorAll('.provider-connections__item')[0] as HTMLElement).click()); |
| 19 | assert.equal(document.querySelector('[data-draft="a"]')!.textContent,'1'); |
| 20 | await act(async()=>root.render(render(groups,true))); |
| 21 | await act(async()=>root.render(render())); |
| 22 | assert.equal(document.querySelector('[data-draft="a"]')!.textContent,'1'); |
| 23 | await act(async()=>root.render(render([groups[1]]))); |
| 24 | assert.equal(document.querySelector('[data-draft="b"]')!.parentElement!.hidden,false); |
| 25 | await act(async()=>root.unmount()); |
| 26 | console.log('PASS: navigation preserves drafts, add flow preserves drafts, deletion selects remaining connection'); |
| 27 |