diff options
Diffstat (limited to 'tests/e2e/issue-sidebar.test.e2e.js')
-rw-r--r-- | tests/e2e/issue-sidebar.test.e2e.js | 226 |
1 files changed, 226 insertions, 0 deletions
diff --git a/tests/e2e/issue-sidebar.test.e2e.js b/tests/e2e/issue-sidebar.test.e2e.js new file mode 100644 index 0000000..61d3281 --- /dev/null +++ b/tests/e2e/issue-sidebar.test.e2e.js @@ -0,0 +1,226 @@ +// @ts-check +import {expect} from '@playwright/test'; +import {test, login_user, login} from './utils_e2e.js'; + +test.beforeAll(async ({browser}, workerInfo) => { + await login_user(browser, workerInfo, 'user2'); +}); + +// belongs to test: Pull: Toggle WIP +const prTitle = 'pull5'; + +async function click_toggle_wip({page}) { + await page.locator('.toggle-wip>a').click(); + await page.waitForLoadState('networkidle'); +} + +async function check_wip({page}, is) { + const elemTitle = '#issue-title-display'; + const stateLabel = '.issue-state-label'; + await expect(page.locator(elemTitle)).toContainText(prTitle); + await expect(page.locator(elemTitle)).toContainText('#5'); + if (is) { + await expect(page.locator(elemTitle)).toContainText('WIP'); + await expect(page.locator(stateLabel)).toContainText('Draft'); + } else { + await expect(page.locator(elemTitle)).not.toContainText('WIP'); + await expect(page.locator(stateLabel)).toContainText('Open'); + } +} + +test('Pull: Toggle WIP', async ({browser}, workerInfo) => { + test.skip(workerInfo.project.name === 'Mobile Safari', 'Unable to get tests working on Safari Mobile, see https://codeberg.org/forgejo/forgejo/pulls/3445#issuecomment-1789636'); + const page = await login({browser}, workerInfo); + const response = await page.goto('/user2/repo1/pulls/5'); + await expect(response?.status()).toBe(200); // Status OK + // initial state + await check_wip({page}, false); + // toggle to WIP + await click_toggle_wip({page}); + await check_wip({page}, true); + // remove WIP + await click_toggle_wip({page}); + await check_wip({page}, false); + + // manually edit title to another prefix + await page.locator('#issue-title-edit-show').click(); + await page.locator('#issue-title-editor input').fill(`[WIP] ${prTitle}`); + await page.getByText('Save').click(); + await page.waitForLoadState('networkidle'); + await check_wip({page}, true); + // remove again + await click_toggle_wip({page}); + await check_wip({page}, false); + // check maximum title length is handled gracefully + const maxLenStr = prTitle + 'a'.repeat(240); + await page.locator('#issue-title-edit-show').click(); + await page.locator('#issue-title-editor input').fill(maxLenStr); + await page.getByText('Save').click(); + await page.waitForLoadState('networkidle'); + await click_toggle_wip({page}); + await check_wip({page}, true); + await click_toggle_wip({page}); + await check_wip({page}, false); + await expect(page.locator('h1')).toContainText(maxLenStr); + // restore original title + await page.locator('#issue-title-edit-show').click(); + await page.locator('#issue-title-editor input').fill(prTitle); + await page.getByText('Save').click(); + await check_wip({page}, false); +}); + +test('Issue: Labels', async ({browser}, workerInfo) => { + test.skip(workerInfo.project.name === 'Mobile Safari', 'Unable to get tests working on Safari Mobile, see https://codeberg.org/forgejo/forgejo/pulls/3445#issuecomment-1789636'); + const page = await login({browser}, workerInfo); + // select label list in sidebar only + const labelList = page.locator('.issue-content-right .labels-list a'); + const response = await page.goto('/user2/repo1/issues/1'); + await expect(response?.status()).toBe(200); + // preconditions + await expect(labelList.filter({hasText: 'label1'})).toBeVisible(); + await expect(labelList.filter({hasText: 'label2'})).toBeHidden(); + // add label2 + await page.locator('.select-label').click(); + // label search could be tested this way: + // await page.locator('.select-label input').fill('label2'); + await page.locator('.select-label .item').filter({hasText: 'label2'}).click(); + await page.locator('.select-label').click(); + await page.waitForLoadState('networkidle'); + await expect(labelList.filter({hasText: 'label2'})).toBeVisible(); + // test removing label again + await page.locator('.select-label').click(); + await page.locator('.select-label .item').filter({hasText: 'label2'}).click(); + await page.locator('.select-label').click(); + await page.waitForLoadState('networkidle'); + await expect(labelList.filter({hasText: 'label2'})).toBeHidden(); + await expect(labelList.filter({hasText: 'label1'})).toBeVisible(); +}); + +test('Issue: Assignees', async ({browser}, workerInfo) => { + test.skip(workerInfo.project.name === 'Mobile Safari', 'Unable to get tests working on Safari Mobile, see https://codeberg.org/forgejo/forgejo/pulls/3445#issuecomment-1789636'); + const page = await login({browser}, workerInfo); + // select label list in sidebar only + const assigneesList = page.locator('.issue-content-right .assignees.list .selected .item a'); + + const response = await page.goto('/org3/repo3/issues/1'); + await expect(response?.status()).toBe(200); + // preconditions + await expect(assigneesList.filter({hasText: 'user2'})).toBeVisible(); + await expect(assigneesList.filter({hasText: 'user4'})).toBeHidden(); + await expect(page.locator('.ui.assignees.list .item.no-select')).toBeHidden(); + + // Clear all assignees + await page.locator('.select-assignees-modify.dropdown').click(); + await page.locator('.select-assignees-modify.dropdown .no-select.item').click(); + await expect(assigneesList.filter({hasText: 'user2'})).toBeHidden(); + await expect(assigneesList.filter({hasText: 'user4'})).toBeHidden(); + await expect(page.locator('.ui.assignees.list .item.no-select')).toBeVisible(); + await expect(page.locator('.select-assign-me')).toBeVisible(); + + // Assign other user (with searchbox) + await page.locator('.select-assignees-modify.dropdown').click(); + await page.type('.select-assignees-modify .menu .search input', 'user4'); + await expect(page.locator('.select-assignees-modify .menu .item').filter({hasText: 'user2'})).toBeHidden(); + await expect(page.locator('.select-assignees-modify .menu .item').filter({hasText: 'user4'})).toBeVisible(); + await page.locator('.select-assignees-modify .menu .item').filter({hasText: 'user4'}).click(); + await page.locator('.select-assignees-modify.dropdown').click(); + await expect(assigneesList.filter({hasText: 'user4'})).toBeVisible(); + + // remove user4 + await page.locator('.select-assignees-modify.dropdown').click(); + await page.locator('.select-assignees-modify .menu .item').filter({hasText: 'user4'}).click(); + await page.locator('.select-assignees-modify.dropdown').click(); + await expect(page.locator('.ui.assignees.list .item.no-select')).toBeVisible(); + await expect(assigneesList.filter({hasText: 'user4'})).toBeHidden(); + + // Test assign me + await page.locator('.ui.assignees .select-assign-me').click(); + await expect(assigneesList.filter({hasText: 'user2'})).toBeVisible(); + await expect(page.locator('.ui.assignees.list .item.no-select')).toBeHidden(); +}); + +test('New Issue: Assignees', async ({browser}, workerInfo) => { + test.skip(workerInfo.project.name === 'Mobile Safari', 'Unable to get tests working on Safari Mobile, see https://codeberg.org/forgejo/forgejo/pulls/3445#issuecomment-1789636'); + const page = await login({browser}, workerInfo); + // select label list in sidebar only + const assigneesList = page.locator('.issue-content-right .assignees.list .selected .item'); + + const response = await page.goto('/org3/repo3/issues/new'); + await expect(response?.status()).toBe(200); + // preconditions + await expect(page.locator('.ui.assignees.list .item.no-select')).toBeVisible(); + await expect(assigneesList.filter({hasText: 'user2'})).toBeHidden(); + await expect(assigneesList.filter({hasText: 'user4'})).toBeHidden(); + + // Assign other user (with searchbox) + await page.locator('.select-assignees.dropdown').click(); + await page.type('.select-assignees .menu .search input', 'user4'); + await expect(page.locator('.select-assignees .menu .item').filter({hasText: 'user2'})).toBeHidden(); + await expect(page.locator('.select-assignees .menu .item').filter({hasText: 'user4'})).toBeVisible(); + await page.locator('.select-assignees .menu .item').filter({hasText: 'user4'}).click(); + await page.locator('.select-assignees.dropdown').click(); + await expect(assigneesList.filter({hasText: 'user4'})).toBeVisible(); + + // remove user4 + await page.locator('.select-assignees.dropdown').click(); + await page.locator('.select-assignees .menu .item').filter({hasText: 'user4'}).click(); + await page.locator('.select-assignees.dropdown').click(); + await expect(page.locator('.ui.assignees.list .item.no-select')).toBeVisible(); + await expect(assigneesList.filter({hasText: 'user4'})).toBeHidden(); + + // Test assign me + await page.locator('.ui.assignees .select-assign-me').click(); + await expect(assigneesList.filter({hasText: 'user2'})).toBeVisible(); + await expect(page.locator('.ui.assignees.list .item.no-select')).toBeHidden(); + + await page.locator('.select-assignees.dropdown').click(); + await page.fill('.select-assignees .menu .search input', ''); + await page.locator('.select-assignees.dropdown .no-select.item').click(); + await expect(page.locator('.select-assign-me')).toBeVisible(); +}); + +test('Issue: Milestone', async ({browser}, workerInfo) => { + test.skip(workerInfo.project.name === 'Mobile Safari', 'Unable to get tests working on Safari Mobile, see https://codeberg.org/forgejo/forgejo/pulls/3445#issuecomment-1789636'); + const page = await login({browser}, workerInfo); + + const response = await page.goto('/user2/repo1/issues/1'); + await expect(response?.status()).toBe(200); + + const selectedMilestone = page.locator('.issue-content-right .select-milestone.list'); + const milestoneDropdown = page.locator('.issue-content-right .select-milestone.dropdown'); + await expect(selectedMilestone).toContainText('No milestone'); + + // Add milestone. + await milestoneDropdown.click(); + await page.getByRole('option', {name: 'milestone1'}).click(); + await expect(selectedMilestone).toContainText('milestone1'); + await expect(page.locator('.timeline-item.event').last()).toContainText('user2 added this to the milestone1 milestone'); + + // Clear milestone. + await milestoneDropdown.click(); + await page.getByText('Clear milestone', {exact: true}).click(); + await expect(selectedMilestone).toContainText('No milestone'); + await expect(page.locator('.timeline-item.event').last()).toContainText('user2 removed this from the milestone1 milestone'); +}); + +test('New Issue: Milestone', async ({browser}, workerInfo) => { + test.skip(workerInfo.project.name === 'Mobile Safari', 'Unable to get tests working on Safari Mobile, see https://codeberg.org/forgejo/forgejo/pulls/3445#issuecomment-1789636'); + const page = await login({browser}, workerInfo); + + const response = await page.goto('/user2/repo1/issues/new'); + await expect(response?.status()).toBe(200); + + const selectedMilestone = page.locator('.issue-content-right .select-milestone.list'); + const milestoneDropdown = page.locator('.issue-content-right .select-milestone.dropdown'); + await expect(selectedMilestone).toContainText('No milestone'); + + // Add milestone. + await milestoneDropdown.click(); + await page.getByRole('option', {name: 'milestone1'}).click(); + await expect(selectedMilestone).toContainText('milestone1'); + + // Clear milestone. + await milestoneDropdown.click(); + await page.getByText('Clear milestone', {exact: true}).click(); + await expect(selectedMilestone).toContainText('No milestone'); +}); |