Mercurial
annotate hg-web/e2e/app_e2e_test.js @ 279:b3b547563ec7
Add Google connector service and agent wiki
Implement the C/Seobeo Google Drive and Gmail connector with encrypted OAuth storage, Zenbu authentication, browser testing, AI tool discovery, chunked HTTP decoding, and Bazel coverage. Consolidate repository guidance into progressive wiki documentation and enforce arena-first allocation for new first-party C code.
Co-authored-by: Copilot <[email protected]>
Copilot-Session: 84c338fd-0939-4bb3-b7f3-1062eb213e5d
| author | MrJuneJune <me@mrjunejune.com> |
|---|---|
| date | Mon, 17 Aug 2026 22:22:36 -0700 |
| parents | c5129452493e |
| children |
| rev | line source |
|---|---|
|
223
0e7b9464248d
[hg-web] Add browser route regression coverage
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
1 const assert = require('node:assert/strict'); |
|
0e7b9464248d
[hg-web] Add browser route regression coverage
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
2 const fs = require('node:fs'); |
|
0e7b9464248d
[hg-web] Add browser route regression coverage
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
3 const os = require('node:os'); |
|
0e7b9464248d
[hg-web] Add browser route regression coverage
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
4 const path = require('node:path'); |
|
0e7b9464248d
[hg-web] Add browser route regression coverage
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
5 const { spawn, spawnSync } = require('node:child_process'); |
|
0e7b9464248d
[hg-web] Add browser route regression coverage
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
6 const { chromium } = require('playwright-core'); |
|
0e7b9464248d
[hg-web] Add browser route regression coverage
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
7 |
|
0e7b9464248d
[hg-web] Add browser route regression coverage
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
8 const BASE_URL = 'http://127.0.0.1:6970'; |
|
0e7b9464248d
[hg-web] Add browser route regression coverage
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
9 const RUNFILES = process.env.JS_BINARY__RUNFILES; |
|
0e7b9464248d
[hg-web] Add browser route regression coverage
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
10 const WORKSPACE = process.env.JS_BINARY__WORKSPACE; |
|
249
c5129452493e
[deploy] Bundle Mercurial with hg-web
MrJuneJune <me@mrjunejune.com>
parents:
225
diff
changeset
|
11 let hgCommand = 'hg'; |
|
223
0e7b9464248d
[hg-web] Add browser route regression coverage
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
12 |
|
0e7b9464248d
[hg-web] Add browser route regression coverage
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
13 function run(command, args, options = {}) { |
|
0e7b9464248d
[hg-web] Add browser route regression coverage
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
14 const result = spawnSync(command, args, { |
|
0e7b9464248d
[hg-web] Add browser route regression coverage
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
15 encoding: 'utf8', |
|
0e7b9464248d
[hg-web] Add browser route regression coverage
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
16 ...options, |
|
0e7b9464248d
[hg-web] Add browser route regression coverage
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
17 }); |
|
0e7b9464248d
[hg-web] Add browser route regression coverage
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
18 if (result.status !== 0) { |
|
0e7b9464248d
[hg-web] Add browser route regression coverage
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
19 throw new Error( |
|
0e7b9464248d
[hg-web] Add browser route regression coverage
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
20 `${command} ${args.join(' ')} failed\n${result.stdout || ''}${result.stderr || ''}`, |
|
0e7b9464248d
[hg-web] Add browser route regression coverage
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
21 ); |
|
0e7b9464248d
[hg-web] Add browser route regression coverage
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
22 } |
|
0e7b9464248d
[hg-web] Add browser route regression coverage
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
23 return result.stdout.trim(); |
|
0e7b9464248d
[hg-web] Add browser route regression coverage
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
24 } |
|
0e7b9464248d
[hg-web] Add browser route regression coverage
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
25 |
|
0e7b9464248d
[hg-web] Add browser route regression coverage
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
26 function mercurialEnvironment(home) { |
|
0e7b9464248d
[hg-web] Add browser route regression coverage
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
27 return { |
|
0e7b9464248d
[hg-web] Add browser route regression coverage
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
28 ...process.env, |
|
0e7b9464248d
[hg-web] Add browser route regression coverage
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
29 HGPLAIN: '1', |
|
0e7b9464248d
[hg-web] Add browser route regression coverage
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
30 HGRCPATH: '', |
|
0e7b9464248d
[hg-web] Add browser route regression coverage
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
31 HOME: home, |
|
0e7b9464248d
[hg-web] Add browser route regression coverage
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
32 }; |
|
0e7b9464248d
[hg-web] Add browser route regression coverage
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
33 } |
|
0e7b9464248d
[hg-web] Add browser route regression coverage
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
34 |
|
0e7b9464248d
[hg-web] Add browser route regression coverage
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
35 function stopProcess(child) { |
|
0e7b9464248d
[hg-web] Add browser route regression coverage
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
36 if (!child || child.exitCode !== null) return Promise.resolve(); |
|
0e7b9464248d
[hg-web] Add browser route regression coverage
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
37 child.kill('SIGTERM'); |
|
0e7b9464248d
[hg-web] Add browser route regression coverage
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
38 return new Promise(resolve => { |
|
0e7b9464248d
[hg-web] Add browser route regression coverage
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
39 const timer = setTimeout(() => { |
|
0e7b9464248d
[hg-web] Add browser route regression coverage
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
40 if (child.exitCode === null) child.kill('SIGKILL'); |
|
0e7b9464248d
[hg-web] Add browser route regression coverage
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
41 }, 3000); |
|
0e7b9464248d
[hg-web] Add browser route regression coverage
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
42 child.once('exit', () => { |
|
0e7b9464248d
[hg-web] Add browser route regression coverage
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
43 clearTimeout(timer); |
|
0e7b9464248d
[hg-web] Add browser route regression coverage
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
44 resolve(); |
|
0e7b9464248d
[hg-web] Add browser route regression coverage
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
45 }); |
|
0e7b9464248d
[hg-web] Add browser route regression coverage
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
46 }); |
|
0e7b9464248d
[hg-web] Add browser route regression coverage
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
47 } |
|
0e7b9464248d
[hg-web] Add browser route regression coverage
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
48 |
|
0e7b9464248d
[hg-web] Add browser route regression coverage
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
49 async function waitForHttp(url, child, logs) { |
|
0e7b9464248d
[hg-web] Add browser route regression coverage
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
50 const deadline = Date.now() + 15000; |
|
0e7b9464248d
[hg-web] Add browser route regression coverage
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
51 while (Date.now() < deadline) { |
|
0e7b9464248d
[hg-web] Add browser route regression coverage
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
52 if (child.exitCode !== null) { |
|
0e7b9464248d
[hg-web] Add browser route regression coverage
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
53 throw new Error(`Server exited early with ${child.exitCode}\n${logs.join('')}`); |
|
0e7b9464248d
[hg-web] Add browser route regression coverage
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
54 } |
|
0e7b9464248d
[hg-web] Add browser route regression coverage
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
55 try { |
|
0e7b9464248d
[hg-web] Add browser route regression coverage
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
56 const response = await fetch(url); |
|
0e7b9464248d
[hg-web] Add browser route regression coverage
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
57 if (response.ok) return; |
|
0e7b9464248d
[hg-web] Add browser route regression coverage
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
58 } catch { |
|
0e7b9464248d
[hg-web] Add browser route regression coverage
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
59 // Keep waiting for startup. |
|
0e7b9464248d
[hg-web] Add browser route regression coverage
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
60 } |
|
0e7b9464248d
[hg-web] Add browser route regression coverage
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
61 await new Promise(resolve => setTimeout(resolve, 100)); |
|
0e7b9464248d
[hg-web] Add browser route regression coverage
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
62 } |
|
0e7b9464248d
[hg-web] Add browser route regression coverage
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
63 throw new Error(`Timed out waiting for ${url}\n${logs.join('')}`); |
|
0e7b9464248d
[hg-web] Add browser route regression coverage
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
64 } |
|
0e7b9464248d
[hg-web] Add browser route regression coverage
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
65 |
|
0e7b9464248d
[hg-web] Add browser route regression coverage
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
66 function createFixtureRepository(root) { |
|
0e7b9464248d
[hg-web] Add browser route regression coverage
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
67 const options = { env: mercurialEnvironment(root) }; |
|
249
c5129452493e
[deploy] Bundle Mercurial with hg-web
MrJuneJune <me@mrjunejune.com>
parents:
225
diff
changeset
|
68 run(hgCommand, ['init', root], options); |
|
223
0e7b9464248d
[hg-web] Add browser route regression coverage
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
69 fs.mkdirSync(path.join(root, 'docs'), { recursive: true }); |
|
0e7b9464248d
[hg-web] Add browser route regression coverage
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
70 fs.mkdirSync(path.join(root, 'src'), { recursive: true }); |
|
0e7b9464248d
[hg-web] Add browser route regression coverage
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
71 fs.writeFileSync( |
|
0e7b9464248d
[hg-web] Add browser route regression coverage
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
72 path.join(root, 'README.md'), |
|
0e7b9464248d
[hg-web] Add browser route regression coverage
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
73 '# Fixture Repository\n\n<script>window.__hgWebXss = true</script>\n', |
|
0e7b9464248d
[hg-web] Add browser route regression coverage
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
74 ); |
|
0e7b9464248d
[hg-web] Add browser route regression coverage
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
75 fs.writeFileSync(path.join(root, 'docs', 'README.md'), '# Documentation\n\nNested README.\n'); |
|
0e7b9464248d
[hg-web] Add browser route regression coverage
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
76 fs.writeFileSync(path.join(root, 'src', 'main.c'), 'int main(void) { return 0; }\n'); |
|
224
3007ef5fc0ed
[hg-web] Simplify visuals and preview static files
MrJuneJune <me@mrjunejune.com>
parents:
223
diff
changeset
|
77 fs.writeFileSync( |
|
225
70de0c80d093
[hg-web] Add side-by-side changeset diffs
MrJuneJune <me@mrjunejune.com>
parents:
224
diff
changeset
|
78 path.join(root, 'BUILD'), |
|
70de0c80d093
[hg-web] Add side-by-side changeset diffs
MrJuneJune <me@mrjunejune.com>
parents:
224
diff
changeset
|
79 'cc_library(\n name = "fixture",\n srcs = ["src/main.c"],\n)\n', |
|
70de0c80d093
[hg-web] Add side-by-side changeset diffs
MrJuneJune <me@mrjunejune.com>
parents:
224
diff
changeset
|
80 ); |
|
70de0c80d093
[hg-web] Add side-by-side changeset diffs
MrJuneJune <me@mrjunejune.com>
parents:
224
diff
changeset
|
81 fs.writeFileSync( |
|
224
3007ef5fc0ed
[hg-web] Simplify visuals and preview static files
MrJuneJune <me@mrjunejune.com>
parents:
223
diff
changeset
|
82 path.join(root, 'pixel.png'), |
|
3007ef5fc0ed
[hg-web] Simplify visuals and preview static files
MrJuneJune <me@mrjunejune.com>
parents:
223
diff
changeset
|
83 Buffer.from( |
|
3007ef5fc0ed
[hg-web] Simplify visuals and preview static files
MrJuneJune <me@mrjunejune.com>
parents:
223
diff
changeset
|
84 'iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mP8/x8AAusB9Wl2nWQAAAAASUVORK5CYII=', |
|
3007ef5fc0ed
[hg-web] Simplify visuals and preview static files
MrJuneJune <me@mrjunejune.com>
parents:
223
diff
changeset
|
85 'base64', |
|
3007ef5fc0ed
[hg-web] Simplify visuals and preview static files
MrJuneJune <me@mrjunejune.com>
parents:
223
diff
changeset
|
86 ), |
|
3007ef5fc0ed
[hg-web] Simplify visuals and preview static files
MrJuneJune <me@mrjunejune.com>
parents:
223
diff
changeset
|
87 ); |
|
3007ef5fc0ed
[hg-web] Simplify visuals and preview static files
MrJuneJune <me@mrjunejune.com>
parents:
223
diff
changeset
|
88 fs.writeFileSync(path.join(root, 'movie.mp4'), Buffer.from('00000018667479706d703432', 'hex')); |
|
3007ef5fc0ed
[hg-web] Simplify visuals and preview static files
MrJuneJune <me@mrjunejune.com>
parents:
223
diff
changeset
|
89 fs.writeFileSync(path.join(root, 'sound.mp3'), Buffer.from('ID3')); |
|
3007ef5fc0ed
[hg-web] Simplify visuals and preview static files
MrJuneJune <me@mrjunejune.com>
parents:
223
diff
changeset
|
90 fs.writeFileSync(path.join(root, 'document.pdf'), Buffer.from('%PDF-1.4\n%%EOF\n')); |
|
3007ef5fc0ed
[hg-web] Simplify visuals and preview static files
MrJuneJune <me@mrjunejune.com>
parents:
223
diff
changeset
|
91 fs.writeFileSync(path.join(root, 'archive.bin'), Buffer.from([0, 1, 2, 3])); |
|
249
c5129452493e
[deploy] Bundle Mercurial with hg-web
MrJuneJune <me@mrjunejune.com>
parents:
225
diff
changeset
|
92 run(hgCommand, ['--repository', root, 'add'], options); |
|
c5129452493e
[deploy] Bundle Mercurial with hg-web
MrJuneJune <me@mrjunejune.com>
parents:
225
diff
changeset
|
93 run(hgCommand, ['--repository', root, 'commit', '-u', 'Test User <[email protected]>', '-m', 'Initial fixture'], options); |
|
c5129452493e
[deploy] Bundle Mercurial with hg-web
MrJuneJune <me@mrjunejune.com>
parents:
225
diff
changeset
|
94 const firstNode = run(hgCommand, ['--repository', root, 'log', '-r', '.', '-T', '{node}'], options); |
|
223
0e7b9464248d
[hg-web] Add browser route regression coverage
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
95 |
|
225
70de0c80d093
[hg-web] Add side-by-side changeset diffs
MrJuneJune <me@mrjunejune.com>
parents:
224
diff
changeset
|
96 fs.writeFileSync( |
|
70de0c80d093
[hg-web] Add side-by-side changeset diffs
MrJuneJune <me@mrjunejune.com>
parents:
224
diff
changeset
|
97 path.join(root, 'README.md'), |
|
70de0c80d093
[hg-web] Add side-by-side changeset diffs
MrJuneJune <me@mrjunejune.com>
parents:
224
diff
changeset
|
98 '# Updated Fixture Repository\n\n<script>window.__hgWebXss = true</script>\n\nSecond revision.\n', |
|
70de0c80d093
[hg-web] Add side-by-side changeset diffs
MrJuneJune <me@mrjunejune.com>
parents:
224
diff
changeset
|
99 ); |
|
223
0e7b9464248d
[hg-web] Add browser route regression coverage
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
100 fs.writeFileSync(path.join(root, 'new-file.txt'), 'new file\n'); |
|
249
c5129452493e
[deploy] Bundle Mercurial with hg-web
MrJuneJune <me@mrjunejune.com>
parents:
225
diff
changeset
|
101 run(hgCommand, ['add', 'new-file.txt'], { ...options, cwd: root }); |
|
c5129452493e
[deploy] Bundle Mercurial with hg-web
MrJuneJune <me@mrjunejune.com>
parents:
225
diff
changeset
|
102 run(hgCommand, ['--repository', root, 'commit', '-u', 'Test User <[email protected]>', '-m', 'Update fixture'], options); |
|
c5129452493e
[deploy] Bundle Mercurial with hg-web
MrJuneJune <me@mrjunejune.com>
parents:
225
diff
changeset
|
103 const tipNode = run(hgCommand, ['--repository', root, 'log', '-r', '.', '-T', '{node}'], options); |
|
223
0e7b9464248d
[hg-web] Add browser route regression coverage
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
104 return { firstNode, tipNode }; |
|
0e7b9464248d
[hg-web] Add browser route regression coverage
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
105 } |
|
0e7b9464248d
[hg-web] Add browser route regression coverage
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
106 |
|
0e7b9464248d
[hg-web] Add browser route regression coverage
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
107 async function assertJson(pathname, status = 200) { |
|
0e7b9464248d
[hg-web] Add browser route regression coverage
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
108 const response = await fetch(`${BASE_URL}${pathname}`); |
|
0e7b9464248d
[hg-web] Add browser route regression coverage
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
109 const body = await response.text(); |
|
0e7b9464248d
[hg-web] Add browser route regression coverage
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
110 assert.equal(response.status, status, `${pathname} status: ${body}`); |
|
0e7b9464248d
[hg-web] Add browser route regression coverage
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
111 return JSON.parse(body); |
|
0e7b9464248d
[hg-web] Add browser route regression coverage
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
112 } |
|
0e7b9464248d
[hg-web] Add browser route regression coverage
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
113 |
|
0e7b9464248d
[hg-web] Add browser route regression coverage
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
114 async function assertPageHasNoBrowserErrors(browser, pathname, assertion) { |
|
0e7b9464248d
[hg-web] Add browser route regression coverage
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
115 const page = await browser.newPage(); |
|
0e7b9464248d
[hg-web] Add browser route regression coverage
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
116 const errors = []; |
|
0e7b9464248d
[hg-web] Add browser route regression coverage
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
117 page.on('pageerror', error => errors.push(`pageerror: ${error.stack || error.message}`)); |
|
0e7b9464248d
[hg-web] Add browser route regression coverage
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
118 page.on('console', message => { |
|
0e7b9464248d
[hg-web] Add browser route regression coverage
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
119 if (message.type() === 'error') errors.push(`console: ${message.text()}`); |
|
0e7b9464248d
[hg-web] Add browser route regression coverage
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
120 }); |
|
0e7b9464248d
[hg-web] Add browser route regression coverage
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
121 page.on('requestfailed', request => { |
|
0e7b9464248d
[hg-web] Add browser route regression coverage
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
122 errors.push(`requestfailed: ${request.url()} ${request.failure()?.errorText || ''}`); |
|
0e7b9464248d
[hg-web] Add browser route regression coverage
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
123 }); |
|
0e7b9464248d
[hg-web] Add browser route regression coverage
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
124 page.on('response', response => { |
|
0e7b9464248d
[hg-web] Add browser route regression coverage
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
125 if (response.status() >= 400) { |
|
0e7b9464248d
[hg-web] Add browser route regression coverage
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
126 errors.push(`response: ${response.status()} ${response.url()}`); |
|
0e7b9464248d
[hg-web] Add browser route regression coverage
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
127 } |
|
0e7b9464248d
[hg-web] Add browser route regression coverage
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
128 }); |
|
0e7b9464248d
[hg-web] Add browser route regression coverage
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
129 |
|
0e7b9464248d
[hg-web] Add browser route regression coverage
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
130 const response = await page.goto(`${BASE_URL}${pathname}`, { waitUntil: 'networkidle' }); |
|
0e7b9464248d
[hg-web] Add browser route regression coverage
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
131 assert.equal(response.status(), 200, `${pathname} document status`); |
|
0e7b9464248d
[hg-web] Add browser route regression coverage
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
132 await assertion(page); |
|
0e7b9464248d
[hg-web] Add browser route regression coverage
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
133 if (errors.length > 0) { |
|
0e7b9464248d
[hg-web] Add browser route regression coverage
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
134 throw new Error(`${pathname} browser errors\n${errors.join('\n')}`); |
|
0e7b9464248d
[hg-web] Add browser route regression coverage
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
135 } |
|
0e7b9464248d
[hg-web] Add browser route regression coverage
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
136 await page.close(); |
|
0e7b9464248d
[hg-web] Add browser route regression coverage
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
137 } |
|
0e7b9464248d
[hg-web] Add browser route regression coverage
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
138 |
|
0e7b9464248d
[hg-web] Add browser route regression coverage
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
139 async function main() { |
|
0e7b9464248d
[hg-web] Add browser route regression coverage
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
140 assert.ok(RUNFILES, 'rules_js runfiles path is required'); |
|
0e7b9464248d
[hg-web] Add browser route regression coverage
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
141 assert.ok(WORKSPACE, 'rules_js workspace name is required'); |
|
0e7b9464248d
[hg-web] Add browser route regression coverage
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
142 |
|
0e7b9464248d
[hg-web] Add browser route regression coverage
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
143 const fixtureRoot = fs.mkdtempSync(path.join(os.tmpdir(), 'hg-web-e2e-')); |
|
0e7b9464248d
[hg-web] Add browser route regression coverage
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
144 const appLogs = []; |
|
0e7b9464248d
[hg-web] Add browser route regression coverage
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
145 const hgLogs = []; |
|
0e7b9464248d
[hg-web] Add browser route regression coverage
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
146 let hgServer; |
|
0e7b9464248d
[hg-web] Add browser route regression coverage
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
147 let appServer; |
|
0e7b9464248d
[hg-web] Add browser route regression coverage
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
148 let browser; |
|
0e7b9464248d
[hg-web] Add browser route regression coverage
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
149 |
|
0e7b9464248d
[hg-web] Add browser route regression coverage
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
150 try { |
|
0e7b9464248d
[hg-web] Add browser route regression coverage
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
151 const runfilesWorkspace = path.join(RUNFILES, WORKSPACE); |
|
0e7b9464248d
[hg-web] Add browser route regression coverage
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
152 const serverBinary = path.join(runfilesWorkspace, 'hg-web', 'hg_web_server'); |
|
249
c5129452493e
[deploy] Bundle Mercurial with hg-web
MrJuneJune <me@mrjunejune.com>
parents:
225
diff
changeset
|
153 hgCommand = path.join( |
|
c5129452493e
[deploy] Bundle Mercurial with hg-web
MrJuneJune <me@mrjunejune.com>
parents:
225
diff
changeset
|
154 runfilesWorkspace, |
|
c5129452493e
[deploy] Bundle Mercurial with hg-web
MrJuneJune <me@mrjunejune.com>
parents:
225
diff
changeset
|
155 'third_party', |
|
c5129452493e
[deploy] Bundle Mercurial with hg-web
MrJuneJune <me@mrjunejune.com>
parents:
225
diff
changeset
|
156 'mercurial', |
|
c5129452493e
[deploy] Bundle Mercurial with hg-web
MrJuneJune <me@mrjunejune.com>
parents:
225
diff
changeset
|
157 'runtime', |
|
c5129452493e
[deploy] Bundle Mercurial with hg-web
MrJuneJune <me@mrjunejune.com>
parents:
225
diff
changeset
|
158 'bin', |
|
c5129452493e
[deploy] Bundle Mercurial with hg-web
MrJuneJune <me@mrjunejune.com>
parents:
225
diff
changeset
|
159 'hg', |
|
c5129452493e
[deploy] Bundle Mercurial with hg-web
MrJuneJune <me@mrjunejune.com>
parents:
225
diff
changeset
|
160 ); |
|
223
0e7b9464248d
[hg-web] Add browser route regression coverage
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
161 const chromiumPath = path.resolve(process.env.CHROMIUM_PATH); |
|
0e7b9464248d
[hg-web] Add browser route regression coverage
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
162 |
|
0e7b9464248d
[hg-web] Add browser route regression coverage
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
163 assert.ok(fs.existsSync(serverBinary), `missing server binary: ${serverBinary}`); |
|
249
c5129452493e
[deploy] Bundle Mercurial with hg-web
MrJuneJune <me@mrjunejune.com>
parents:
225
diff
changeset
|
164 assert.ok(fs.existsSync(hgCommand), `missing bundled Mercurial: ${hgCommand}`); |
|
223
0e7b9464248d
[hg-web] Add browser route regression coverage
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
165 assert.ok(fs.existsSync(chromiumPath), `missing Chromium binary: ${chromiumPath}`); |
|
249
c5129452493e
[deploy] Bundle Mercurial with hg-web
MrJuneJune <me@mrjunejune.com>
parents:
225
diff
changeset
|
166 const { firstNode, tipNode } = createFixtureRepository(fixtureRoot); |
|
223
0e7b9464248d
[hg-web] Add browser route regression coverage
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
167 |
|
0e7b9464248d
[hg-web] Add browser route regression coverage
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
168 hgServer = spawn( |
|
249
c5129452493e
[deploy] Bundle Mercurial with hg-web
MrJuneJune <me@mrjunejune.com>
parents:
225
diff
changeset
|
169 hgCommand, |
|
223
0e7b9464248d
[hg-web] Add browser route regression coverage
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
170 [ |
|
0e7b9464248d
[hg-web] Add browser route regression coverage
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
171 '--repository', fixtureRoot, |
|
0e7b9464248d
[hg-web] Add browser route regression coverage
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
172 'serve', |
|
0e7b9464248d
[hg-web] Add browser route regression coverage
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
173 '--address', '127.0.0.1', |
|
0e7b9464248d
[hg-web] Add browser route regression coverage
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
174 '--port', '4444', |
|
0e7b9464248d
[hg-web] Add browser route regression coverage
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
175 '--accesslog', '-', |
|
0e7b9464248d
[hg-web] Add browser route regression coverage
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
176 '--errorlog', '-', |
|
0e7b9464248d
[hg-web] Add browser route regression coverage
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
177 ], |
|
0e7b9464248d
[hg-web] Add browser route regression coverage
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
178 { |
|
0e7b9464248d
[hg-web] Add browser route regression coverage
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
179 env: mercurialEnvironment(fixtureRoot), |
|
0e7b9464248d
[hg-web] Add browser route regression coverage
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
180 stdio: ['ignore', 'pipe', 'pipe'], |
|
0e7b9464248d
[hg-web] Add browser route regression coverage
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
181 }, |
|
0e7b9464248d
[hg-web] Add browser route regression coverage
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
182 ); |
|
0e7b9464248d
[hg-web] Add browser route regression coverage
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
183 hgServer.stdout.on('data', chunk => hgLogs.push(chunk.toString())); |
|
0e7b9464248d
[hg-web] Add browser route regression coverage
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
184 hgServer.stderr.on('data', chunk => hgLogs.push(chunk.toString())); |
|
0e7b9464248d
[hg-web] Add browser route regression coverage
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
185 |
|
0e7b9464248d
[hg-web] Add browser route regression coverage
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
186 appServer = spawn(serverBinary, [], { |
|
0e7b9464248d
[hg-web] Add browser route regression coverage
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
187 cwd: runfilesWorkspace, |
|
0e7b9464248d
[hg-web] Add browser route regression coverage
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
188 stdio: ['ignore', 'pipe', 'pipe'], |
|
0e7b9464248d
[hg-web] Add browser route regression coverage
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
189 }); |
|
0e7b9464248d
[hg-web] Add browser route regression coverage
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
190 appServer.stdout.on('data', chunk => appLogs.push(chunk.toString())); |
|
0e7b9464248d
[hg-web] Add browser route regression coverage
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
191 appServer.stderr.on('data', chunk => appLogs.push(chunk.toString())); |
|
0e7b9464248d
[hg-web] Add browser route regression coverage
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
192 |
|
0e7b9464248d
[hg-web] Add browser route regression coverage
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
193 await waitForHttp(`${BASE_URL}/`, appServer, appLogs); |
|
0e7b9464248d
[hg-web] Add browser route regression coverage
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
194 if (hgServer.exitCode !== null) { |
|
0e7b9464248d
[hg-web] Add browser route regression coverage
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
195 throw new Error(`Mercurial server exited early with ${hgServer.exitCode}\n${hgLogs.join('')}`); |
|
0e7b9464248d
[hg-web] Add browser route regression coverage
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
196 } |
|
0e7b9464248d
[hg-web] Add browser route regression coverage
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
197 await waitForHttp(`${BASE_URL}/api/repo/list`, hgServer, hgLogs); |
|
0e7b9464248d
[hg-web] Add browser route regression coverage
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
198 |
|
0e7b9464248d
[hg-web] Add browser route regression coverage
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
199 for (const pathname of ['/', '/directory', '/directory?path=docs', '/graph', `/changeset/${tipNode}`]) { |
|
0e7b9464248d
[hg-web] Add browser route regression coverage
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
200 const response = await fetch(`${BASE_URL}${pathname}`); |
|
0e7b9464248d
[hg-web] Add browser route regression coverage
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
201 assert.equal(response.status, 200, `${pathname} shell route`); |
|
0e7b9464248d
[hg-web] Add browser route regression coverage
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
202 assert.match(await response.text(), /<title>Zenbu Repository<\/title>/); |
|
0e7b9464248d
[hg-web] Add browser route regression coverage
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
203 } |
|
0e7b9464248d
[hg-web] Add browser route regression coverage
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
204 for (const pathname of ['/page.js', '/index.css', '/base.css', '/pencil_lines.png', '/panda.png']) { |
|
0e7b9464248d
[hg-web] Add browser route regression coverage
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
205 const response = await fetch(`${BASE_URL}${pathname}`); |
|
0e7b9464248d
[hg-web] Add browser route regression coverage
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
206 assert.equal(response.status, 200, `${pathname} static asset`); |
|
0e7b9464248d
[hg-web] Add browser route regression coverage
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
207 assert.ok((await response.arrayBuffer()).byteLength > 0, `${pathname} is non-empty`); |
|
0e7b9464248d
[hg-web] Add browser route regression coverage
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
208 } |
|
224
3007ef5fc0ed
[hg-web] Simplify visuals and preview static files
MrJuneJune <me@mrjunejune.com>
parents:
223
diff
changeset
|
209 for (const pathname of ['/hg-web-background.jpg', '/pencil_texture.png']) { |
|
3007ef5fc0ed
[hg-web] Simplify visuals and preview static files
MrJuneJune <me@mrjunejune.com>
parents:
223
diff
changeset
|
210 assert.equal((await fetch(`${BASE_URL}${pathname}`)).status, 404); |
|
3007ef5fc0ed
[hg-web] Simplify visuals and preview static files
MrJuneJune <me@mrjunejune.com>
parents:
223
diff
changeset
|
211 } |
|
223
0e7b9464248d
[hg-web] Add browser route regression coverage
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
212 |
|
0e7b9464248d
[hg-web] Add browser route regression coverage
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
213 const rootList = await assertJson('/api/repo/list'); |
|
0e7b9464248d
[hg-web] Add browser route regression coverage
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
214 assert.ok(rootList.directories.some(entry => entry.basename === 'docs')); |
|
0e7b9464248d
[hg-web] Add browser route regression coverage
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
215 assert.ok(rootList.files.some(entry => entry.basename === 'README.md')); |
|
0e7b9464248d
[hg-web] Add browser route regression coverage
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
216 |
|
0e7b9464248d
[hg-web] Add browser route regression coverage
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
217 const nestedList = await assertJson('/api/repo/list?path=docs'); |
|
0e7b9464248d
[hg-web] Add browser route regression coverage
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
218 assert.ok(nestedList.files.some(entry => entry.basename === 'README.md')); |
|
0e7b9464248d
[hg-web] Add browser route regression coverage
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
219 |
|
0e7b9464248d
[hg-web] Add browser route regression coverage
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
220 const fileResponse = await fetch(`${BASE_URL}/api/repo/file?path=src%2Fmain.c`); |
|
0e7b9464248d
[hg-web] Add browser route regression coverage
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
221 assert.equal(fileResponse.status, 200); |
|
0e7b9464248d
[hg-web] Add browser route regression coverage
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
222 assert.match(await fileResponse.text(), /int main/); |
|
0e7b9464248d
[hg-web] Add browser route regression coverage
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
223 |
|
224
3007ef5fc0ed
[hg-web] Simplify visuals and preview static files
MrJuneJune <me@mrjunejune.com>
parents:
223
diff
changeset
|
224 for (const [filename, contentType, disposition] of [ |
|
3007ef5fc0ed
[hg-web] Simplify visuals and preview static files
MrJuneJune <me@mrjunejune.com>
parents:
223
diff
changeset
|
225 ['pixel.png', 'image/png', 'inline'], |
|
3007ef5fc0ed
[hg-web] Simplify visuals and preview static files
MrJuneJune <me@mrjunejune.com>
parents:
223
diff
changeset
|
226 ['movie.mp4', 'video/mp4', 'inline'], |
|
3007ef5fc0ed
[hg-web] Simplify visuals and preview static files
MrJuneJune <me@mrjunejune.com>
parents:
223
diff
changeset
|
227 ['sound.mp3', 'audio/mpeg', 'inline'], |
|
3007ef5fc0ed
[hg-web] Simplify visuals and preview static files
MrJuneJune <me@mrjunejune.com>
parents:
223
diff
changeset
|
228 ['document.pdf', 'application/pdf', 'inline'], |
|
3007ef5fc0ed
[hg-web] Simplify visuals and preview static files
MrJuneJune <me@mrjunejune.com>
parents:
223
diff
changeset
|
229 ['archive.bin', 'application/octet-stream', 'attachment'], |
|
3007ef5fc0ed
[hg-web] Simplify visuals and preview static files
MrJuneJune <me@mrjunejune.com>
parents:
223
diff
changeset
|
230 ]) { |
|
3007ef5fc0ed
[hg-web] Simplify visuals and preview static files
MrJuneJune <me@mrjunejune.com>
parents:
223
diff
changeset
|
231 const response = await fetch( |
|
3007ef5fc0ed
[hg-web] Simplify visuals and preview static files
MrJuneJune <me@mrjunejune.com>
parents:
223
diff
changeset
|
232 `${BASE_URL}/api/repo/file?path=${encodeURIComponent(filename)}`, |
|
3007ef5fc0ed
[hg-web] Simplify visuals and preview static files
MrJuneJune <me@mrjunejune.com>
parents:
223
diff
changeset
|
233 ); |
|
3007ef5fc0ed
[hg-web] Simplify visuals and preview static files
MrJuneJune <me@mrjunejune.com>
parents:
223
diff
changeset
|
234 assert.equal(response.status, 200, `${filename} response`); |
|
3007ef5fc0ed
[hg-web] Simplify visuals and preview static files
MrJuneJune <me@mrjunejune.com>
parents:
223
diff
changeset
|
235 assert.match(response.headers.get('content-type') || '', new RegExp(`^${contentType}`)); |
|
3007ef5fc0ed
[hg-web] Simplify visuals and preview static files
MrJuneJune <me@mrjunejune.com>
parents:
223
diff
changeset
|
236 assert.equal(response.headers.get('content-disposition'), disposition); |
|
3007ef5fc0ed
[hg-web] Simplify visuals and preview static files
MrJuneJune <me@mrjunejune.com>
parents:
223
diff
changeset
|
237 assert.equal(response.headers.get('x-content-type-options'), 'nosniff'); |
|
3007ef5fc0ed
[hg-web] Simplify visuals and preview static files
MrJuneJune <me@mrjunejune.com>
parents:
223
diff
changeset
|
238 assert.ok((await response.arrayBuffer()).byteLength > 0); |
|
3007ef5fc0ed
[hg-web] Simplify visuals and preview static files
MrJuneJune <me@mrjunejune.com>
parents:
223
diff
changeset
|
239 } |
|
3007ef5fc0ed
[hg-web] Simplify visuals and preview static files
MrJuneJune <me@mrjunejune.com>
parents:
223
diff
changeset
|
240 const binaryResponse = await fetch(`${BASE_URL}/api/repo/file?path=archive.bin`); |
|
3007ef5fc0ed
[hg-web] Simplify visuals and preview static files
MrJuneJune <me@mrjunejune.com>
parents:
223
diff
changeset
|
241 assert.deepEqual( |
|
3007ef5fc0ed
[hg-web] Simplify visuals and preview static files
MrJuneJune <me@mrjunejune.com>
parents:
223
diff
changeset
|
242 Buffer.from(await binaryResponse.arrayBuffer()), |
|
3007ef5fc0ed
[hg-web] Simplify visuals and preview static files
MrJuneJune <me@mrjunejune.com>
parents:
223
diff
changeset
|
243 Buffer.from([0, 1, 2, 3]), |
|
3007ef5fc0ed
[hg-web] Simplify visuals and preview static files
MrJuneJune <me@mrjunejune.com>
parents:
223
diff
changeset
|
244 ); |
|
3007ef5fc0ed
[hg-web] Simplify visuals and preview static files
MrJuneJune <me@mrjunejune.com>
parents:
223
diff
changeset
|
245 |
|
223
0e7b9464248d
[hg-web] Add browser route regression coverage
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
246 const readmeResponse = await fetch(`${BASE_URL}/api/repo/readme?path=docs`); |
|
0e7b9464248d
[hg-web] Add browser route regression coverage
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
247 assert.equal(readmeResponse.status, 200); |
|
0e7b9464248d
[hg-web] Add browser route regression coverage
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
248 assert.match(await readmeResponse.text(), /Nested README/); |
|
0e7b9464248d
[hg-web] Add browser route regression coverage
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
249 assert.equal((await fetch(`${BASE_URL}/api/repo/readme?path=src`)).status, 204); |
|
0e7b9464248d
[hg-web] Add browser route regression coverage
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
250 |
|
0e7b9464248d
[hg-web] Add browser route regression coverage
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
251 const graph = await assertJson('/api/graph/tip?style=json'); |
|
0e7b9464248d
[hg-web] Add browser route regression coverage
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
252 assert.equal(graph.node, tipNode); |
|
0e7b9464248d
[hg-web] Add browser route regression coverage
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
253 assert.ok(graph.changesets.length >= 2); |
|
0e7b9464248d
[hg-web] Add browser route regression coverage
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
254 |
|
0e7b9464248d
[hg-web] Add browser route regression coverage
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
255 const changeset = await assertJson(`/api/changeset/${tipNode}`); |
|
0e7b9464248d
[hg-web] Add browser route regression coverage
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
256 assert.equal(changeset.node, tipNode); |
|
0e7b9464248d
[hg-web] Add browser route regression coverage
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
257 assert.equal(changeset.desc, 'Update fixture'); |
|
0e7b9464248d
[hg-web] Add browser route regression coverage
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
258 assert.ok(changeset.files.some(entry => entry.file === 'new-file.txt' && entry.status === 'added')); |
|
0e7b9464248d
[hg-web] Add browser route regression coverage
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
259 assert.ok(changeset.diff.length > 0); |
|
0e7b9464248d
[hg-web] Add browser route regression coverage
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
260 |
|
0e7b9464248d
[hg-web] Add browser route regression coverage
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
261 for (const pathname of [ |
|
0e7b9464248d
[hg-web] Add browser route regression coverage
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
262 '/api/repo/list?path=..%2Fetc', |
|
0e7b9464248d
[hg-web] Add browser route regression coverage
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
263 '/api/repo/file?path=..%2FREADME.md', |
|
0e7b9464248d
[hg-web] Add browser route regression coverage
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
264 '/api/graph/not-a-node?style=json', |
|
0e7b9464248d
[hg-web] Add browser route regression coverage
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
265 '/api/changeset/not-a-node', |
|
0e7b9464248d
[hg-web] Add browser route regression coverage
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
266 ]) { |
|
0e7b9464248d
[hg-web] Add browser route regression coverage
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
267 const response = await fetch(`${BASE_URL}${pathname}`); |
|
0e7b9464248d
[hg-web] Add browser route regression coverage
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
268 assert.equal(response.status, 400, `${pathname} rejects invalid input`); |
|
0e7b9464248d
[hg-web] Add browser route regression coverage
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
269 } |
|
0e7b9464248d
[hg-web] Add browser route regression coverage
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
270 assert.equal((await fetch(`${BASE_URL}/missing-route`)).status, 404); |
|
0e7b9464248d
[hg-web] Add browser route regression coverage
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
271 |
|
0e7b9464248d
[hg-web] Add browser route regression coverage
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
272 const identify = run( |
|
249
c5129452493e
[deploy] Bundle Mercurial with hg-web
MrJuneJune <me@mrjunejune.com>
parents:
225
diff
changeset
|
273 hgCommand, |
|
223
0e7b9464248d
[hg-web] Add browser route regression coverage
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
274 ['identify', `${BASE_URL}/repo`], |
|
0e7b9464248d
[hg-web] Add browser route regression coverage
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
275 { env: mercurialEnvironment(fixtureRoot) }, |
|
0e7b9464248d
[hg-web] Add browser route regression coverage
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
276 ); |
|
0e7b9464248d
[hg-web] Add browser route regression coverage
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
277 assert.match(identify, new RegExp(`^${tipNode.slice(0, 12)}`)); |
|
0e7b9464248d
[hg-web] Add browser route regression coverage
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
278 |
|
0e7b9464248d
[hg-web] Add browser route regression coverage
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
279 browser = await chromium.launch({ |
|
0e7b9464248d
[hg-web] Add browser route regression coverage
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
280 executablePath: chromiumPath, |
|
0e7b9464248d
[hg-web] Add browser route regression coverage
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
281 headless: true, |
|
0e7b9464248d
[hg-web] Add browser route regression coverage
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
282 args: ['--no-sandbox'], |
|
0e7b9464248d
[hg-web] Add browser route regression coverage
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
283 }); |
|
0e7b9464248d
[hg-web] Add browser route regression coverage
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
284 |
|
0e7b9464248d
[hg-web] Add browser route regression coverage
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
285 await assertPageHasNoBrowserErrors(browser, '/', async page => { |
|
0e7b9464248d
[hg-web] Add browser route regression coverage
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
286 await page.getByRole('heading', { name: 'Zenbu Repository' }).waitFor(); |
|
0e7b9464248d
[hg-web] Add browser route regression coverage
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
287 await page.getByText('Recent Commits').waitFor(); |
|
0e7b9464248d
[hg-web] Add browser route regression coverage
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
288 await page.getByText('Repository Files').waitFor(); |
|
0e7b9464248d
[hg-web] Add browser route regression coverage
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
289 assert.equal(await page.evaluate(() => window.__hgWebXss), undefined); |
|
224
3007ef5fc0ed
[hg-web] Simplify visuals and preview static files
MrJuneJune <me@mrjunejune.com>
parents:
223
diff
changeset
|
290 assert.equal( |
|
3007ef5fc0ed
[hg-web] Simplify visuals and preview static files
MrJuneJune <me@mrjunejune.com>
parents:
223
diff
changeset
|
291 await page.locator('.graph-container').evaluate( |
|
3007ef5fc0ed
[hg-web] Simplify visuals and preview static files
MrJuneJune <me@mrjunejune.com>
parents:
223
diff
changeset
|
292 element => getComputedStyle(element).backgroundImage, |
|
3007ef5fc0ed
[hg-web] Simplify visuals and preview static files
MrJuneJune <me@mrjunejune.com>
parents:
223
diff
changeset
|
293 ), |
|
3007ef5fc0ed
[hg-web] Simplify visuals and preview static files
MrJuneJune <me@mrjunejune.com>
parents:
223
diff
changeset
|
294 'none', |
|
3007ef5fc0ed
[hg-web] Simplify visuals and preview static files
MrJuneJune <me@mrjunejune.com>
parents:
223
diff
changeset
|
295 ); |
|
223
0e7b9464248d
[hg-web] Add browser route regression coverage
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
296 await page.locator('.theme-toggle').click(); |
|
0e7b9464248d
[hg-web] Add browser route regression coverage
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
297 }); |
|
0e7b9464248d
[hg-web] Add browser route regression coverage
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
298 |
|
0e7b9464248d
[hg-web] Add browser route regression coverage
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
299 await assertPageHasNoBrowserErrors(browser, '/directory', async page => { |
|
0e7b9464248d
[hg-web] Add browser route regression coverage
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
300 await page.getByText('Repository Files').waitFor(); |
|
0e7b9464248d
[hg-web] Add browser route regression coverage
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
301 await page.getByRole('link', { name: 'README.md' }).first().click(); |
|
225
70de0c80d093
[hg-web] Add side-by-side changeset diffs
MrJuneJune <me@mrjunejune.com>
parents:
224
diff
changeset
|
302 await page.getByText('Updated Fixture Repository').waitFor(); |
|
223
0e7b9464248d
[hg-web] Add browser route regression coverage
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
303 assert.equal(await page.evaluate(() => window.__hgWebXss), undefined); |
|
0e7b9464248d
[hg-web] Add browser route regression coverage
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
304 await page.keyboard.press('Escape'); |
|
0e7b9464248d
[hg-web] Add browser route regression coverage
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
305 |
|
0e7b9464248d
[hg-web] Add browser route regression coverage
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
306 let delayedReadmeRequested = false; |
|
0e7b9464248d
[hg-web] Add browser route regression coverage
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
307 let markReadmeRequested; |
|
0e7b9464248d
[hg-web] Add browser route regression coverage
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
308 const readmeRequested = new Promise(resolve => { |
|
0e7b9464248d
[hg-web] Add browser route regression coverage
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
309 markReadmeRequested = resolve; |
|
0e7b9464248d
[hg-web] Add browser route regression coverage
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
310 }); |
|
0e7b9464248d
[hg-web] Add browser route regression coverage
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
311 await page.route(/\/api\/repo\/readme\?path=/, async route => { |
|
0e7b9464248d
[hg-web] Add browser route regression coverage
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
312 delayedReadmeRequested = true; |
|
0e7b9464248d
[hg-web] Add browser route regression coverage
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
313 markReadmeRequested(); |
|
0e7b9464248d
[hg-web] Add browser route regression coverage
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
314 await new Promise(resolve => setTimeout(resolve, 500)); |
|
0e7b9464248d
[hg-web] Add browser route regression coverage
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
315 await route.continue(); |
|
0e7b9464248d
[hg-web] Add browser route regression coverage
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
316 }); |
|
0e7b9464248d
[hg-web] Add browser route regression coverage
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
317 await page.getByRole('link', { name: 'docs' }).click(); |
|
0e7b9464248d
[hg-web] Add browser route regression coverage
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
318 await Promise.race([ |
|
0e7b9464248d
[hg-web] Add browser route regression coverage
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
319 readmeRequested, |
|
0e7b9464248d
[hg-web] Add browser route regression coverage
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
320 new Promise((_, reject) => { |
|
0e7b9464248d
[hg-web] Add browser route regression coverage
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
321 setTimeout(() => reject(new Error('Timed out waiting for delayed README request')), 5000); |
|
0e7b9464248d
[hg-web] Add browser route regression coverage
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
322 }), |
|
0e7b9464248d
[hg-web] Add browser route regression coverage
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
323 ]); |
|
0e7b9464248d
[hg-web] Add browser route regression coverage
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
324 await page.getByRole('link', { name: 'root' }).click(); |
|
225
70de0c80d093
[hg-web] Add side-by-side changeset diffs
MrJuneJune <me@mrjunejune.com>
parents:
224
diff
changeset
|
325 await page.getByText('Updated Fixture Repository').waitFor(); |
|
223
0e7b9464248d
[hg-web] Add browser route regression coverage
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
326 await page.waitForTimeout(600); |
|
0e7b9464248d
[hg-web] Add browser route regression coverage
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
327 assert.equal(await page.getByText('Documentation').count(), 0); |
|
0e7b9464248d
[hg-web] Add browser route regression coverage
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
328 assert.equal(delayedReadmeRequested, true); |
|
0e7b9464248d
[hg-web] Add browser route regression coverage
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
329 |
|
224
3007ef5fc0ed
[hg-web] Simplify visuals and preview static files
MrJuneJune <me@mrjunejune.com>
parents:
223
diff
changeset
|
330 await page.getByRole('link', { name: 'pixel.png' }).click(); |
|
3007ef5fc0ed
[hg-web] Simplify visuals and preview static files
MrJuneJune <me@mrjunejune.com>
parents:
223
diff
changeset
|
331 const image = page.locator('.static-file-image'); |
|
3007ef5fc0ed
[hg-web] Simplify visuals and preview static files
MrJuneJune <me@mrjunejune.com>
parents:
223
diff
changeset
|
332 await image.waitFor(); |
|
3007ef5fc0ed
[hg-web] Simplify visuals and preview static files
MrJuneJune <me@mrjunejune.com>
parents:
223
diff
changeset
|
333 await image.evaluate(element => { |
|
3007ef5fc0ed
[hg-web] Simplify visuals and preview static files
MrJuneJune <me@mrjunejune.com>
parents:
223
diff
changeset
|
334 const imageElement = element; |
|
3007ef5fc0ed
[hg-web] Simplify visuals and preview static files
MrJuneJune <me@mrjunejune.com>
parents:
223
diff
changeset
|
335 if (imageElement.complete) return; |
|
3007ef5fc0ed
[hg-web] Simplify visuals and preview static files
MrJuneJune <me@mrjunejune.com>
parents:
223
diff
changeset
|
336 return new Promise((resolve, reject) => { |
|
3007ef5fc0ed
[hg-web] Simplify visuals and preview static files
MrJuneJune <me@mrjunejune.com>
parents:
223
diff
changeset
|
337 imageElement.addEventListener('load', resolve, { once: true }); |
|
3007ef5fc0ed
[hg-web] Simplify visuals and preview static files
MrJuneJune <me@mrjunejune.com>
parents:
223
diff
changeset
|
338 imageElement.addEventListener('error', reject, { once: true }); |
|
3007ef5fc0ed
[hg-web] Simplify visuals and preview static files
MrJuneJune <me@mrjunejune.com>
parents:
223
diff
changeset
|
339 }); |
|
3007ef5fc0ed
[hg-web] Simplify visuals and preview static files
MrJuneJune <me@mrjunejune.com>
parents:
223
diff
changeset
|
340 }); |
|
3007ef5fc0ed
[hg-web] Simplify visuals and preview static files
MrJuneJune <me@mrjunejune.com>
parents:
223
diff
changeset
|
341 assert.equal(await image.evaluate(element => element.naturalWidth), 1); |
|
3007ef5fc0ed
[hg-web] Simplify visuals and preview static files
MrJuneJune <me@mrjunejune.com>
parents:
223
diff
changeset
|
342 await page.getByRole('dialog', { name: 'Preview pixel.png' }).waitFor(); |
|
3007ef5fc0ed
[hg-web] Simplify visuals and preview static files
MrJuneJune <me@mrjunejune.com>
parents:
223
diff
changeset
|
343 await page.keyboard.press('Escape'); |
|
3007ef5fc0ed
[hg-web] Simplify visuals and preview static files
MrJuneJune <me@mrjunejune.com>
parents:
223
diff
changeset
|
344 |
|
225
70de0c80d093
[hg-web] Add side-by-side changeset diffs
MrJuneJune <me@mrjunejune.com>
parents:
224
diff
changeset
|
345 await page.getByRole('link', { name: 'BUILD' }).click(); |
|
70de0c80d093
[hg-web] Add side-by-side changeset diffs
MrJuneJune <me@mrjunejune.com>
parents:
224
diff
changeset
|
346 const buildCode = page.locator('code.language-python'); |
|
70de0c80d093
[hg-web] Add side-by-side changeset diffs
MrJuneJune <me@mrjunejune.com>
parents:
224
diff
changeset
|
347 await buildCode.waitFor(); |
|
70de0c80d093
[hg-web] Add side-by-side changeset diffs
MrJuneJune <me@mrjunejune.com>
parents:
224
diff
changeset
|
348 await page.getByText('cc_library').waitFor(); |
|
70de0c80d093
[hg-web] Add side-by-side changeset diffs
MrJuneJune <me@mrjunejune.com>
parents:
224
diff
changeset
|
349 assert.match(await buildCode.textContent(), /name = "fixture"/); |
|
70de0c80d093
[hg-web] Add side-by-side changeset diffs
MrJuneJune <me@mrjunejune.com>
parents:
224
diff
changeset
|
350 await page.keyboard.press('Escape'); |
|
70de0c80d093
[hg-web] Add side-by-side changeset diffs
MrJuneJune <me@mrjunejune.com>
parents:
224
diff
changeset
|
351 |
|
223
0e7b9464248d
[hg-web] Add browser route regression coverage
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
352 await page.getByRole('link', { name: 'src' }).click(); |
|
0e7b9464248d
[hg-web] Add browser route regression coverage
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
353 await page.getByRole('link', { name: 'main.c' }).click(); |
|
0e7b9464248d
[hg-web] Add browser route regression coverage
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
354 await page.getByText('int main(void)').waitFor(); |
|
0e7b9464248d
[hg-web] Add browser route regression coverage
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
355 await page.keyboard.press('Escape'); |
|
0e7b9464248d
[hg-web] Add browser route regression coverage
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
356 }); |
|
0e7b9464248d
[hg-web] Add browser route regression coverage
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
357 |
|
0e7b9464248d
[hg-web] Add browser route regression coverage
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
358 await assertPageHasNoBrowserErrors(browser, '/directory?path=docs', async page => { |
|
0e7b9464248d
[hg-web] Add browser route regression coverage
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
359 await page.getByText('Documentation').waitFor(); |
|
0e7b9464248d
[hg-web] Add browser route regression coverage
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
360 await page.getByRole('link', { name: 'README.md' }).click(); |
|
0e7b9464248d
[hg-web] Add browser route regression coverage
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
361 await page.getByText('Nested README.').waitFor(); |
|
0e7b9464248d
[hg-web] Add browser route regression coverage
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
362 }); |
|
0e7b9464248d
[hg-web] Add browser route regression coverage
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
363 |
|
0e7b9464248d
[hg-web] Add browser route regression coverage
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
364 await assertPageHasNoBrowserErrors(browser, '/graph', async page => { |
|
0e7b9464248d
[hg-web] Add browser route regression coverage
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
365 await page.getByText('Commit Graph').waitFor(); |
|
0e7b9464248d
[hg-web] Add browser route regression coverage
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
366 await page.waitForFunction(() => new URL(window.location.href).searchParams.has('tip')); |
|
0e7b9464248d
[hg-web] Add browser route regression coverage
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
367 const graphUrl = page.url(); |
|
0e7b9464248d
[hg-web] Add browser route regression coverage
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
368 const rows = page.locator('.graph-row'); |
|
0e7b9464248d
[hg-web] Add browser route regression coverage
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
369 await rows.first().click(); |
|
0e7b9464248d
[hg-web] Add browser route regression coverage
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
370 await page.waitForURL(/\/changeset\/[0-9a-f]+$/); |
|
0e7b9464248d
[hg-web] Add browser route regression coverage
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
371 await page.getByRole('heading', { name: 'Update fixture' }).waitFor(); |
|
0e7b9464248d
[hg-web] Add browser route regression coverage
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
372 await page.getByRole('button', { name: 'Back', exact: true }).click(); |
|
0e7b9464248d
[hg-web] Add browser route regression coverage
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
373 await page.waitForFunction(expected => window.location.href === expected, graphUrl); |
|
0e7b9464248d
[hg-web] Add browser route regression coverage
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
374 await page.getByText('Commit Graph').waitFor(); |
|
0e7b9464248d
[hg-web] Add browser route regression coverage
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
375 }); |
|
0e7b9464248d
[hg-web] Add browser route regression coverage
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
376 |
|
0e7b9464248d
[hg-web] Add browser route regression coverage
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
377 await assertPageHasNoBrowserErrors(browser, `/changeset/${tipNode}`, async page => { |
|
0e7b9464248d
[hg-web] Add browser route regression coverage
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
378 await page.getByRole('heading', { name: 'Update fixture' }).waitFor(); |
|
0e7b9464248d
[hg-web] Add browser route regression coverage
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
379 await page.locator('.changeset-files code').filter({ hasText: 'new-file.txt' }).waitFor(); |
|
0e7b9464248d
[hg-web] Add browser route regression coverage
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
380 await page.getByText('added', { exact: true }).waitFor(); |
|
0e7b9464248d
[hg-web] Add browser route regression coverage
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
381 await page.getByRole('region', { name: 'Changeset diff' }).waitFor(); |
|
225
70de0c80d093
[hg-web] Add side-by-side changeset diffs
MrJuneJune <me@mrjunejune.com>
parents:
224
diff
changeset
|
382 await page.locator('.diff-column-headings').getByText('Before').first().waitFor(); |
|
70de0c80d093
[hg-web] Add side-by-side changeset diffs
MrJuneJune <me@mrjunejune.com>
parents:
224
diff
changeset
|
383 await page.locator('.diff-column-headings').getByText('After').first().waitFor(); |
|
70de0c80d093
[hg-web] Add side-by-side changeset diffs
MrJuneJune <me@mrjunejune.com>
parents:
224
diff
changeset
|
384 await page.locator('.diff-left.diff-remove').filter({ hasText: '# Fixture Repository' }).waitFor(); |
|
70de0c80d093
[hg-web] Add side-by-side changeset diffs
MrJuneJune <me@mrjunejune.com>
parents:
224
diff
changeset
|
385 await page.locator('.diff-right.diff-add').filter({ hasText: '# Updated Fixture Repository' }).waitFor(); |
|
70de0c80d093
[hg-web] Add side-by-side changeset diffs
MrJuneJune <me@mrjunejune.com>
parents:
224
diff
changeset
|
386 assert.equal( |
|
70de0c80d093
[hg-web] Add side-by-side changeset diffs
MrJuneJune <me@mrjunejune.com>
parents:
224
diff
changeset
|
387 await page.locator('.diff-left.diff-context').filter({ hasText: '<script>' }).first().textContent(), |
|
70de0c80d093
[hg-web] Add side-by-side changeset diffs
MrJuneJune <me@mrjunejune.com>
parents:
224
diff
changeset
|
388 '<script>window.__hgWebXss = true</script>', |
|
70de0c80d093
[hg-web] Add side-by-side changeset diffs
MrJuneJune <me@mrjunejune.com>
parents:
224
diff
changeset
|
389 ); |
|
224
3007ef5fc0ed
[hg-web] Simplify visuals and preview static files
MrJuneJune <me@mrjunejune.com>
parents:
223
diff
changeset
|
390 assert.equal( |
|
3007ef5fc0ed
[hg-web] Simplify visuals and preview static files
MrJuneJune <me@mrjunejune.com>
parents:
223
diff
changeset
|
391 await page.locator('.changeset-paper').evaluate( |
|
3007ef5fc0ed
[hg-web] Simplify visuals and preview static files
MrJuneJune <me@mrjunejune.com>
parents:
223
diff
changeset
|
392 element => getComputedStyle(element).backgroundImage, |
|
3007ef5fc0ed
[hg-web] Simplify visuals and preview static files
MrJuneJune <me@mrjunejune.com>
parents:
223
diff
changeset
|
393 ), |
|
3007ef5fc0ed
[hg-web] Simplify visuals and preview static files
MrJuneJune <me@mrjunejune.com>
parents:
223
diff
changeset
|
394 'none', |
|
3007ef5fc0ed
[hg-web] Simplify visuals and preview static files
MrJuneJune <me@mrjunejune.com>
parents:
223
diff
changeset
|
395 ); |
|
223
0e7b9464248d
[hg-web] Add browser route regression coverage
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
396 await page.getByRole('button', { name: firstNode.slice(0, 12) }).click(); |
|
0e7b9464248d
[hg-web] Add browser route regression coverage
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
397 await page.waitForFunction( |
|
0e7b9464248d
[hg-web] Add browser route regression coverage
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
398 expectedPath => window.location.pathname === expectedPath, |
|
0e7b9464248d
[hg-web] Add browser route regression coverage
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
399 `/changeset/${firstNode}`, |
|
0e7b9464248d
[hg-web] Add browser route regression coverage
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
400 ); |
|
0e7b9464248d
[hg-web] Add browser route regression coverage
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
401 await page.getByRole('heading', { name: 'Initial fixture' }).waitFor(); |
|
0e7b9464248d
[hg-web] Add browser route regression coverage
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
402 await page.getByRole('button', { name: 'Back', exact: true }).click(); |
|
0e7b9464248d
[hg-web] Add browser route regression coverage
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
403 await page.getByRole('heading', { name: 'Update fixture' }).waitFor(); |
|
0e7b9464248d
[hg-web] Add browser route regression coverage
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
404 await page.getByRole('button', { name: 'Back', exact: true }).click(); |
|
0e7b9464248d
[hg-web] Add browser route regression coverage
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
405 await page.getByText('Commit Graph').waitFor(); |
|
0e7b9464248d
[hg-web] Add browser route regression coverage
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
406 }); |
|
0e7b9464248d
[hg-web] Add browser route regression coverage
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
407 |
|
0e7b9464248d
[hg-web] Add browser route regression coverage
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
408 await assertPageHasNoBrowserErrors(browser, '/changeset/not-a-node', async page => { |
|
0e7b9464248d
[hg-web] Add browser route regression coverage
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
409 await page.getByText('Recent Commits').waitFor(); |
|
0e7b9464248d
[hg-web] Add browser route regression coverage
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
410 }); |
|
0e7b9464248d
[hg-web] Add browser route regression coverage
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
411 |
|
0e7b9464248d
[hg-web] Add browser route regression coverage
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
412 await stopProcess(hgServer); |
|
0e7b9464248d
[hg-web] Add browser route regression coverage
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
413 const unavailable = await fetch(`${BASE_URL}/api/repo/list`); |
|
0e7b9464248d
[hg-web] Add browser route regression coverage
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
414 assert.equal(unavailable.status, 502); |
|
0e7b9464248d
[hg-web] Add browser route regression coverage
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
415 assert.equal((await fetch(`${BASE_URL}/`)).status, 200); |
|
0e7b9464248d
[hg-web] Add browser route regression coverage
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
416 } finally { |
|
0e7b9464248d
[hg-web] Add browser route regression coverage
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
417 if (browser) await browser.close(); |
|
0e7b9464248d
[hg-web] Add browser route regression coverage
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
418 await stopProcess(appServer); |
|
0e7b9464248d
[hg-web] Add browser route regression coverage
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
419 await stopProcess(hgServer); |
|
0e7b9464248d
[hg-web] Add browser route regression coverage
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
420 fs.rmSync(fixtureRoot, { recursive: true, force: true }); |
|
0e7b9464248d
[hg-web] Add browser route regression coverage
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
421 } |
|
0e7b9464248d
[hg-web] Add browser route regression coverage
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
422 } |
|
0e7b9464248d
[hg-web] Add browser route regression coverage
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
423 |
|
0e7b9464248d
[hg-web] Add browser route regression coverage
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
424 main().catch(error => { |
|
0e7b9464248d
[hg-web] Add browser route regression coverage
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
425 console.error(error.stack || error); |
|
0e7b9464248d
[hg-web] Add browser route regression coverage
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
426 process.exitCode = 1; |
|
0e7b9464248d
[hg-web] Add browser route regression coverage
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
427 }); |