|
|
@@ -249,13 +249,18 @@ test('configures the Agent computer in its chat panel and keeps preparation in a
|
|
|
await editor.getByRole('button',{name:'保存',exact:true}).click()
|
|
|
await page.getByRole('button',{name:'电脑与定时任务',exact:true}).click()
|
|
|
const dock=page.getByRole('complementary',{name:'机器人电脑面板'})
|
|
|
- const vmTab=dock.getByRole('tab',{name:'本地虚拟机',exact:true})
|
|
|
- await vmTab.click()
|
|
|
- await expect(vmTab).toHaveAttribute('aria-selected','true')
|
|
|
+ const vmBox=dock.locator('.env-check',{hasText:'本地虚拟机'}).getByRole('checkbox')
|
|
|
+ await vmBox.check()
|
|
|
+ await expect(vmBox).toBeChecked()
|
|
|
await expect(dock.getByRole('button',{name:'设置本地虚拟机',exact:true})).toBeVisible()
|
|
|
await page.screenshot({path:testInfo.outputPath('local-vm-unconfigured-agent.png')})
|
|
|
})
|
|
|
|
|
|
+async function envCheck(page:any,label:string){
|
|
|
+ const dock=page.getByRole('complementary',{name:'机器人电脑面板'})
|
|
|
+ const box=dock.locator('.env-check',{hasText:label}).getByRole('checkbox')
|
|
|
+ return {box,dock}
|
|
|
+}
|
|
|
async function openVmSettings(page:any){
|
|
|
await page.locator('.desktop-sidebar').getByRole('button',{name:'工具',exact:true}).click()
|
|
|
await page.getByRole('menuitem',{name:'Bot 设置',exact:true}).click()
|
|
|
@@ -269,7 +274,7 @@ async function login(page:any,ready=false){
|
|
|
await expect(page.locator('.desktop-sidebar .sidebar-create-trigger')).toBeVisible()
|
|
|
await page.request.post('/__test/local-vm'+(ready?'?ready=1':''),{data:{}})
|
|
|
}
|
|
|
-test('persists idle-stop settings and the host environment checkbox on desktop and mobile',async({page},testInfo)=>{
|
|
|
+test('persists idle-stop settings and parallel environment toggles on desktop and mobile',async({page},testInfo)=>{
|
|
|
await login(page,true)
|
|
|
const settings=await openVmSettings(page)
|
|
|
const timeout=settings.getByRole('combobox',{name:'虚拟机空闲停止时间',exact:true})
|
|
|
@@ -281,50 +286,53 @@ test('persists idle-stop settings and the host environment checkbox on desktop a
|
|
|
await page.request.post('/__test/hybrid-runner',{data:{}})
|
|
|
const seed=await(await page.request.post('/__test/computer?off=1',{data:{}})).json()
|
|
|
await page.goto(`/conversations/${seed.conversationId}`);await page.getByRole('button',{name:'电脑与定时任务',exact:true}).click()
|
|
|
- const dock=page.getByRole('complementary',{name:'机器人电脑面板'}),hostOption=dock.getByRole('checkbox',{name:'允许本机环境',exact:true})
|
|
|
- await expect(dock.getByRole('tab',{name:'本机 + 虚拟机',exact:true})).toHaveCount(0)
|
|
|
- await hostOption.check();await expect(hostOption).toBeChecked()
|
|
|
- expect((await(await page.request.get('/api/app/agents')).json()).agents.find((a:any)=>a.id===seed.agentId)).toMatchObject({computer:'vm',execution:'computer',allowHostEnvironment:true})
|
|
|
+ const dock=page.getByRole('complementary',{name:'机器人电脑面板'})
|
|
|
+ const vmBox=dock.locator('.env-check',{hasText:'本地虚拟机'}).getByRole('checkbox'),hostBox=dock.locator('.env-check',{hasText:'本机控制'}).getByRole('checkbox')
|
|
|
+ await vmBox.check();await expect(vmBox).toBeChecked()
|
|
|
+ await hostBox.check();await expect(hostBox).toBeChecked()
|
|
|
+ expect((await(await page.request.get('/api/app/agents')).json()).agents.find((a:any)=>a.id===seed.agentId)).toMatchObject({envs:{vm:true,desktop:true},computer:'vm',execution:'computer'})
|
|
|
await expect(dock).toContainText('永不自动停止')
|
|
|
- await hostOption.scrollIntoViewIfNeeded();await page.screenshot({path:testInfo.outputPath('hybrid-desktop.png')})
|
|
|
- await page.reload();await page.getByRole('button',{name:'电脑与定时任务',exact:true}).click();await expect(hostOption).toBeChecked()
|
|
|
- await page.setViewportSize({width:390,height:844});await hostOption.scrollIntoViewIfNeeded();await page.screenshot({path:testInfo.outputPath('hybrid-mobile.png')})
|
|
|
+ await hostBox.scrollIntoViewIfNeeded();await page.screenshot({path:testInfo.outputPath('hybrid-desktop.png')})
|
|
|
+ await page.reload();await page.getByRole('button',{name:'电脑与定时任务',exact:true}).click();await expect(vmBox).toBeChecked();await expect(hostBox).toBeChecked()
|
|
|
+ await page.setViewportSize({width:390,height:844});await hostBox.scrollIntoViewIfNeeded();await page.screenshot({path:testInfo.outputPath('hybrid-mobile.png')})
|
|
|
expect(await page.evaluate(()=>document.documentElement.scrollWidth)).toBeLessThanOrEqual(390)
|
|
|
- await dock.getByRole('tab',{name:'不使用电脑',exact:true}).click();await expect(hostOption).toHaveCount(0)
|
|
|
- await dock.getByRole('tab',{name:'本地虚拟机',exact:true}).click();await expect(hostOption).not.toBeChecked()
|
|
|
- expect((await(await page.request.get('/api/app/agents')).json()).agents.find((a:any)=>a.id===seed.agentId)).toMatchObject({computer:'vm',execution:'computer',allowHostEnvironment:false})
|
|
|
+ await hostBox.uncheck();await expect(dock.getByRole('checkbox',{name:'允许本机环境',exact:true})).toHaveCount(0)
|
|
|
+ expect((await(await page.request.get('/api/app/agents')).json()).agents.find((a:any)=>a.id===seed.agentId)).toMatchObject({envs:{vm:true,desktop:false},computer:'vm',allowHostEnvironment:false})
|
|
|
})
|
|
|
-test('selects local VM Profile collaboration and preserves it after reload on desktop and phone',async({page},testInfo)=>{
|
|
|
+test('keeps the parallel VM toggle through reload on desktop and phone',async({page},testInfo)=>{
|
|
|
await login(page,true)
|
|
|
await page.request.post('/__test/hybrid-runner',{data:{}})
|
|
|
const seed=await(await page.request.post('/__test/computer?off=1',{data:{}})).json()
|
|
|
await page.goto(`/conversations/${seed.conversationId}`);await page.getByRole('button',{name:'电脑与定时任务',exact:true}).click()
|
|
|
- const dock=page.getByRole('complementary',{name:'机器人电脑面板'}),mode=dock.getByRole('combobox',{name:'本地虚拟机执行方式',exact:true})
|
|
|
- await mode.selectOption('profile');await expect(mode).toHaveValue('profile')
|
|
|
- await expect(dock.getByRole('tab',{name:'本地虚拟机',exact:true})).toHaveAttribute('aria-selected','true')
|
|
|
- await expect(dock).toContainText('使用基础机器人的完整本机环境')
|
|
|
- await expect(dock.getByRole('checkbox',{name:'允许本机环境',exact:true})).toHaveCount(0)
|
|
|
- expect((await(await page.request.get('/api/app/agents')).json()).agents.find((a:any)=>a.id===seed.agentId)).toMatchObject({computer:'vm',execution:'computer',vmExecution:'profile',allowHostEnvironment:true})
|
|
|
- await mode.scrollIntoViewIfNeeded();await page.screenshot({path:testInfo.outputPath('profile-vm-desktop.png')})
|
|
|
- await page.reload();await page.getByRole('button',{name:'电脑与定时任务',exact:true}).click();await expect(mode).toHaveValue('profile')
|
|
|
+ const dock=page.getByRole('complementary',{name:'机器人电脑面板'})
|
|
|
+ const vmBox=dock.locator('.env-check',{hasText:'本地虚拟机'}).getByRole('checkbox')
|
|
|
+ await expect(dock.getByRole('combobox',{name:'本地虚拟机执行方式',exact:true})).toHaveCount(0)
|
|
|
+ await expect(vmBox).toBeChecked()
|
|
|
+ await vmBox.uncheck()
|
|
|
+ expect((await(await page.request.get('/api/app/agents')).json()).agents.find((a:any)=>a.id===seed.agentId)).toMatchObject({envs:{vm:false},computer:'off',execution:'profile'})
|
|
|
+ await vmBox.check();await expect(vmBox).toBeChecked()
|
|
|
+ expect((await(await page.request.get('/api/app/agents')).json()).agents.find((a:any)=>a.id===seed.agentId)).toMatchObject({envs:{vm:true},computer:'vm',execution:'computer'})
|
|
|
+ await vmBox.scrollIntoViewIfNeeded();await page.screenshot({path:testInfo.outputPath('profile-vm-desktop.png')})
|
|
|
+ await page.reload();await page.getByRole('button',{name:'电脑与定时任务',exact:true}).click();await expect(vmBox).toBeChecked()
|
|
|
await page.setViewportSize({width:390,height:844});await page.emulateMedia({colorScheme:'dark',reducedMotion:'reduce'})
|
|
|
- await mode.scrollIntoViewIfNeeded();await page.screenshot({path:testInfo.outputPath('profile-vm-phone.png')})
|
|
|
+ await vmBox.scrollIntoViewIfNeeded();await page.screenshot({path:testInfo.outputPath('profile-vm-phone.png')})
|
|
|
expect(await page.evaluate(()=>document.documentElement.scrollWidth)).toBeLessThanOrEqual(390)
|
|
|
- await mode.selectOption('worker');await expect(dock.getByRole('checkbox',{name:'允许本机环境',exact:true})).not.toBeChecked()
|
|
|
+ await vmBox.uncheck()
|
|
|
+ expect((await(await page.request.get('/api/app/agents')).json()).agents.find((a:any)=>a.id===seed.agentId)).toMatchObject({envs:{vm:false},computer:'off',execution:'profile'})
|
|
|
})
|
|
|
-test('cloud VM keeps its own selection while the host option can be checked and clears on auto',async({page},testInfo)=>{
|
|
|
+test('cloud stays selected while desktop runs in parallel from the checkbox panel',async({page},testInfo)=>{
|
|
|
await login(page,true)
|
|
|
const seed=await(await page.request.post('/__test/cloud-host-option',{data:{}})).json()
|
|
|
await page.goto(`/conversations/${seed.conversationId}`);await page.getByRole('button',{name:'电脑与定时任务',exact:true}).click()
|
|
|
- const dock=page.getByRole('complementary',{name:'机器人电脑面板'}),option=dock.getByRole('checkbox',{name:'允许本机环境',exact:true}),cloud=dock.getByRole('tab',{name:'云端 · Grok Bot',exact:true})
|
|
|
- await expect(cloud).toHaveAttribute('aria-selected','true');await expect(option).not.toBeChecked();await option.check()
|
|
|
- await expect(option).toBeChecked();await expect(cloud).toHaveAttribute('aria-selected','true')
|
|
|
- expect((await(await page.request.get('/api/app/agents')).json()).agents.find((a:any)=>a.id===seed.agentId)).toMatchObject({computer:'cloud',execution:'profile',allowHostEnvironment:true})
|
|
|
- await option.scrollIntoViewIfNeeded();await page.screenshot({path:testInfo.outputPath('cloud-host-option.png')})
|
|
|
- await page.reload();await page.getByRole('button',{name:'电脑与定时任务',exact:true}).click();await expect(option).toBeChecked()
|
|
|
- await dock.getByRole('tab',{name:'自动',exact:true}).click();await expect(option).toHaveCount(0)
|
|
|
- expect((await(await page.request.get('/api/app/agents')).json()).agents.find((a:any)=>a.id===seed.agentId).allowHostEnvironment).toBe(false)
|
|
|
- await cloud.click();await expect(option).not.toBeChecked()
|
|
|
+ const dock=page.getByRole('complementary',{name:'机器人电脑面板'})
|
|
|
+ const cloudBox=dock.locator('.env-check',{hasText:'云端 · Grok Bot'}).getByRole('checkbox'),hostBox=dock.locator('.env-check',{hasText:'本机控制'}).getByRole('checkbox')
|
|
|
+ await expect(cloudBox).toBeChecked()
|
|
|
+ await hostBox.check();await expect(cloudBox).toBeChecked();await expect(hostBox).toBeChecked()
|
|
|
+ expect((await(await page.request.get('/api/app/agents')).json()).agents.find((a:any)=>a.id===seed.agentId)).toMatchObject({envs:{cloud:true,desktop:true},computer:'cloud',execution:'profile'})
|
|
|
+ await hostBox.scrollIntoViewIfNeeded();await page.screenshot({path:testInfo.outputPath('cloud-host-option.png')})
|
|
|
+ await page.reload();await page.getByRole('button',{name:'电脑与定时任务',exact:true}).click();await expect(cloudBox).toBeChecked();await expect(hostBox).toBeChecked()
|
|
|
+ await hostBox.uncheck()
|
|
|
+ expect((await(await page.request.get('/api/app/agents')).json()).agents.find((a:any)=>a.id===seed.agentId)).toMatchObject({envs:{cloud:true,desktop:false},allowHostEnvironment:false})
|
|
|
})
|
|
|
|
|
|
test('Local VM settings replace the image catalog and prepare the managed desktop',async({page},testInfo)=>{
|