···55// @watch end
6677import {expect} from '@playwright/test';
88-import {test} from './utils_e2e.ts';
88+import {save_visual, test} from './utils_e2e.ts';
991010test('Commit graph overflow', async ({page}) => {
1111 await page.goto('/user2/diff-test/graph');
···2828 await expect(page.locator('#loading-indicator')).toBeHidden();
2929 await expect(page.locator('#rel-container')).toBeVisible();
3030 await expect(page.locator('#rev-container')).toBeVisible();
3131+ await save_visual(page);
3132});
+2-1
tests/e2e/repo-migrate.test.e2e.ts
···2121 await form.locator('button.primary').click({timeout: 5000});
2222 await expect(page).toHaveURL('user2/invalidrepo');
2323 await save_visual(page);
2424- // page screenshot of unauthenticatedPage is checked automatically after the test
25242625 const ctx = await test_context(browser);
2726 const unauthenticatedPage = await ctx.newPage();
···3736 await save_visual(page);
3837 await deleteModal.getByRole('button', {name: 'Delete repository'}).click();
3938 await expect(page).toHaveURL('/');
3939+ // checked last to preserve the order of screenshots from first run
4040+ await save_visual(unauthenticatedPage);
4041});
+3-1
tests/e2e/repo-wiki.test.e2e.ts
···44// @watch end
5566import {expect} from '@playwright/test';
77-import {test} from './utils_e2e.ts';
77+import {save_visual, test} from './utils_e2e.ts';
8899for (const searchTerm of ['space', 'consectetur']) {
1010 for (const width of [null, 2560, 4000]) {
···2323 await page.getByPlaceholder('Search wiki').dispatchEvent('keyup');
2424 // timeout is necessary because HTMX search could be slow
2525 await expect(page.locator('#wiki-search a[href]')).toBeInViewport({ratio: 1});
2626+ await save_visual(page);
2627 });
2728 }
2829}
···3637 // so we manually "type" the last letter
3738 await page.getByPlaceholder('Search wiki').dispatchEvent('keyup');
3839 await expect(page.locator('#wiki-search a[href] b')).toHaveText('Page With Spaced Name');
4040+ await save_visual(page);
3941});
+4-1
tests/e2e/right-settings-button.test.e2e.ts
···55// @watch end
6677import {expect} from '@playwright/test';
88-import {test} from './utils_e2e.ts';
88+import {save_visual, test} from './utils_e2e.ts';
991010test.describe('desktop viewport as user 2', () => {
1111 test.use({user: 'user2', viewport: {width: 1920, height: 300}});
···5454 await expect(page.locator('.overflow-menu-items>#settings-btn')).toHaveCount(0);
55555656 await expect(page.locator('.overflow-menu-button')).toHaveCount(0);
5757+ await save_visual(page);
5758 });
5859});
5960···78797980 const items = shownItems.concat(overflowItems);
8081 expect(Array.from(new Set(items))).toHaveLength(items.length);
8282+ await save_visual(page);
8183 });
82848385 test('Settings button in overflow menu of org header', async ({page}) => {
···121123122124 const items = shownItems.concat(overflowItems);
123125 expect(Array.from(new Set(items))).toHaveLength(items.length);
126126+ await save_visual(page);
124127 });
125128});
+1-9
tests/e2e/utils_e2e.ts
···2626 },
2727 user: null,
2828 authScope: 'shared',
2929- // see https://playwright.dev/docs/test-fixtures#adding-global-beforeeachaftereach-hooks
3030- forEachTest: [async ({page}, use) => {
3131- await use();
3232- // some tests create a new page which is not yet available here
3333- // only operate on tests that make the URL available
3434- if (page.url() !== 'about:blank') {
3535- await save_visual(page);
3636- }
3737- }, {auto: true}],
3829});
39304031export async function test_context(browser: Browser, options?: BrowserContextOptions) {
···128119 // update order of recently created repos is not fully deterministic
129120 page.locator('.flex-item-main').filter({hasText: 'relative time in repo'}),
130121 page.locator('#activity-feed'),
122122+ page.locator('#user-heatmap'),
131123 // dynamic IDs in fixed-size inputs
132124 page.locator('input[value*="dyn-id-"]'),
133125 ],