1
0

remote-welcome.e2e.ts 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. // Trusted non-loopback Web access cannot call the loopback-only settings API;
  2. // the notice therefore advances for this browser process and returns on reload.
  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. WELCOME_NOTICE_COPY,
  9. type WebScaffold,
  10. } from './scaffold.ts'
  11. import { ZH_BROWSER_LOCALE } from './support.ts'
  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({
  20. remoteAuthority: 'remote.localhost',
  21. welcomeNoticePending: true,
  22. })
  23. browser = await chromium.launch()
  24. page = await browser.newPage({
  25. viewport: { width: 1440, height: 960 },
  26. locale: ZH_BROWSER_LOCALE,
  27. })
  28. tripwire = watchConsole(page)
  29. await page.goto(scaffold.authenticatedUrl, { waitUntil: 'load' })
  30. await page.waitForSelector('#root', { timeout: 30_000 })
  31. }, 120_000)
  32. afterAll(async () => {
  33. await browser?.close()
  34. await scaffold?.close()
  35. })
  36. it('advances process-locally and presents the notice again after reload', async () => {
  37. const welcome = page.getByRole('dialog', { name: WELCOME_NOTICE_COPY.zh.title })
  38. await welcome.waitFor({ timeout: 15_000 })
  39. expect(await page.locator('#root').evaluate(root => (root as HTMLElement).inert)).toBe(true)
  40. await welcome.getByRole('button', { name: WELCOME_NOTICE_COPY.zh.continueLabel }).click()
  41. await welcome.waitFor({ state: 'detached', timeout: 15_000 })
  42. await expect.poll(
  43. () => page.locator('#root').evaluate(root => (root as HTMLElement).inert),
  44. { timeout: 15_000 },
  45. ).toBe(false)
  46. const reloadWarnings = tripwire.warnings.length
  47. await page.reload({ waitUntil: 'load' })
  48. acknowledgeReloadConnectionLoss(tripwire, reloadWarnings)
  49. await welcome.waitFor({ timeout: 15_000 })
  50. expect(tripwire.warnings).toEqual([])
  51. expect(tripwire.pageErrors).toEqual([])
  52. }, 60_000)
  53. })