runnerSettingsPanel.test.ts 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940
  1. import {afterEach,beforeEach,expect,it,vi} from 'vitest'
  2. import {flushPromises,mount} from '@vue/test-utils'
  3. import RunnerSettingsPanel from '@/components/app/RunnerSettingsPanel.vue'
  4. import {apiRequest} from '@/api/client'
  5. vi.mock('@/api/client',()=>({apiRequest:vi.fn()}))
  6. beforeEach(()=>{
  7. vi.mocked(apiRequest).mockReset()
  8. vi.mocked(apiRequest).mockImplementation(async(_path,options)=>options?.method==='POST'
  9. ?{runner:{id:'11111111-1111-4111-8111-111111111111',name:'Browser Runner'},token:'fixture-token'} as any
  10. :{runners:[],sources:[{id:'local',name:'本地'}]} as any)
  11. })
  12. afterEach(()=>{vi.restoreAllMocks();vi.unstubAllGlobals()})
  13. it.each([false,true])('defaults browsers on and preserves an explicit opt-out in downloaded configuration (enabled=%s)',async(enabled)=>{
  14. let download:Blob|undefined
  15. vi.stubGlobal('URL',class extends URL {
  16. static createObjectURL(blob:Blob){download=blob;return 'blob:fixture'}
  17. static revokeObjectURL(){}
  18. })
  19. vi.spyOn(HTMLAnchorElement.prototype,'click').mockImplementation(()=>{})
  20. const wrapper=mount(RunnerSettingsPanel)
  21. try{
  22. await flushPromises()
  23. const browser=wrapper.findAll('.runner-check').find(label=>label.text()==='托管浏览器')!.get<HTMLInputElement>('input')
  24. const computer=wrapper.findAll('.runner-check').find(label=>label.text().includes('隔离电脑 Worker'))!.get<HTMLInputElement>('input')
  25. expect(browser.element.checked).toBe(true)
  26. expect(computer.element.checked).toBe(false)
  27. if(!enabled)await browser.setValue(false)
  28. await wrapper.get('input[placeholder="我的 Mac"]').setValue('Browser Runner')
  29. await wrapper.findAll('input[type="url"]')[0]!.setValue('http://127.0.0.1:18888')
  30. await wrapper.get('form').trigger('submit');await flushPromises()
  31. await wrapper.findAll('button').find(button=>button.text()==='下载 Runner 配置')!.trigger('click')
  32. const text=await new Promise<string>((resolve,reject)=>{const reader=new FileReader();reader.onload=()=>resolve(String(reader.result));reader.onerror=()=>reject(reader.error);reader.readAsText(download!)})
  33. const config=JSON.parse(text)
  34. expect(config.computers).toBeUndefined()
  35. expect(config.browser).toEqual({enabled})
  36. expect(config.allowedProfiles).toEqual(['default'])
  37. }finally{wrapper.unmount()}
  38. })