| 1 | import {JSDOM} from 'jsdom'; |
| 2 | import React,{act} from 'react'; |
| 3 | |
| 4 | import assert from 'node:assert/strict'; |
| 5 | |
| 6 | import {LocaleProvider} from '../lib/i18n'; |
| 7 | import type {ProviderView} from '../lib/types'; |
| 8 | const dom=new JSDOM('<div id="root"></div>',{url:'http://localhost',pretendToBeVisual:true}); |
| 9 | Object.assign(globalThis,{window:dom.window,document:dom.window.document,localStorage:dom.window.localStorage,IS_REACT_ACT_ENVIRONMENT:true}); |
| 10 | const {createRoot}=await import('react-dom/client'); |
| 11 | const {ProviderEditor,providerAccessGroups}=await import('../components/SettingsPanel'); |
| 12 | const provider={name:'stable-id',displayName:'工作账号',kind:'openai',baseUrl:'https://example.com/v1',models:['model'],default:'model',apiKeyEnv:'TEST_KEY',keySet:true,added:true,builtIn:false,visionModels:[],supportedEfforts:[],modelsUrl:'',balanceUrl:'',contextWindow:100000} as ProviderView; |
| 13 | let saved:ProviderView|undefined; |
| 14 | const root=createRoot(document.getElementById('root')!); |
| 15 | await act(async()=>root.render(<LocaleProvider><ProviderEditor initial={provider} kinds={['openai']} busy={false} onCancel={()=>{}} onSave={p=>{saved=p;}} /></LocaleProvider>)); |
| 16 | const name=document.querySelector('.provider-name-input') as HTMLInputElement; |
| 17 | assert.equal(name.disabled,false);assert.equal(name.value,'工作账号'); |
| 18 | await act(async()=>{ |
| 19 | Object.getOwnPropertyDescriptor(window.HTMLInputElement.prototype,'value')!.set!.call(name,'个人账号'); |
| 20 | name.dispatchEvent(new window.Event('input',{bubbles:true})); |
| 21 | }); |
| 22 | const save=document.querySelector('.provider-editor-footer .btn--primary') as HTMLButtonElement; |
| 23 | await act(async()=>save.click()); |
| 24 | assert.equal(saved?.name,'stable-id');assert.equal(saved?.displayName,'个人账号'); |
| 25 | assert.equal(providerAccessGroups([provider],((key:string)=>key) as any)[0].label,'工作账号'); |
| 26 | await act(async()=>root.render(<LocaleProvider><ProviderEditor key="builtin" initial={{...provider,builtIn:true}} kinds={['openai','anthropic','responses']} busy={false} onCancel={()=>{}} onSave={p=>{saved=p;}} /></LocaleProvider>)); |
| 27 | assert.equal((document.querySelector('button[aria-label="API format"]') as HTMLButtonElement).disabled,false); |
| 28 | assert.ok(document.querySelector('.provider-model-toolbar')); |
| 29 | assert.equal(document.querySelector('.provider-editor--key-only'),null); |
| 30 | assert.ok(document.querySelector('.provider-name-input')); |
| 31 | await act(async()=>root.unmount()); |
| 32 | console.log('PASS: editable connection label saves independently of stable identity and drives list title'); |
| 33 |