startup-feedback.test.mjs 2.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344
  1. import {test} from 'node:test'
  2. import assert from 'node:assert/strict'
  3. import {mkdtemp,realpath,readFile,rm,mkdir} from 'node:fs/promises'
  4. import {tmpdir} from 'node:os'
  5. import {join,resolve} from 'node:path'
  6. import {createServer} from 'node:http'
  7. import {createHash} from 'node:crypto'
  8. import {_electron as electron} from '@playwright/test'
  9. import {LaunchAgentService,localRequest} from '../bin/lib/service-update.mjs'
  10. const root=resolve(import.meta.dirname,'..')
  11. test('built startup page shows a real helper error and Retry recovers into the Web',{timeout:90000},async()=>{
  12. // The production packaging filter previously omitted this file entirely.
  13. assert.ok((await readFile(join(root,'.desktop-build/shell/boot.js'),'utf8')).includes('yaoyaoDesktop.status'))
  14. const home=await realpath(await mkdtemp(join(tmpdir(),'yaoyao-startup-feedback-')))
  15. const blocker=createServer((_request,response)=>{response.setHeader('Content-Type','application/json');response.end('{"ok":true}')})
  16. await new Promise(done=>blocker.listen(0,'127.0.0.1',done))
  17. const port=blocker.address().port
  18. const driver=new LaunchAgentService({home,port,releaseRoot:join(home,'updates','fixture-releases'),
  19. label:`cn.samien.yaoyao.sync-test.${createHash('sha256').update(home).digest('hex').slice(0,16)}`,
  20. plistPath:join(home,'updates','fixture-service.plist')})
  21. let app
  22. try{
  23. app=await electron.launch({...(process.env.DESKTOP_TEST_EXECUTABLE?{executablePath:process.env.DESKTOP_TEST_EXECUTABLE}:{}),
  24. args:process.env.DESKTOP_TEST_EXECUTABLE?[]:[root],cwd:root,
  25. env:{...process.env,HERMES_YAOYAO_DESKTOP_TEST_HOME:home,HERMES_YAOYAO_DESKTOP_PORT:String(port),HERMES_YAOYAO_DESKTOP_TEST_SYNC:'1',HERMES_YAOYAO_UPSTREAM:'http://127.0.0.1:1'},timeout:30000})
  26. const page=await app.firstWindow()
  27. await page.locator('#status[role="alert"]').waitFor({timeout:30000})
  28. assert.match(await page.locator('#status').textContent(),/已有服务未注册/)
  29. assert.equal(await page.getByRole('button',{name:'重试',exact:true}).isVisible(),true)
  30. assert.equal(await page.getByRole('button',{name:'查看日志',exact:true}).isVisible(),true)
  31. await mkdir(join(root,'test-results/desktop'),{recursive:true})
  32. await page.screenshot({path:join(root,'test-results/desktop/startup-error-retry.png')})
  33. await new Promise(done=>blocker.close(done))
  34. await page.getByRole('button',{name:'重试',exact:true}).click()
  35. await page.waitForURL(`http://127.0.0.1:${port}/**`,{timeout:45000})
  36. assert.equal((await localRequest(`http://127.0.0.1:${port}/healthz`)).body.ok,true)
  37. await page.screenshot({path:join(root,'test-results/desktop/startup-recovered.png')})
  38. }finally{
  39. await app?.close().catch(()=>{})
  40. if(blocker.listening)await new Promise(done=>blocker.close(done))
  41. await driver.stop();await rm(home,{recursive:true,force:true})
  42. }
  43. })