Skip to content

Commit 51ef8b0

Browse files
authored
test(vapor-e2e): migrate e2e tests to browser mode (#14618)
1 parent f633704 commit 51ef8b0

File tree

18 files changed

+2437
-2051
lines changed

18 files changed

+2437
-2051
lines changed

.github/renovate.json5

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,13 @@
1111
},
1212
{
1313
groupName: 'test',
14-
matchPackageNames: ['vitest', 'jsdom', 'puppeteer', '@vitest{/,}**'],
14+
matchPackageNames: [
15+
'vitest',
16+
'jsdom',
17+
'playwright',
18+
'puppeteer',
19+
'@vitest{/,}**',
20+
],
1521
},
1622
{
1723
groupName: 'playground',

.github/workflows/test.yml

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -70,18 +70,20 @@ jobs:
7070
steps:
7171
- uses: actions/checkout@v6
7272

73-
- name: Setup cache for Chromium binary
73+
- name: Setup cache for Playwright browsers
7474
uses: actions/cache@v5
7575
with:
76-
path: ~/.cache/puppeteer
77-
key: chromium-${{ hashFiles('pnpm-lock.yaml') }}
76+
path: ~/.cache/ms-playwright
77+
key: playwright-${{ runner.os }}-${{ hashFiles('pnpm-lock.yaml') }}
7878

7979
- name: Setup Vite+
8080
uses: voidzero-dev/setup-vp@v1
8181
with:
8282
node-version-file: '.node-version'
8383
cache: true
84-
- run: node node_modules/puppeteer/install.mjs
84+
85+
- name: Install Playwright Chromium
86+
run: vp exec playwright install chromium
8587

8688
- name: Run e2e tests
8789
run: vp run test-e2e-vapor

package.json

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@
1919
"test": "vp test",
2020
"test-unit": "vp test --project unit*",
2121
"test-e2e": "node scripts/build.js -e vue -f global+esm-browser-vapor -d && vp test --project e2e",
22-
"test-e2e-vapor": "vp run prepare-e2e-vapor && VUE_INCLUDE_VAPOR_BROWSER_E2E=1 vp test --project 'e2e-vapor*'",
22+
"test-e2e-vapor": "vp run prepare-e2e-vapor && VAPOR_E2E=1 vp test --project e2e-vapor",
2323
"prepare-e2e-vapor": "node scripts/build.js -e -f cjs+esm-bundler+esm-bundler-runtime && vp build packages-private/vapor-e2e-test",
2424
"test-dts": "run-s build-dts test-dts-only",
2525
"test-dts-only": "tsc -p packages-private/dts-built-test/tsconfig.json && tsc -p ./packages-private/dts-test/tsconfig.test.json && tsc -p ./packages-private/dts-test/vapor/tsconfig.json",
@@ -58,7 +58,6 @@
5858
"@types/serve-handler": "^6.1.4",
5959
"@vitest/coverage-v8": "^4.0.18",
6060
"@vitest/ui": "^4.0.18",
61-
"@vitest/browser-playwright": "^4.0.14",
6261
"@vue/consolidate": "1.0.0",
6362
"conventional-changelog-cli": "^5.0.0",
6463
"enquirer": "^2.4.1",
Lines changed: 64 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,73 @@
11
import { type Locator, page, userEvent } from 'vitest/browser'
22

33
export const css = (css: string) => page.getByCSS(css)
4-
export const E2E_TIMEOUT: number = 30 * 1000
4+
export const html = (selector: string) => css(selector).element().innerHTML
5+
export const E2E_TIMEOUT: number = 10 * 1000
56

6-
export async function enterValue(locator: Locator, text: string) {
7-
await locator.fill(text)
8-
await userEvent.type(locator, '{enter}')
7+
const duration = 50
8+
export function timeout(time: number) {
9+
return new Promise(r => {
10+
setTimeout(r, time)
11+
})
912
}
1013

11-
export function nextFrame() {
12-
return new Promise(resolve => {
13-
requestAnimationFrame(() => {
14-
requestAnimationFrame(resolve)
14+
export const transitionFinish = (time = duration) => timeout(time)
15+
16+
export function waitForInnerHTML(
17+
selector: string,
18+
expected: string,
19+
timeoutMs = 1000,
20+
) {
21+
const container = css(selector).element()
22+
const getHTML = () => container.innerHTML
23+
24+
if (getHTML().includes(expected)) {
25+
return Promise.resolve()
26+
}
27+
28+
return new Promise<void>((resolve, reject) => {
29+
const cleanup = () => {
30+
clearTimeout(timer)
31+
observer.disconnect()
32+
}
33+
34+
const check = () => {
35+
if (getHTML().includes(expected)) {
36+
cleanup()
37+
resolve()
38+
}
39+
}
40+
41+
const observer = new MutationObserver(check)
42+
const timer = setTimeout(() => {
43+
const actual = getHTML()
44+
cleanup()
45+
reject(
46+
new Error(
47+
`Timed out waiting for innerHTML to contain ${expected} in ${selector}.\nReceived: ${actual}`,
48+
),
49+
)
50+
}, timeoutMs)
51+
52+
observer.observe(container, {
53+
subtree: true,
54+
childList: true,
55+
characterData: true,
56+
attributes: true,
1557
})
1658
})
1759
}
60+
61+
export const nextFrame = () =>
62+
new Promise(resolve => {
63+
requestAnimationFrame(resolve)
64+
})
65+
66+
export const click = (selector: string) => {
67+
;(css(selector).element() as HTMLButtonElement).click()
68+
}
69+
70+
export async function enterValue(locator: Locator, text: string) {
71+
await locator.fill(text)
72+
await userEvent.type(locator, '{enter}')
73+
}

packages-private/vapor-e2e-test/__tests__/server.ts

Lines changed: 0 additions & 41 deletions
This file was deleted.

0 commit comments

Comments
 (0)