mirror of
https://codeberg.org/forgejo/forgejo.git
synced 2025-12-07 14:09:47 +00:00
Webkit and Mobile safari are comically unreliable, will fail for unexplainable reasons and are very hard to run locally in comparison with the other supported platforms. I do not remember the last time where these two platforms were able to catch a regression where the other platforms did not. I would like to stress, for the historical record, that many hours has been devoted into adjusting the tests and following best practices to make these two platforms more stable but despite those, IMO wasted, efforts these two platforms are causing many hours of wasted CPU time simply because they are flaky and make (new) contributors nervous if their change contains a regression or not. To my knowledge, the tests are not broken for these two platforms. If you go to the issue tracker you will not find issues by users that use these two platforms and report that Forgejo is broken. It does not reflect reality. This is the sunk cost fallacy, bite the bullet and agree that these platforms will not contribute positively to Forgejo's excellent test suite. Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/10103 Reviewed-by: Michael Kriese <michael.kriese@gmx.de> Reviewed-by: Mathieu Fenniak <mfenniak@noreply.codeberg.org> Reviewed-by: 0ko <0ko@noreply.codeberg.org> Co-authored-by: Gusted <postmaster@gusted.xyz> Co-committed-by: Gusted <postmaster@gusted.xyz>
148 lines
7 KiB
TypeScript
148 lines
7 KiB
TypeScript
// @watch start
|
|
// templates/repo/create**.tmpl
|
|
// web_src/css/{form,repo}.css
|
|
// @watch end
|
|
|
|
import {expect} from '@playwright/test';
|
|
import {test, dynamic_id} from './utils_e2e.ts';
|
|
import {screenshot} from './shared/screenshots.ts';
|
|
import {validate_form} from './shared/forms.ts';
|
|
|
|
test.use({user: 'user2'});
|
|
|
|
test('New repo: invalid', async ({page}) => {
|
|
const response = await page.goto('/repo/create');
|
|
expect(response?.status()).toBe(200);
|
|
// check that relevant form content is hidden or available
|
|
await expect(page.getByRole('group', {name: 'Use a template You can select'}).getByRole('combobox')).toBeVisible();
|
|
await expect(page.getByText('.gitignore Select .gitignore')).toBeHidden();
|
|
await expect(page.getByText('Labels Select a label set')).toBeHidden();
|
|
await validate_form({page}, 'fieldset');
|
|
await screenshot(page);
|
|
|
|
await page.getByLabel('Repository name').fill('*invalid');
|
|
await page.getByRole('button', {name: 'Create repository'}).click();
|
|
await expect(page.getByText('Repository name should contain only alphanumeric')).toBeVisible();
|
|
await screenshot(page);
|
|
});
|
|
|
|
test('New repo: initialize', async ({page}, workerInfo) => {
|
|
const response = await page.goto('/repo/create');
|
|
expect(response?.status()).toBe(200);
|
|
// check that relevant form content is hidden or available
|
|
await expect(page.getByRole('group', {name: 'Use a template You can select'}).getByRole('combobox')).toBeVisible();
|
|
await expect(page.getByText('.gitignore Select .gitignore')).toBeHidden();
|
|
// fill initialization section
|
|
await page.getByText('Start the Git history with').click();
|
|
await page.getByText('Select .gitignore templates').click();
|
|
await page.getByLabel('.gitignore Select .gitignore').fill('Go');
|
|
await page.getByRole('option', {name: 'Go', exact: true}).click();
|
|
await page.keyboard.press('Escape');
|
|
await page.getByLabel('License Select a license file').click();
|
|
await page.getByRole('option', {name: 'MIT', exact: true}).click();
|
|
await page.keyboard.press('Escape');
|
|
// add advanced settings
|
|
await page.getByText('Click to expand').click();
|
|
await page.getByPlaceholder('master').fill('main');
|
|
await page.getByLabel('Make repository a template').check();
|
|
|
|
await validate_form({page}, 'fieldset');
|
|
await screenshot(page);
|
|
const reponame = dynamic_id();
|
|
await page.getByLabel('Repository name').fill(reponame);
|
|
await page.getByRole('button', {name: 'Create repository'}).click();
|
|
await expect(page.getByRole('link', {name: '.gitignore'})).toBeVisible();
|
|
await expect(page.getByRole('link', {name: 'LICENSE', exact: true})).toBeVisible();
|
|
if (!workerInfo.project.name.includes('Mobile')) {
|
|
await expect(page.getByText('Template', {exact: true})).toBeVisible();
|
|
}
|
|
await screenshot(page);
|
|
});
|
|
|
|
test('New repo: initialize later', async ({page}) => {
|
|
const response = await page.goto('/repo/create');
|
|
expect(response?.status()).toBe(200);
|
|
|
|
const reponame = dynamic_id();
|
|
await page.getByLabel('Repository name').fill(reponame);
|
|
await page.getByPlaceholder('Enter short description').fill(`Description for repo ${reponame}`);
|
|
await page.getByText('Click to expand').click();
|
|
await page.getByPlaceholder('master').fill('devbranch');
|
|
await validate_form({page}, 'fieldset');
|
|
await page.getByRole('button', {name: 'Create repository'}).click();
|
|
await page.waitForURL(new RegExp(`.*/user2/${reponame}$`));
|
|
await expect(page.getByRole('link', {name: 'New file'})).toBeVisible();
|
|
await expect(page.getByRole('heading', {name: 'Creating a new repository on'})).toBeVisible();
|
|
await screenshot(page);
|
|
|
|
// add a README
|
|
await page.getByRole('link', {name: 'New file'}).click();
|
|
// wait for loading spinner to disappear
|
|
// Otherwise, filling the filename might not populate the tree_path form field or preview tab
|
|
// The editor has race conditions, likely related to https://codeberg.org/forgejo/forgejo/issues/3371
|
|
await expect(page.locator('.is-loading')).toBeHidden();
|
|
await page.locator('.view-lines').click();
|
|
await page.keyboard.type('# Heading\n\nHello Forgejo!');
|
|
await page.getByPlaceholder('Name your fileā¦').fill('README.md');
|
|
await expect(page.getByText('Preview')).toBeVisible();
|
|
await page.getByPlaceholder('Add "<filename>"').fill('My first commit message');
|
|
await page.getByRole('button', {name: 'Commit changes'}).click();
|
|
expect(page.url()).toBe(`http://localhost:3003/user2/${reponame}/src/branch/devbranch/README.md`);
|
|
await expect(page.getByRole('link', {name: 'My first commit message'})).toBeVisible();
|
|
await expect(page.getByText('Hello Forgejo!')).toBeVisible();
|
|
await screenshot(page);
|
|
});
|
|
|
|
test('New repo: from template', async ({page}) => {
|
|
const response = await page.goto('/repo/create');
|
|
expect(response?.status()).toBe(200);
|
|
|
|
const reponame = dynamic_id();
|
|
await page.getByRole('group', {name: 'Use a template You can select'}).getByRole('combobox').click();
|
|
await page.getByRole('option', {name: 'user27/template1'}).click();
|
|
await page.getByText('Git content (Default branch)').click();
|
|
await screenshot(page);
|
|
await page.getByLabel('Repository name').fill(reponame);
|
|
await page.getByRole('button', {name: 'Create repository'}).click();
|
|
await expect(page.getByRole('link', {name: `${reponame}.log`})).toBeVisible();
|
|
await screenshot(page);
|
|
});
|
|
|
|
test('New repo: label set', async ({page}) => {
|
|
await page.goto('/repo/create');
|
|
|
|
const reponame = dynamic_id();
|
|
await page.getByText('Click to expand').click();
|
|
await page.getByLabel('Labels Select a label set').click();
|
|
await page.getByRole('option', {name: 'Advanced (Kind/Bug, Kind/'}).click();
|
|
// close dropdown via unrelated click
|
|
await page.getByText('You can select an existing').click();
|
|
await screenshot(page);
|
|
await page.getByLabel('Repository name').fill(reponame);
|
|
await page.getByRole('button', {name: 'Create repository'}).click();
|
|
await page.goto(`/user2/${reponame}/issues`);
|
|
await page.getByRole('link', {name: 'Labels'}).click();
|
|
await expect(page.getByText('Kind/Bug Something is not')).toBeVisible();
|
|
await screenshot(page);
|
|
});
|
|
|
|
test('New repo: gitignore', async ({page}) => {
|
|
await page.goto('/repo/create');
|
|
|
|
await page.getByText('Start the Git history with').click();
|
|
const gitignoreDropdown = page.locator('.hide-unless-checked label:first-of-type > div');
|
|
await gitignoreDropdown.click();
|
|
await page.getByRole('option', {name: 'ArchLinuxPackages'}).click();
|
|
await page.getByRole('option', {name: 'Android'}).click();
|
|
await page.getByRole('option', {name: 'ChefCookbook'}).click();
|
|
await page.getByRole('option', {name: 'GNOMEShellExtension'}).click();
|
|
await page.getByRole('option', {name: 'JupyterNotebooks'}).click();
|
|
await page.getByRole('option', {name: 'NotesAndExtendedConfiguration'}).click();
|
|
await page.getByRole('option', {name: 'MetaProgrammingSystem'}).click();
|
|
await page.getByRole('option', {name: 'AppceleratorTitanium'}).click();
|
|
await screenshot(page);
|
|
|
|
const segmentWidth = (await page.locator('.segment').boundingBox()).width;
|
|
const dropdownWidth = (await gitignoreDropdown.boundingBox()).width;
|
|
expect(dropdownWidth).toBeLessThan(segmentWidth);
|
|
});
|