remote-welcome.e2e.ts 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253
  1. // Trusted non-loopback Web access must not wedge on the loopback-only
  2. // settings API while the mandatory product notice owns the viewport.
  3. import type { Browser, Page } from 'playwright'
  4. import { chromium } from 'playwright'
  5. import { afterAll, beforeAll, describe, expect, it } from 'vitest'
  6. import {
  7. acknowledgeReloadConnectionLoss, launchWebScaffold, watchConsole, webSnapshotMode,
  8. type WebScaffold,
  9. } from './scaffold.ts'
  10. import { ZH_BROWSER_LOCALE } from './support.ts'
  11. import { WELCOME_NOTICE_COPY } from '@deepseek-ai/dsh-client-ui-settings-general'
  12. const MODE = webSnapshotMode()
  13. describe.skipIf(MODE === 'record')('web e2e: remote welcome notice', () => {
  14. let scaffold: WebScaffold
  15. let browser: Browser
  16. let page: Page
  17. let tripwire: ReturnType<typeof watchConsole>
  18. beforeAll(async () => {
  19. scaffold = await launchWebScaffold({ remoteAuthority: 'remote.localhost', welcomeNoticePending: true })
  20. browser = await chromium.launch()
  21. page = await browser.newPage({ viewport: { width: 1440, height: 960 }, locale: ZH_BROWSER_LOCALE })
  22. tripwire = watchConsole(page)
  23. await page.goto(scaffold.baseUrl, { waitUntil: 'load' })
  24. await page.waitForSelector('#root', { timeout: 30_000 })
  25. }, 120_000)
  26. afterAll(async () => {
  27. await browser?.close()
  28. await scaffold?.close()
  29. })
  30. it('advances process-locally and presents the notice again after reload', async () => {
  31. const welcome = page.getByRole('region', { name: WELCOME_NOTICE_COPY.zh.title })
  32. await welcome.waitFor({ timeout: 15_000 })
  33. expect(await page.locator('#root').evaluate(root => (root as HTMLElement).inert)).toBe(true)
  34. await welcome.getByRole('button', { name: WELCOME_NOTICE_COPY.zh.continueLabel }).click()
  35. await welcome.waitFor({ state: 'detached', timeout: 15_000 })
  36. await expect.poll(
  37. () => page.locator('#root').evaluate(root => (root as HTMLElement).inert),
  38. { timeout: 15_000 },
  39. ).toBe(false)
  40. const reloadWarnings = tripwire.warnings.length
  41. await page.reload({ waitUntil: 'load' })
  42. acknowledgeReloadConnectionLoss(tripwire, reloadWarnings)
  43. await welcome.waitFor({ timeout: 15_000 })
  44. expect(tripwire.warnings).toEqual([])
  45. expect(tripwire.pageErrors).toEqual([])
  46. }, 60_000)
  47. })