hermes-bridge.spec.ts 5.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. import {test,expect} from '@playwright/test'
  2. import {mkdirSync} from 'node:fs'
  3. const evidence='test-results/hermes-dashboard-restart'
  4. test('checks and installs the selected Profile bridge and displays its actual activation state',async({page})=>{
  5. mkdirSync(evidence,{recursive:true})
  6. let phase=0,managed=true,finishInstall!:(value:void)=>void,finishRestart!:(value:void)=>void
  7. const installations:unknown[]=[],restarts:unknown[]=[]
  8. const status=()=>({endpoint:'http://127.0.0.1:9119',local:true,bundledVersion:'1.2.0',checkedAt:Date.now(),
  9. dashboard:{managed,canRestart:managed,restarting:false,message:'重启会短暂断开此 Dashboard 下所有 Profile 的连接,完成后自动检查工具桥。'},profiles:[
  10. {profile:'default',state:'ready',message:'Hermes 已加载当前工具桥,可以使用',installedVersion:'1.2.0',loadedVersion:'1.2.0',canInstall:true},
  11. {profile:'server',state:phase===0?'missing':phase===1?'restart-required':'ready',message:phase===0?'尚未安装工具桥插件':phase===1?'插件文件已就位;请在空闲时重启 Hermes 后重新检查':'Hermes 已加载当前工具桥,可以使用',installedVersion:phase?'1.2.0':undefined,loadedVersion:phase===2?'1.2.0':undefined,canInstall:true},
  12. ]})
  13. await page.route('**/api/app/admin/hermes-bridge',route=>route.fulfill({json:status()}))
  14. await page.route('**/api/app/admin/hermes-bridge/install',async route=>{
  15. installations.push(route.request().postDataJSON())
  16. await new Promise<void>(done=>{finishInstall=done})
  17. phase=1
  18. await route.fulfill({json:{profile:'server',backup:'/Users/fixture/.hermes/profiles/server/backups/yaoyao-bridge-test',message:'工具桥已安装并启用。请在空闲时重启 Hermes,然后重新检查。',status:status()}})
  19. })
  20. await page.route('**/api/app/admin/hermes-bridge/restart',async route=>{
  21. restarts.push(route.request().postDataJSON())
  22. await new Promise<void>(done=>{finishRestart=done})
  23. phase=2
  24. await route.fulfill({json:{message:'Hermes Dashboard 已重启,工具桥已就绪。',status:status()}})
  25. })
  26. await page.goto('/conversations')
  27. await page.getByRole('textbox',{name:'账号',exact:true}).fill('fixture')
  28. await page.getByRole('textbox',{name:'密码',exact:true}).fill('fixture-pass')
  29. await page.getByRole('button',{name:'登录',exact:true}).click()
  30. await page.locator('.desktop-sidebar .sidebar-account-switcher__main').click()
  31. await page.getByRole('menuitem',{name:'我的设置',exact:true}).click()
  32. await page.getByRole('button',{name:'Hermes 连接',exact:true}).click()
  33. const panel=page.getByRole('region',{name:'工具桥插件',exact:true})
  34. await expect(panel.getByText('未安装',{exact:true})).toBeVisible()
  35. await panel.scrollIntoViewIfNeeded()
  36. await page.screenshot({path:evidence+'/desktop-before.png'})
  37. await panel.getByRole('button',{name:/安装并启用:/}).click()
  38. await expect(panel.getByRole('button',{name:/安装并启用:/})).toBeDisabled()
  39. await expect(panel.getByText('安装中…',{exact:true})).toBeVisible()
  40. finishInstall()
  41. await expect(panel.getByText('待重启',{exact:true})).toBeVisible()
  42. expect(installations).toEqual([{profile:'server',enable:true}])
  43. await page.screenshot({path:evidence+'/desktop-installed.png'})
  44. await page.setViewportSize({width:375,height:812})
  45. await panel.getByRole('button',{name:'重启 Hermes Dashboard',exact:true}).scrollIntoViewIfNeeded()
  46. expect(await panel.evaluate(el=>el.scrollWidth<=el.clientWidth)).toBe(true)
  47. await page.screenshot({path:evidence+'/mobile-restart.png'})
  48. await panel.getByRole('button',{name:'重启 Hermes Dashboard',exact:true}).click()
  49. await expect(panel.getByRole('button',{name:'重启中…',exact:true})).toBeDisabled()
  50. await expect(panel.getByRole('button',{name:'重新检查',exact:true})).toBeDisabled()
  51. await expect(panel).toHaveAttribute('aria-busy','true')
  52. await page.screenshot({path:evidence+'/mobile-restarting.png'})
  53. finishRestart()
  54. await expect(panel.getByText('已就绪',{exact:true})).toHaveCount(2)
  55. await expect(panel.getByRole('status')).toContainText('Hermes Dashboard 已重启,工具桥已就绪。')
  56. expect(restarts).toEqual([{}])
  57. await page.setViewportSize({width:375,height:812})
  58. await panel.scrollIntoViewIfNeeded()
  59. await page.screenshot({path:evidence+'/mobile-ready.png'})
  60. expect(await panel.evaluate(el=>el.scrollWidth<=el.clientWidth)).toBe(true)
  61. await page.emulateMedia({reducedMotion:'reduce'})
  62. await page.setViewportSize({width:812,height:375})
  63. await panel.scrollIntoViewIfNeeded()
  64. expect(await panel.evaluate(el=>el.scrollWidth<=el.clientWidth)).toBe(true)
  65. await page.screenshot({path:evidence+'/landscape-ready.png'})
  66. await page.setViewportSize({width:1440,height:1000})
  67. await page.evaluate(()=>document.documentElement.classList.add('dark'))
  68. await panel.scrollIntoViewIfNeeded()
  69. await page.screenshot({path:evidence+'/dark-ready.png'})
  70. managed=false
  71. await panel.getByRole('button',{name:'重新检查',exact:true}).click()
  72. await expect(panel.getByRole('button',{name:'重启 Hermes Dashboard',exact:true})).toHaveCount(0)
  73. })