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
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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 });