diff hg-web/e2e/app_e2e_test.js @ 225:70de0c80d093 hg-web

[hg-web] Add side-by-side changeset diffs
author MrJuneJune <me@mrjunejune.com>
date Sun, 02 Aug 2026 14:41:09 -0700
parents 3007ef5fc0ed
children c5129452493e
line wrap: on
line diff
--- a/hg-web/e2e/app_e2e_test.js	Sun Aug 02 13:51:11 2026 -0700
+++ b/hg-web/e2e/app_e2e_test.js	Sun Aug 02 14:41:09 2026 -0700
@@ -74,6 +74,10 @@
   fs.writeFileSync(path.join(root, 'docs', 'README.md'), '# Documentation\n\nNested README.\n');
   fs.writeFileSync(path.join(root, 'src', 'main.c'), 'int main(void) { return 0; }\n');
   fs.writeFileSync(
+    path.join(root, 'BUILD'),
+    'cc_library(\n    name = "fixture",\n    srcs = ["src/main.c"],\n)\n',
+  );
+  fs.writeFileSync(
     path.join(root, 'pixel.png'),
     Buffer.from(
       'iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mP8/x8AAusB9Wl2nWQAAAAASUVORK5CYII=',
@@ -88,7 +92,10 @@
   run('hg', ['--repository', root, 'commit', '-u', 'Test User <[email protected]>', '-m', 'Initial fixture'], options);
   const firstNode = run('hg', ['--repository', root, 'log', '-r', '.', '-T', '{node}'], options);
 
-  fs.appendFileSync(path.join(root, 'README.md'), '\nSecond revision.\n');
+  fs.writeFileSync(
+    path.join(root, 'README.md'),
+    '# Updated Fixture Repository\n\n<script>window.__hgWebXss = true</script>\n\nSecond revision.\n',
+  );
   fs.writeFileSync(path.join(root, 'new-file.txt'), 'new file\n');
   run('hg', ['add', 'new-file.txt'], { ...options, cwd: root });
   run('hg', ['--repository', root, 'commit', '-u', 'Test User <[email protected]>', '-m', 'Update fixture'], options);
@@ -282,7 +289,7 @@
     await assertPageHasNoBrowserErrors(browser, '/directory', async page => {
       await page.getByText('Repository Files').waitFor();
       await page.getByRole('link', { name: 'README.md' }).first().click();
-      await page.getByText('Fixture Repository').waitFor();
+      await page.getByText('Updated Fixture Repository').waitFor();
       assert.equal(await page.evaluate(() => window.__hgWebXss), undefined);
       await page.keyboard.press('Escape');
 
@@ -305,7 +312,7 @@
         }),
       ]);
       await page.getByRole('link', { name: 'root' }).click();
-      await page.getByText('Fixture Repository').waitFor();
+      await page.getByText('Updated Fixture Repository').waitFor();
       await page.waitForTimeout(600);
       assert.equal(await page.getByText('Documentation').count(), 0);
       assert.equal(delayedReadmeRequested, true);
@@ -325,6 +332,13 @@
       await page.getByRole('dialog', { name: 'Preview pixel.png' }).waitFor();
       await page.keyboard.press('Escape');
 
+      await page.getByRole('link', { name: 'BUILD' }).click();
+      const buildCode = page.locator('code.language-python');
+      await buildCode.waitFor();
+      await page.getByText('cc_library').waitFor();
+      assert.match(await buildCode.textContent(), /name = "fixture"/);
+      await page.keyboard.press('Escape');
+
       await page.getByRole('link', { name: 'src' }).click();
       await page.getByRole('link', { name: 'main.c' }).click();
       await page.getByText('int main(void)').waitFor();
@@ -355,6 +369,14 @@
       await page.locator('.changeset-files code').filter({ hasText: 'new-file.txt' }).waitFor();
       await page.getByText('added', { exact: true }).waitFor();
       await page.getByRole('region', { name: 'Changeset diff' }).waitFor();
+      await page.locator('.diff-column-headings').getByText('Before').first().waitFor();
+      await page.locator('.diff-column-headings').getByText('After').first().waitFor();
+      await page.locator('.diff-left.diff-remove').filter({ hasText: '# Fixture Repository' }).waitFor();
+      await page.locator('.diff-right.diff-add').filter({ hasText: '# Updated Fixture Repository' }).waitFor();
+      assert.equal(
+        await page.locator('.diff-left.diff-context').filter({ hasText: '<script>' }).first().textContent(),
+        '<script>window.__hgWebXss = true</script>',
+      );
       assert.equal(
         await page.locator('.changeset-paper').evaluate(
           element => getComputedStyle(element).backgroundImage,