···11+// @ts-check
22+import {expect} from '@playwright/test';
33+import {test, login_user, login} from './utils_e2e.js';
44+import {validate_form} from './shared/forms.js';
55+66+test.beforeAll(async ({browser}, workerInfo) => {
77+ await login_user(browser, workerInfo, 'user2');
88+});
99+1010+test('org team settings', async ({browser}, workerInfo) => {
1111+ test.skip(workerInfo.project.name === 'Mobile Safari', 'Cannot get it to work - as usual');
1212+ const page = await login({browser}, workerInfo);
1313+ const response = await page.goto('/org/org3/teams/team1/edit');
1414+ await expect(response?.status()).toBe(200);
1515+1616+ await page.locator('input[name="permission"][value="admin"]').click();
1717+ await expect(page.locator('.team-units')).toBeHidden();
1818+1919+ // we are validating the form here, because the now hidden part has accessibility issues anyway
2020+ // this should be moved up or down once they are fixed.
2121+ await validate_form({page});
2222+2323+ await page.locator('input[name="permission"][value="read"]').click();
2424+ await expect(page.locator('.team-units')).toBeVisible();
2525+});
+37
tests/e2e/repo-settings.test.e2e.js
···11+// @ts-check
22+import {expect} from '@playwright/test';
33+import {test, login_user, login} from './utils_e2e.js';
44+import {validate_form} from './shared/forms.js';
55+66+test.beforeAll(async ({browser}, workerInfo) => {
77+ await login_user(browser, workerInfo, 'user2');
88+});
99+1010+test('repo webhook settings', async ({browser}, workerInfo) => {
1111+ test.skip(workerInfo.project.name === 'Mobile Safari', 'Cannot get it to work - as usual');
1212+ const page = await login({browser}, workerInfo);
1313+ const response = await page.goto('/user2/repo1/settings/hooks/forgejo/new');
1414+ await expect(response?.status()).toBe(200);
1515+1616+ await page.locator('input[name="events"][value="choose_events"]').click();
1717+ await expect(page.locator('.events.fields')).toBeVisible();
1818+1919+ await page.locator('input[name="events"][value="push_only"]').click();
2020+ await expect(page.locator('.events.fields')).toBeHidden();
2121+ await page.locator('input[name="events"][value="send_everything"]').click();
2222+ await expect(page.locator('.events.fields')).toBeHidden();
2323+2424+ // restrict to improved semantic HTML, the rest of the page fails the accessibility check
2525+ // only execute when the ugly part is hidden - would benefit from refactoring, too
2626+ await validate_form({page}, 'fieldset');
2727+});
2828+2929+test('repo branch protection settings', async ({browser}, workerInfo) => {
3030+ test.skip(workerInfo.project.name === 'Mobile Safari', 'Cannot get it to work - as usual');
3131+ const page = await login({browser}, workerInfo);
3232+ const response = await page.goto('/user2/repo1/settings/branches/edit');
3333+ await expect(response?.status()).toBe(200);
3434+3535+ // not yet accessible :(
3636+ // await validate_form({page}, 'fieldset');
3737+});
+16
tests/e2e/shared/forms.js
···11+import {expect} from '@playwright/test';
22+import AxeBuilder from '@axe-core/playwright';
33+44+export async function validate_form({page}, scope) {
55+ scope ??= 'form';
66+ const accessibilityScanResults = await new AxeBuilder({page}).include(scope).analyze();
77+ expect(accessibilityScanResults.violations).toEqual([]);
88+99+ // assert CSS properties that needed to be overriden for forms (ensure they remain active)
1010+ const boxes = page.getByRole('checkbox').or(page.getByRole('radio'));
1111+ for (const b of await boxes.all()) {
1212+ await expect(b).toHaveCSS('margin-left', '0px');
1313+ await expect(b).toHaveCSS('margin-top', '0px');
1414+ await expect(b).toHaveCSS('vertical-align', 'baseline');
1515+ }
1616+}
+5
tests/e2e/utils_e2e.js
···5858 return context;
5959}
60606161+export async function login({browser}, workerInfo) {
6262+ const context = await load_logged_in_context(browser, workerInfo, 'user2');
6363+ return await context.newPage();
6464+}
6565+6166export async function save_visual(page) {
6267 // Optionally include visual testing
6368 if (process.env.VISUAL_TEST) {