From aca8b9e2e5d7bf30039cbf97bbcc997650fe0fc7 Mon Sep 17 00:00:00 2001 From: JasminMus <167111741+JasminMus@users.noreply.github.com> Date: Fri, 3 May 2024 11:40:29 +0200 Subject: [PATCH] Refactor tracker tests (#5494) Signed-off-by: Jasmin --- tests/sanity/tests/indexer.spec.ts | 4 +- .../model/tracker/common-tracker-page.ts | 70 ++++ .../sanity/tests/model/tracker/issues-page.ts | 303 +++++++++++++++++- .../sanity/tests/tracker/attachments.spec.ts | 27 +- tests/sanity/tests/tracker/common-steps.ts | 4 +- tests/sanity/tests/tracker/component.spec.ts | 58 ++-- tests/sanity/tests/tracker/filter.spec.ts | 84 ++--- .../tests/tracker/issues-duplicate.spec.ts | 24 +- tests/sanity/tests/tracker/issues.spec.ts | 71 ++-- tests/sanity/tests/tracker/layout.spec.ts | 6 +- tests/sanity/tests/tracker/loading.spec.ts | 12 +- tests/sanity/tests/tracker/mentions.spec.ts | 30 +- tests/sanity/tests/tracker/milestone.spec.ts | 42 +-- tests/sanity/tests/tracker/projects.spec.ts | 27 +- .../tests/tracker/related-issues.spec.ts | 26 +- tests/sanity/tests/tracker/relations.spec.ts | 40 +-- tests/sanity/tests/tracker/subissues.spec.ts | 55 ++-- tests/sanity/tests/tracker/template.spec.ts | 40 +-- tests/sanity/tests/tracker/tracker.spec.ts | 264 ++++----------- tests/sanity/tests/tracker/tracker.utils.ts | 29 +- tests/sanity/tests/workspace/create.spec.ts | 2 +- 21 files changed, 656 insertions(+), 562 deletions(-) diff --git a/tests/sanity/tests/indexer.spec.ts b/tests/sanity/tests/indexer.spec.ts index 65ad6abf41..00247566fb 100644 --- a/tests/sanity/tests/indexer.spec.ts +++ b/tests/sanity/tests/indexer.spec.ts @@ -286,7 +286,7 @@ test.describe('Fulltext index', () => { await test.step('update issue', async () => { await issuesPage.linkSidebarAll().click() - await issuesPage.modelSelectorAll().click() + await issuesPage.clickModelSelectorAll() await issuesPage.searchIssueByName(newIssue.title) await issuesPage.openIssueByName(newIssue.title) await issuesDetailsPage.editIssue({ title: updatedTitle }) @@ -351,7 +351,7 @@ test.describe('Fulltext index', () => { await test.step('remove issue', async () => { await issuesPage.linkSidebarAll().click() - await issuesPage.modelSelectorAll().click() + await issuesPage.clickModelSelectorAll() await issuesPage.searchIssueByName(newIssue.title) await issuesPage.openIssueByName(newIssue.title) await issuesDetailsPage.moreActionOnIssue('Delete') diff --git a/tests/sanity/tests/model/tracker/common-tracker-page.ts b/tests/sanity/tests/model/tracker/common-tracker-page.ts index a8063e89db..20903dcef0 100644 --- a/tests/sanity/tests/model/tracker/common-tracker-page.ts +++ b/tests/sanity/tests/model/tracker/common-tracker-page.ts @@ -79,6 +79,76 @@ export class CommonTrackerPage extends CalendarPage { submitButton = (): Locator => this.page.locator('div.date-popup-container button[type="submit"]') + trackerApplicationButton = (): Locator => this.page.locator('[id="app-tracker\\:string\\:TrackerApplication"]') + componentsLink = (): Locator => this.page.locator('text=Components') + createComponentButton = (): Locator => this.page.locator('button:has-text("Component")') + componentNameInput = (): Locator => this.page.locator('[placeholder="Component\\ name"]') + createComponentConfirmButton = (): Locator => this.page.locator('button:has-text("Create component")') + newIssueButton = (): Locator => this.page.locator('button:has-text("New issue")') + issueTitleInput = (): Locator => this.page.locator('[placeholder="Issue\\ title"]') + componentIssueButton = (): Locator => this.page.locator('form button:has-text("Component")') + createIssueButton = (): Locator => this.page.locator('form button:has-text("Create issue")') + componentName = (componentName: string): Locator => this.page.locator(`text=${componentName}`) + panelSelector = (panel: string): Locator => this.page.locator(`text="${panel}"`) + viewButton = (): Locator => this.page.locator('button:has-text("View")') + firstOptionButton = (): Locator => this.page.locator('.antiCard >> button >> nth=0') + assigneeMenuItem = (): Locator => this.page.locator('.menu-item:has-text("Assignee")') + + // Actions + async selectPanelAndViewlet (panel: string, viewletSelector: string): Promise { + await this.page.click(`text="${panel}"`) + await this.page.click(viewletSelector) + } + + async openViewOptionsAndSelectAssignee (): Promise { + await this.viewButton().click() + await this.firstOptionButton().click() + await this.assigneeMenuItem().click() + await this.page.keyboard.press('Escape') + } + + async verifyViewOption (panel: string, viewletSelector: string): Promise { + await this.page.click(`text="${panel}"`) + const viewlet = this.page.locator(viewletSelector) + await expect(viewlet).toHaveClass(/selected/) + await this.viewButton().click() + await expect(this.firstOptionButton()).toContainText('Assignee') + await this.page.keyboard.press('Escape') + } + + async navigateToComponents (PlatformURI: string): Promise { + await this.trackerApplicationButton().click() + await this.componentsLink().first().click() + await expect(this.page).toHaveURL( + `${PlatformURI}/workbench/sanity-ws/tracker/tracker%3Aproject%3ADefaultProject/components` + ) + } + + async clickOnApplicationButton (): Promise { + await this.trackerApplicationButton().click() + } + + async createComponent (componentName: string): Promise { + await this.createComponentButton().click() + await this.componentNameInput().click() + await this.componentNameInput().fill(componentName) + await this.createComponentConfirmButton().click() + await this.page.click(`text=${componentName}`) + } + + async clickOnComponent (componentName: string): Promise { + await this.componentName(componentName).click() + } + + async createIssueForComponent (componentName: string): Promise { + await this.newIssueButton().click() + await this.issueTitleInput().fill('issue') + await this.componentIssueButton().click() + await this.page.click(`.selectPopup button:has-text("${componentName}")`) + await this.createIssueButton().click() + await this.page.waitForSelector('form.antiCard', { state: 'detached' }) + } + async selectFilter (filter: string, filterSecondLevel?: string): Promise { await this.buttonFilter().click() await this.selectPopupMenu(filter).click() diff --git a/tests/sanity/tests/model/tracker/issues-page.ts b/tests/sanity/tests/model/tracker/issues-page.ts index 2e3400e153..8a56ce4786 100644 --- a/tests/sanity/tests/model/tracker/issues-page.ts +++ b/tests/sanity/tests/model/tracker/issues-page.ts @@ -3,9 +3,13 @@ import path from 'path' import { attachScreenshot, iterateLocator } from '../../utils' import { CommonTrackerPage } from './common-tracker-page' import { NewIssue } from './types' +import { createIssue, toTime } from '../../tracker/tracker.utils' export class IssuesPage extends CommonTrackerPage { modelSelectorAll = (): Locator => this.page.locator('div[data-id="tab-all"]') + issues = (): Locator => this.page.locator('text="Issues"') + subIssues = (): Locator => this.page.locator('button:has-text("Add sub-issue")') + newIssue = (): Locator => this.page.locator('#new-issue') modelSelectorActive = (): Locator => this.page.locator('div[data-id="tab-active"]') modelSelectorBacklog = (): Locator => this.page.locator('div[data-id="tab-backlog"]') buttonCreateNewIssue = (): Locator => this.page.locator('button > div', { hasText: 'New issue' }) @@ -92,6 +96,287 @@ export class IssuesPage extends CommonTrackerPage { commentCountLocator = (issueName: string): Locator => this.commonAncestorForOperations(issueName).locator('button > div[slot="content"]').first() + inProgressHeader = (): Locator => this.page.locator('.categoryHeader :text-is("In Progress")').first() + backlogHeader = (): Locator => this.page.locator('.categoryHeader :text-is("Backlog")').first() + todoHeader = (): Locator => this.page.locator('.categoryHeader :text-is("Todo")').first() + doneHeader = (): Locator => this.page.locator('.categoryHeader :text-is("Done")').first() + canceledHeader = (): Locator => this.page.locator('.categoryHeader :text-is("Canceled")').first() + myIssuesButton = (): Locator => this.page.locator('text="My issues"') + assignedTab = (): Locator => this.page.locator('[data-id="tab-assigned"]') + createdTab = (): Locator => this.page.locator('[data-id="tab-created"]') + subscribedTab = (): Locator => this.page.locator('[data-id="tab-subscribed"]') + issueListPanel = (): Locator => this.page.locator('.antiPanel-component') + notTrackButton = (): Locator => this.page.locator('button:has-text("Appleseed John") >> nth=1') + selectPopup = (): Locator => this.page.locator('.selectPopup >> button:has-text("Appleseed John")') + notificationTimeoutSetting = (timeout: string): Promise => { + return this.page.evaluate((timeout) => { + localStorage.setItem('#platform.notification.timeout', timeout) + }, timeout) + } + + viewIssueButton = (): Locator => this.page.locator('text="View issue"') + reportedTimeEditor = (): Locator => this.page.locator('#ReportedTimeEditor') + addReportButton = (): Locator => this.page.locator('#ReportsPopupAddButton') + closeButton = (): Locator => this.page.locator('#card-close') + + totalFooter = (): Locator => this.page.locator('.antiCard-content >> .footer') + reportsPopupButton = (): Locator => this.page.locator('#ReportsPopupAddButton') + createButton = (): Locator => this.page.locator('button:has-text("Create")') + spentTimeInput = (): Locator => this.page.locator('[placeholder="Spent time"]') + + timeSpentReports = (): Locator => this.page.locator('text="Time spent reports"') + addTimeReport = (): Locator => this.page.locator('text="Add time report"') + issueName = (name: string): Locator => this.page.locator(`text="${name}"`) + issuesButton = (): Locator => this.page.locator('text="Issues"') + viewButton = (): Locator => this.page.locator('button:has-text("View")') + orderingButton = (): Locator => this.page.locator('.ordering >> nth=0') + modifiedDateMenuItem = (): Locator => this.page.locator('button.menu-item', { hasText: 'Modified date' }) + estimationContainer = (): Locator => this.page.locator('.estimation-container').first() + addTimeReportButton = (): Locator => this.page.locator('button:has-text("Add time report")') + timeReportCreationArea = (): Locator => + this.page.locator('[id="tracker\\:string\\:TimeSpendReportAdd"] >> text=Add time report') + + estimationSpan = (): Locator => this.page.locator('.estimation-container >> span').first() + okButton = (): Locator => this.page.getByRole('button', { name: 'Ok' }) + newIssueButton = (): Locator => this.page.locator('#new-issue') + issueNameInput = (): Locator => this.page.locator('#issue-name >> input') + issueDescriptionInput = (): Locator => this.page.locator('#issue-description >> [contenteditable]') + statusEditor = (): Locator => this.page.locator('#status-editor') + todoButton = (): Locator => this.page.locator('button:has-text("Todo")') + priorityEditor = (): Locator => this.page.locator('#priority-editor') + urgentButton = (): Locator => this.page.locator('button:has-text("Urgent")') + assigneeEditor = (): Locator => this.page.locator('#assignee-editor') + appleseedJohnButton = (): Locator => this.page.locator('button:has-text("Appleseed John")') + estimationEditor = (): Locator => this.page.locator('#estimation-editor') + dueDateButton = (): Locator => this.page.locator('button:has-text("Due date")') + specificDay = (day: string): Locator => this.page.locator(`.date-popup-container div.day >> text=${day}`).first() + inputTextPlaceholder = (): Locator => this.page.getByPlaceholder('Type text...') + confirmInput = (): Locator => this.page.locator('.ml-2 > .antiButton') + + async navigateToIssues (): Promise { + await this.page.click('text="Issues"') + await this.page.keyboard.press('Escape') + } + + async createAndOpenIssue (name: string, assignee: string, status: string): Promise { + try { + await this.notificationTimeoutSetting('5000') + await createIssue(this.page, { name, assignee, status }) + await this.page.waitForSelector(`text="${name}"`) + await this.viewIssueButton().click() + } finally { + await this.notificationTimeoutSetting('0') + } + } + + async reportTime (time: number): Promise { + await this.reportedTimeEditor().click() + await this.page.waitForSelector('text="Time spent reports"') + await this.addReportButton().click() + await this.page.waitForSelector('text="Add time report"') + await expect(this.createButton()).toBeDisabled() + await this.spentTimeInput().fill(`${time}`) + await expect(this.createButton()).toBeEnabled() + await this.createButton().click() + await this.okButton().click() + } + + async verifyReportedTime (time: number): Promise { + // Assuming toTime is defined elsewhere + await expect(this.page.locator('#ReportedTimeEditor')).toContainText(await toTime(time)) + } + + // ACTIONS + + async clickOnReportedTimeEditor (): Promise { + await this.reportedTimeEditor().click() + } + + async clickButtonCreateNewIssue (): Promise { + await this.buttonCreateNewIssue().click() + } + + async clickButtonCreateIssue (): Promise { + await this.buttonCreateIssue().click() + } + + async clickOnIssues (): Promise { + await this.issues().click() + } + + async clickOnSubIssues (): Promise { + await this.subIssues().click() + } + + async clickOnNewIssue (): Promise { + await this.newIssue().click() + } + + async navigateToMyIssues (): Promise { + await this.myIssuesButton().click() + } + + async clickReportedTimeEditor (): Promise { + await this.reportedTimeEditor().click() + } + + async waitForTimeSpentReports (): Promise { + await this.timeSpentReports().waitFor() + } + + async clickAddReportButton (): Promise { + await this.addReportButton().click() + } + + async waitForAddTimeReport (): Promise { + await this.addTimeReport().waitFor() + } + + async fillSpentTime (time: number): Promise { + await this.spentTimeInput().fill(`${time}`) + } + + async checkCreateButtonEnabled (): Promise { + await expect(this.createButton()).toBeEnabled() + } + + async clickCreateButton (): Promise { + await this.createButton().click() + } + + async clickCloseButton (): Promise { + await this.closeButton().click() + } + + async clickIssuesIndex (index: number): Promise { + await this.issuesButton().nth(index).click() + } + + async clickIssues (): Promise { + await this.issuesButton().click() + } + + async clickView (): Promise { + await this.viewButton().click() + } + + async clickOrdering (): Promise { + await this.orderingButton().click() + } + + async selectModifiedDate (): Promise { + await this.modifiedDateMenuItem().click() + } + + async pressEscape (): Promise { + await this.page.keyboard.press('Escape') + } + + async clickEstimationContainer (): Promise { + await this.estimationContainer().click() + } + + async waitForEstimation (): Promise { + await this.page.waitForSelector('text="Estimation"') + } + + async clickAddTimeReport (): Promise { + await this.addTimeReportButton().click() + } + + async waitForTimeReportAdd (): Promise { + await this.timeReportCreationArea().waitFor() + } + + async expectCreateEnabled (): Promise { + await expect(this.createButton()).toBeEnabled() + } + + async clickCreate (): Promise { + await this.createButton().click() + } + + async clickOkButton (): Promise { + await this.okButton().click() + } + + async checkEstimation (count: number): Promise { + // Assuming toTime is defined elsewhere + await expect(this.estimationSpan()).toContainText(await toTime(count)) + } + + async clickNewIssue (): Promise { + await this.newIssueButton().click() + } + + async clickAndFillIssueName (issueName: string): Promise { + await this.issueNameInput().click() + await this.issueNameInput().fill(issueName) + } + + async clickAndFillIssueDescription (issueDescription: string): Promise { + await this.issueDescriptionInput().click() + await this.issueDescriptionInput().fill(issueDescription) + } + + async selectStatus (): Promise { + await this.statusEditor().click() + await this.todoButton().click() + } + + async selectPriority (): Promise { + await this.priorityEditor().click() + await this.urgentButton().click() + } + + async clickAssignee (): Promise { + await this.assigneeEditor().click() + await this.appleseedJohnButton().click() + } + + async inputTextPlaceholderFill (text: string): Promise { + await this.inputTextPlaceholder().fill(text) + await this.confirmInput().click() + } + + async setEstimation (): Promise { + await this.estimationEditor().click() + } + + async setDueDate (day: string): Promise { + await this.dueDateButton().click() + await this.specificDay(day).click() + } + + async pressEscapeTwice (): Promise { + await this.page.keyboard.press('Escape') + await this.page.keyboard.press('Escape') + } + + async checkIssuePresenceInTabs (issueName: string, presence: boolean): Promise { + const tabs = [this.assignedTab(), this.createdTab(), this.subscribedTab()] + const checks = [false, true, true] + + for (let i = 0; i < tabs.length; i++) { + await tabs[i].click() + await this.page.waitForTimeout(3000) + if (presence === checks[i]) { + await expect(this.issueListPanel()).toContainText(issueName) + } else { + await expect(this.issueListPanel()).not.toContainText(issueName) + } + } + } + + async stopTrackingIssue (issueName: string): Promise { + await this.notTrackButton().click() + await this.selectPopup().click() + await this.page.waitForTimeout(100) + await this.page.keyboard.press('Escape') + await this.page.keyboard.press('Escape') + await expect(this.issueList()).not.toContainText(issueName) + } + // ACTIONS async clickLinkSidebarAll (): Promise { @@ -117,7 +402,7 @@ export class IssuesPage extends CommonTrackerPage { async createNewIssue (data: NewIssue, closeNotification: boolean = false): Promise { await this.buttonCreateNewIssue().click() await this.fillNewIssueForm(data) - await this.buttonCreateIssue().click() + await this.clickButtonCreateIssue() if (closeNotification) { await this.closeNotification(this.page) } @@ -308,9 +593,25 @@ export class IssuesPage extends CommonTrackerPage { await this.commentButton(issueName).click() } + async verifyCategoryHeadersVisibility (): Promise { + await expect(this.inProgressHeader()).toBeVisible() + await expect(this.backlogHeader()).toBeVisible() + await expect(this.todoHeader()).toBeVisible() + await expect(this.doneHeader()).toBeVisible() + await expect(this.canceledHeader()).toBeVisible() + } + async openAllCategories (): Promise { for await (const category of iterateLocator(this.buttonCollapsedCategories())) { await category.click() } } + + async checkTotalFooter (expectedTotal: number): Promise { + await expect(this.totalFooter()).toContainText(`Total: ${expectedTotal}`) + } + + async checkCreateButtonDisabled (): Promise { + await expect(this.createButton()).toBeDisabled() + } } diff --git a/tests/sanity/tests/tracker/attachments.spec.ts b/tests/sanity/tests/tracker/attachments.spec.ts index 17f1568fc2..3da75a2549 100644 --- a/tests/sanity/tests/tracker/attachments.spec.ts +++ b/tests/sanity/tests/tracker/attachments.spec.ts @@ -11,31 +11,33 @@ test.use({ }) test.describe('Attachments tests', () => { + let leftSideMenuPage: LeftSideMenuPage + let trackerNavigationMenuPage: TrackerNavigationMenuPage + let issuesPage: IssuesPage + let issuesDetailsPage: IssuesDetailsPage + test.beforeEach(async ({ page }) => { + leftSideMenuPage = new LeftSideMenuPage(page) + trackerNavigationMenuPage = new TrackerNavigationMenuPage(page) + issuesPage = new IssuesPage(page) + issuesDetailsPage = new IssuesDetailsPage(page) await (await page.goto(`${PlatformURI}/workbench/sanity-ws`))?.finished() }) - test('Create issue with several attachment test', async ({ page }) => { + test('Create issue with several attachment test', async () => { const newIssue: NewIssue = { title: `Create issue with several attachment tests-${generateId()}`, description: 'Create issue with several attachment tests description' } - const leftSideMenuPage = new LeftSideMenuPage(page) await leftSideMenuPage.clickTracker() - - const trackerNavigationMenuPage = new TrackerNavigationMenuPage(page) await trackerNavigationMenuPage.openIssuesForProject('Default') - - const issuesPage = new IssuesPage(page) - await issuesPage.modelSelectorAll().click() - - await issuesPage.buttonCreateNewIssue().click() + await issuesPage.clickModelSelectorAll() + await issuesPage.clickButtonCreateNewIssue() await issuesPage.fillNewIssueForm(newIssue) await issuesPage.attachFileToNewIssueForm('cat.jpeg') await issuesPage.attachFileToNewIssueForm('cat2.jpeg') - await issuesPage.buttonCreateIssue().click() - + await issuesPage.clickButtonCreateIssue() await issuesPage.searchIssueByName(newIssue.title) await issuesPage.checkAttachmentsCount(newIssue.title, '2') @@ -57,10 +59,7 @@ test.describe('Attachments tests', () => { await issuesPage.checkAttachmentsCount(newIssue.title, '2') }) - await issuesPage.openIssueByName(newIssue.title) - - const issuesDetailsPage = new IssuesDetailsPage(page) await issuesDetailsPage.checkIssueContainsAttachment('cat.jpeg') await issuesDetailsPage.checkIssueContainsAttachment('cat3.jpeg') await issuesDetailsPage.checkActivityExist('uploaded an attachment') diff --git a/tests/sanity/tests/tracker/common-steps.ts b/tests/sanity/tests/tracker/common-steps.ts index c3ff94b4ce..7c8ef1ebff 100644 --- a/tests/sanity/tests/tracker/common-steps.ts +++ b/tests/sanity/tests/tracker/common-steps.ts @@ -5,7 +5,7 @@ import { NewIssue } from '../model/tracker/types' export async function prepareNewIssueStep (page: Page, issue: NewIssue): Promise { return await test.step('Prepare document', async () => { const issuesPage = new IssuesPage(page) - await issuesPage.modelSelectorAll().click() + await issuesPage.clickModelSelectorAll() await issuesPage.createNewIssue(issue) await issuesPage.searchIssueByName(issue.title) @@ -17,7 +17,7 @@ export async function prepareNewIssueWithOpenStep (page: Page, issue: NewIssue): return await test.step('Prepare document', async () => { const issuesPage = new IssuesPage(page) await issuesPage.linkSidebarAll().click() - await issuesPage.modelSelectorAll().click() + await issuesPage.clickModelSelectorAll() await issuesPage.createNewIssue(issue) await issuesPage.searchIssueByName(issue.title) await issuesPage.openIssueByName(issue.title) diff --git a/tests/sanity/tests/tracker/component.spec.ts b/tests/sanity/tests/tracker/component.spec.ts index e80d074eba..1e4f9c6e89 100644 --- a/tests/sanity/tests/tracker/component.spec.ts +++ b/tests/sanity/tests/tracker/component.spec.ts @@ -1,42 +1,39 @@ -import { expect, test } from '@playwright/test' +import { test } from '@playwright/test' import { generateId, PlatformSetting, PlatformURI, fillSearch } from '../utils' import { LeftSideMenuPage } from '../model/left-side-menu-page' import { TrackerNavigationMenuPage } from '../model/tracker/tracker-navigation-menu-page' import { ComponentsPage } from '../model/tracker/components-page' import { NewComponent } from '../model/tracker/types' import { ComponentsDetailsPage } from '../model/tracker/component-details-page' +import { CommonTrackerPage } from '../model/tracker/common-tracker-page' test.use({ storageState: PlatformSetting }) test.describe('Tracker component tests', () => { + let commonTrackerPage: CommonTrackerPage + let leftSideMenuPage: LeftSideMenuPage + let trackerNavigationMenuPage: TrackerNavigationMenuPage + let componentsPage: ComponentsPage + let componentsDetailsPage: ComponentsDetailsPage + test.beforeEach(async ({ page }) => { + commonTrackerPage = new CommonTrackerPage(page) + leftSideMenuPage = new LeftSideMenuPage(page) + trackerNavigationMenuPage = new TrackerNavigationMenuPage(page) + componentsPage = new ComponentsPage(page) + componentsDetailsPage = new ComponentsDetailsPage(page) + await (await page.goto(`${PlatformURI}/workbench/sanity-ws`))?.finished() }) test('create-component-issue', async ({ page }) => { - await page.click('[id="app-tracker\\:string\\:TrackerApplication"]') - await page.click('text=Components') - await expect(page).toHaveURL( - `${PlatformURI}/workbench/sanity-ws/tracker/tracker%3Aproject%3ADefaultProject/components` - ) - await page.click('button:has-text("Component")') - await page.click('[placeholder="Component\\ name"]') + await commonTrackerPage.navigateToComponents(PlatformURI) const componentName = 'component-' + generateId() - await page.fill('[placeholder="Component\\ name"]', componentName) - - await page.click('button:has-text("Create component")') - + await commonTrackerPage.createComponent(componentName) await fillSearch(page, componentName) - - await page.click(`text=${componentName}`) - await page.click('button:has-text("New issue")') - await page.fill('[placeholder="Issue\\ title"]', 'issue') - await page.click('form button:has-text("Component")') - await page.click(`.selectPopup button:has-text("${componentName}")`) - await page.click('form button:has-text("Create issue")') - await page.waitForSelector('form.antiCard', { state: 'detached' }) + await commonTrackerPage.createIssueForComponent(componentName) }) test('Edit a component', async ({ page }) => { @@ -50,47 +47,28 @@ test.describe('Tracker component tests', () => { description: 'Edit component test description update', lead: 'Appleseed John' } - - const leftSideMenuPage = new LeftSideMenuPage(page) await leftSideMenuPage.clickTracker() - - const trackerNavigationMenuPage = new TrackerNavigationMenuPage(page) await trackerNavigationMenuPage.openComponentsForProject('Default') - - const componentsPage = new ComponentsPage(page) await componentsPage.createNewComponent(newComponent) await componentsPage.openComponentByName(newComponent.name) - - const componentsDetailsPage = new ComponentsDetailsPage(page) await componentsDetailsPage.checkComponent(newComponent) - await componentsDetailsPage.editComponent(editComponent) await trackerNavigationMenuPage.openComponentsForProject('Default') - await componentsPage.openComponentByName(editComponent.name) await componentsDetailsPage.checkComponent(editComponent) }) - test('Delete a component', async ({ page }) => { + test('Delete a component', async () => { const newComponent: NewComponent = { name: 'Delete component test', description: 'Delete component test description' } - const leftSideMenuPage = new LeftSideMenuPage(page) await leftSideMenuPage.clickTracker() - - const trackerNavigationMenuPage = new TrackerNavigationMenuPage(page) await trackerNavigationMenuPage.openComponentsForProject('Default') - - const componentsPage = new ComponentsPage(page) await componentsPage.openComponentByName(newComponent.name) - - const componentsDetailsPage = new ComponentsDetailsPage(page) - await componentsDetailsPage.checkComponent(newComponent) await componentsDetailsPage.deleteComponent() - await componentsPage.checkComponentNotExist(newComponent.name) }) }) diff --git a/tests/sanity/tests/tracker/filter.spec.ts b/tests/sanity/tests/tracker/filter.spec.ts index f34affe788..6eb8cb3cdb 100644 --- a/tests/sanity/tests/tracker/filter.spec.ts +++ b/tests/sanity/tests/tracker/filter.spec.ts @@ -11,12 +11,20 @@ test.use({ }) test.describe('Tracker filters tests', () => { + let leftSideMenuPage: LeftSideMenuPage + let issuesPage: IssuesPage + let issuesDetailsPage: IssuesDetailsPage + test.beforeEach(async ({ page }) => { + leftSideMenuPage = new LeftSideMenuPage(page) + issuesPage = new IssuesPage(page) + issuesDetailsPage = new IssuesDetailsPage(page) + await (await page.goto(`${PlatformURI}/workbench/sanity-ws`))?.finished() }) // TODO: We need to split them into separate one's and fix. - test.skip('Modified date', async ({ page }) => { + test.skip('Modified date', async () => { const newIssue: NewIssue = { title: `Issue for the Modified filter-${generateId()}`, description: 'Issue for the Modified filter', @@ -31,11 +39,9 @@ test.describe('Tracker filters tests', () => { filePath: 'cat.jpeg' } - const leftSideMenuPage = new LeftSideMenuPage(page) await leftSideMenuPage.clickTracker() - const issuesPage = new IssuesPage(page) - await issuesPage.modelSelectorAll().click() + await issuesPage.clickModelSelectorAll() await issuesPage.createNewIssue(newIssue) await test.step('Check Filter Today', async () => { @@ -113,7 +119,7 @@ test.describe('Tracker filters tests', () => { }) // TODO: We need to split them into separate one's and fix. - test.skip('Created date', async ({ page }) => { + test.skip('Created date', async () => { const yesterdayIssueTitle = 'Issue for the Check Filter Yesterday' const newIssue: NewIssue = { title: `Issue for the Created filter-${generateId()}`, @@ -129,11 +135,9 @@ test.describe('Tracker filters tests', () => { filePath: 'cat.jpeg' } - const leftSideMenuPage = new LeftSideMenuPage(page) await leftSideMenuPage.clickTracker() - const issuesPage = new IssuesPage(page) - await issuesPage.modelSelectorAll().click() + await issuesPage.clickModelSelectorAll() await issuesPage.createNewIssue(newIssue) await test.step('Check Filter Today', async () => { @@ -230,13 +234,11 @@ test.describe('Tracker filters tests', () => { }) }) - test('Status filter', async ({ page }) => { - const leftSideMenuPage = new LeftSideMenuPage(page) + test('Status filter', async () => { await leftSideMenuPage.clickTracker() - const issuesPage = new IssuesPage(page) await issuesPage.linkSidebarAll().click() - await issuesPage.modelSelectorAll().click() + await issuesPage.clickModelSelectorAll() for (const status of DEFAULT_STATUSES) { await test.step(`Status Filter ${status}`, async () => { @@ -250,18 +252,15 @@ test.describe('Tracker filters tests', () => { } }) - test('Priority filter', async ({ page }) => { - const leftSideMenuPage = new LeftSideMenuPage(page) + test('Priority filter', async () => { await leftSideMenuPage.clickTracker() - const issuesPage = new IssuesPage(page) - await issuesPage.modelSelectorAll().click() + await issuesPage.clickModelSelectorAll() for (const priority of PRIORITIES) { await test.step(`Priority Filter ${priority}`, async () => { await issuesPage.selectFilter('Priority', priority) await issuesPage.inputSearch().press('Escape') - await issuesPage.checkFilter('Priority', 'is') await issuesPage.checkAllIssuesByPriority(priority.toLowerCase().replaceAll(' ', '')) await issuesPage.buttonClearFilers().click() @@ -269,13 +268,11 @@ test.describe('Tracker filters tests', () => { } }) - test('Created by filter', async ({ page }) => { + test('Created by filter', async () => { const createdBy = 'Appleseed John' - const leftSideMenuPage = new LeftSideMenuPage(page) await leftSideMenuPage.clickTracker() - const issuesPage = new IssuesPage(page) - await issuesPage.modelSelectorAll().click() + await issuesPage.clickModelSelectorAll() await issuesPage.selectFilter('Created by', createdBy) await issuesPage.inputSearch().press('Escape') @@ -284,19 +281,16 @@ test.describe('Tracker filters tests', () => { for await (const issue of iterateLocator(issuesPage.issuesList())) { await issue.locator('span.list > a').click() - const issuesDetailsPage = new IssuesDetailsPage(page) expect(issuesDetailsPage.checkIfButtonCbuttonCreatedByHaveTextCreatedBy(createdBy)) await issuesDetailsPage.clickCloseIssueButton() } }) - test('Component filter', async ({ page }) => { + test('Component filter', async () => { const defaultComponent = 'Default component' - const leftSideMenuPage = new LeftSideMenuPage(page) await leftSideMenuPage.clickTracker() - const issuesPage = new IssuesPage(page) - await issuesPage.modelSelectorAll().click() + await issuesPage.clickModelSelectorAll() await issuesPage.selectFilter('Component', defaultComponent) await issuesPage.inputSearch().press('Escape') @@ -305,21 +299,18 @@ test.describe('Tracker filters tests', () => { for await (const issue of iterateLocator(issuesPage.issuesList())) { await issue.locator('span.list > a').click() - const issuesDetailsPage = new IssuesDetailsPage(page) expect(issuesDetailsPage.checkIfButtonComponentHasTextDefaultComponent(defaultComponent)) await issuesDetailsPage.clickCloseIssueButton() } }) - test('Title filter', async ({ page }) => { + test('Title filter', async () => { const firstSearch = 'issue' const secondSearch = 'done' - const leftSideMenuPage = new LeftSideMenuPage(page) await leftSideMenuPage.clickTracker() - const issuesPage = new IssuesPage(page) - await issuesPage.modelSelectorAll().click() + await issuesPage.clickModelSelectorAll() await test.step(`Check Title filter for ${firstSearch}`, async () => { await issuesPage.selectFilter('Title', firstSearch) @@ -341,13 +332,11 @@ test.describe('Tracker filters tests', () => { }) }) - test('Modified by filter', async ({ page }) => { + test('Modified by filter', async () => { const modifierName = 'Appleseed John' - const leftSideMenuPage = new LeftSideMenuPage(page) await leftSideMenuPage.clickTracker() - const issuesPage = new IssuesPage(page) - await issuesPage.modelSelectorAll().click() + await issuesPage.clickModelSelectorAll() await issuesPage.selectFilter('Modified by', modifierName) await issuesPage.inputSearch().press('Escape') @@ -356,7 +345,6 @@ test.describe('Tracker filters tests', () => { for await (const issue of iterateLocator(issuesPage.issuesList())) { await issue.locator('span.list > a').click() - const issuesDetailsPage = new IssuesDetailsPage(page) expect(issuesDetailsPage.checkIfButtonCreatedByHaveRealName(modifierName)) await issuesDetailsPage.clickCloseIssueButton() @@ -364,7 +352,7 @@ test.describe('Tracker filters tests', () => { }) // TODO: We need to split them into separate one's and fix. - test.skip('Milestone filter', async ({ page }) => { + test.skip('Milestone filter', async () => { const filterMilestoneName = 'Filter Milestone' const milestoneIssue: NewIssue = { title: `Issue for the Milestone filter-${generateId()}`, @@ -372,11 +360,9 @@ test.describe('Tracker filters tests', () => { milestone: filterMilestoneName } - const leftSideMenuPage = new LeftSideMenuPage(page) await leftSideMenuPage.clickTracker() - const issuesPage = new IssuesPage(page) - await issuesPage.modelSelectorAll().click() + await issuesPage.clickModelSelectorAll() await issuesPage.createNewIssue(milestoneIssue) await test.step('Check Milestone filter for Filter Milestone', async () => { @@ -397,8 +383,6 @@ test.describe('Tracker filters tests', () => { for await (const issue of iterateLocator(issuesPage.issuesList())) { await issue.locator('span.list > a').click() - - const issuesDetailsPage = new IssuesDetailsPage(page) await expect(issuesDetailsPage.buttonMilestone()).toHaveText('Milestone') issuesDetailsPage.buttonCloseIssue() @@ -406,7 +390,7 @@ test.describe('Tracker filters tests', () => { }) }) - test('Label filter', async ({ page }) => { + test('Label filter', async () => { const filterLabel = 'Filter Label' const labelIssue: NewIssue = { title: `Issue for the Label filter-${generateId()}`, @@ -415,18 +399,14 @@ test.describe('Tracker filters tests', () => { createLabel: true } - const leftSideMenuPage = new LeftSideMenuPage(page) await leftSideMenuPage.clickTracker() - - const issuesPage = new IssuesPage(page) - await issuesPage.modelSelectorAll().click() + await issuesPage.clickModelSelectorAll() await issuesPage.createNewIssue(labelIssue) await test.step('Check Label filter for exist Label', async () => { await issuesPage.selectFilter('Labels', filterLabel) await issuesPage.inputSearch().press('Escape') await issuesPage.checkFilter('Labels', 'is', filterLabel) - for await (const issue of iterateLocator(issuesPage.issuesList())) { await expect(issue.locator('div.compression-bar > div.label-box span.label')).toContainText(filterLabel) } @@ -434,7 +414,7 @@ test.describe('Tracker filters tests', () => { }) // TODO: We need to split them into separate one's and fix. - test.skip('Due date filter', async ({ page }) => { + test.skip('Due date filter', async () => { const plusSevenDate = new Date() const currentMonth = plusSevenDate.getMonth() plusSevenDate.setDate(plusSevenDate.getDate() + 7) @@ -460,11 +440,8 @@ test.describe('Tracker filters tests', () => { duedate: 'nextMonth' } - const leftSideMenuPage = new LeftSideMenuPage(page) await leftSideMenuPage.clickTracker() - - const issuesPage = new IssuesPage(page) - await issuesPage.modelSelectorAll().click() + await issuesPage.clickModelSelectorAll() await issuesPage.createNewIssue(dueDateOverdueIssue) await issuesPage.createNewIssue(dueDateTodayIssue) await issuesPage.createNewIssue(dueDateNextWeekIssue) @@ -614,7 +591,6 @@ test.describe('Tracker filters tests', () => { await test.step('Check Filter Not specified', async () => { await issuesPage.updateFilterDimension('Not specified') await issuesPage.checkFilter('Due date', 'Not specified') - await issuesPage.checkFilteredIssueNotExist(dueDateOverdueIssue.title) await issuesPage.checkFilteredIssueNotExist(dueDateTodayIssue.title) await issuesPage.checkFilteredIssueNotExist(dueDateNextWeekIssue.title) diff --git a/tests/sanity/tests/tracker/issues-duplicate.spec.ts b/tests/sanity/tests/tracker/issues-duplicate.spec.ts index 096b4a3844..d08185fec5 100644 --- a/tests/sanity/tests/tracker/issues-duplicate.spec.ts +++ b/tests/sanity/tests/tracker/issues-duplicate.spec.ts @@ -11,11 +11,21 @@ test.use({ }) test.describe('Tracker duplicate issue tests', () => { + let leftSideMenuPage: LeftSideMenuPage + let trackerNavigationMenuPage: TrackerNavigationMenuPage + let issuesPage: IssuesPage + let issuesDetailsPage: IssuesDetailsPage + test.beforeEach(async ({ page }) => { + leftSideMenuPage = new LeftSideMenuPage(page) + trackerNavigationMenuPage = new TrackerNavigationMenuPage(page) + issuesPage = new IssuesPage(page) + issuesDetailsPage = new IssuesDetailsPage(page) + await (await page.goto(`${PlatformURI}/workbench/sanity-ws`))?.finished() }) - test('Create duplicate issues with the same title', async ({ page }) => { + test('Create duplicate issues with the same title', async () => { const generatedId = generateId() const firstIssue: NewIssue = { @@ -26,15 +36,9 @@ test.describe('Tracker duplicate issue tests', () => { title: `Duplicate issue-${generatedId}`, description: 'Second Duplicate issue' } - - const leftSideMenuPage = new LeftSideMenuPage(page) await leftSideMenuPage.clickTracker() - - const trackerNavigationMenuPage = new TrackerNavigationMenuPage(page) await trackerNavigationMenuPage.openIssuesForProject('Default') - - const issuesPage = new IssuesPage(page) - await issuesPage.modelSelectorAll().click() + await issuesPage.clickModelSelectorAll() await issuesPage.createNewIssue(firstIssue) // TODO need to delete if issue created successfully await trackerNavigationMenuPage.openTemplateForProject('Default') @@ -56,8 +60,6 @@ test.describe('Tracker duplicate issue tests', () => { await test.step('Update the first issue title', async () => { const newIssueTitle = `Duplicate Update issue-${generateId()}` await issuesPage.openIssueById(firstIssueId) - - const issuesDetailsPage = new IssuesDetailsPage(page) await issuesDetailsPage.inputTitle().fill(newIssueTitle) await issuesDetailsPage.checkIssue({ ...firstIssue, @@ -70,8 +72,6 @@ test.describe('Tracker duplicate issue tests', () => { await issuesPage.searchIssueByName(secondIssue.title) await issuesPage.openIssueById(secondIssueId) - - const issuesDetailsPage = new IssuesDetailsPage(page) await issuesDetailsPage.checkIssue({ ...secondIssue }) diff --git a/tests/sanity/tests/tracker/issues.spec.ts b/tests/sanity/tests/tracker/issues.spec.ts index 8a15931997..c6017c578a 100644 --- a/tests/sanity/tests/tracker/issues.spec.ts +++ b/tests/sanity/tests/tracker/issues.spec.ts @@ -13,10 +13,19 @@ test.use({ }) test.describe('Tracker issue tests', () => { - test.beforeEach(async ({ page }) => { - await (await page.goto(`${PlatformURI}/workbench/sanity-ws`))?.finished() + let leftSideMenuPage: LeftSideMenuPage + let issuesDetailsPage: IssuesDetailsPage + let issuesPage: IssuesPage + let trackerNavigationMenuPage: TrackerNavigationMenuPage + let issueCommentPopup: IssueCommentPopup - const leftSideMenuPage = new LeftSideMenuPage(page) + test.beforeEach(async ({ page }) => { + leftSideMenuPage = new LeftSideMenuPage(page) + issuesDetailsPage = new IssuesDetailsPage(page) + issuesPage = new IssuesPage(page) + trackerNavigationMenuPage = new TrackerNavigationMenuPage(page) + issueCommentPopup = new IssueCommentPopup(page) + await (await page.goto(`${PlatformURI}/workbench/sanity-ws`))?.finished() await leftSideMenuPage.clickTracker() }) @@ -37,7 +46,6 @@ test.describe('Tracker issue tests', () => { } await prepareNewIssueWithOpenStep(page, newIssue) - const issuesDetailsPage = new IssuesDetailsPage(page) await issuesDetailsPage.checkIssue({ ...newIssue, milestone: 'Milestone', @@ -62,7 +70,6 @@ test.describe('Tracker issue tests', () => { } await prepareNewIssueWithOpenStep(page, newIssue) - const issuesDetailsPage = new IssuesDetailsPage(page) await issuesDetailsPage.editIssue(editIssue) await issuesDetailsPage.checkIssue({ @@ -105,8 +112,7 @@ test.describe('Tracker issue tests', () => { description: 'Created issue to be parent issue' } - const issuesPage = new IssuesPage(page) - await issuesPage.modelSelectorAll().click() + await issuesPage.clickModelSelectorAll() await issuesPage.createNewIssue(parentIssue) await test.step('Set parent issue during creation', async () => { @@ -116,19 +122,17 @@ test.describe('Tracker issue tests', () => { parentIssue: parentIssue.title } - await issuesPage.modelSelectorAll().click() + await issuesPage.clickModelSelectorAll() await issuesPage.createNewIssue(newIssue) await issuesPage.searchIssueByName(newIssue.title) await issuesPage.checkParentIssue(newIssue.title, parentIssue.title) await issuesPage.openIssueByName(newIssue.title) - const issuesDetailsPage = new IssuesDetailsPage(page) await issuesDetailsPage.checkIssue({ ...newIssue, parentIssue: parentIssue.title }) - const trackerNavigationMenuPage = new TrackerNavigationMenuPage(page) await trackerNavigationMenuPage.openIssuesForProject('Default') }) @@ -137,7 +141,7 @@ test.describe('Tracker issue tests', () => { title: `Set parent issue from issues page-${generateId(2)}`, description: 'Set parent issue from issues page' } - await issuesPage.modelSelectorAll().click() + await issuesPage.clickModelSelectorAll() await issuesPage.createNewIssue(newIssue) await issuesPage.searchIssueByName(newIssue.title) @@ -148,13 +152,10 @@ test.describe('Tracker issue tests', () => { await issuesPage.checkParentIssue(newIssue.title, parentIssue.title) await issuesPage.openIssueByName(newIssue.title) - const issuesDetailsPage = new IssuesDetailsPage(page) await issuesDetailsPage.checkIssue({ ...newIssue, parentIssue: parentIssue.title }) - - const trackerNavigationMenuPage = new TrackerNavigationMenuPage(page) await trackerNavigationMenuPage.openIssuesForProject('Default') }) @@ -163,21 +164,16 @@ test.describe('Tracker issue tests', () => { title: `Set parent issue from issue details page-${generateId(2)}`, description: 'Set parent issue from issue details page' } - await issuesPage.modelSelectorAll().click() + await issuesPage.clickModelSelectorAll() await issuesPage.createNewIssue(newIssue) await issuesPage.searchIssueByName(newIssue.title) await issuesPage.openIssueByName(newIssue.title) - - const issuesDetailsPage = new IssuesDetailsPage(page) - await issuesDetailsPage.moreActionOnIssue('Set parent issue…') await issuesPage.selectMenuItem(page, parentIssue.title, true) await issuesDetailsPage.checkIssue({ ...newIssue, parentIssue: parentIssue.title }) - - const trackerNavigationMenuPage = new TrackerNavigationMenuPage(page) await trackerNavigationMenuPage.openIssuesForProject('Default') await issuesPage.checkParentIssue(newIssue.title, parentIssue.title) }) @@ -190,14 +186,9 @@ test.describe('Tracker issue tests', () => { description: 'Issue to move to another project' } await prepareNewIssueWithOpenStep(page, moveIssue) - const issuesDetailsPage = new IssuesDetailsPage(page) await issuesDetailsPage.moreActionOnIssue('Move to project') await issuesDetailsPage.fillMoveIssuesModal(secondProjectName, true) - - const trackerNavigationMenuPage = new TrackerNavigationMenuPage(page) await trackerNavigationMenuPage.openIssuesForProject(secondProjectName) - - const issuesPage = new IssuesPage(page) await issuesPage.openIssueByName(moveIssue.title) await issuesDetailsPage.checkIssue({ ...moveIssue @@ -235,18 +226,15 @@ test.describe('Tracker issue tests', () => { component: 'Default component', milestone: 'Edit Milestone' } - const issuesPage = new IssuesPage(page) - await issuesPage.modelSelectorAll().click() + await issuesPage.clickModelSelectorAll() await issuesPage.buttonCreateNewIssue().click() await issuesPage.selectTemplate(templateName) await expect(issuesPage.buttonPopupCreateNewIssueTemplate()).toHaveText(templateName) await issuesPage.fillNewIssueForm({ description: newIssue.description, title: newIssue.title }) - await issuesPage.buttonCreateIssue().click() + await issuesPage.clickButtonCreateIssue() await issuesPage.searchIssueByName(newIssue.title) await issuesPage.openIssueByName(newIssue.title) - - const issuesDetailsPage = new IssuesDetailsPage(page) await issuesDetailsPage.checkIssue(newIssue) }) @@ -255,17 +243,12 @@ test.describe('Tracker issue tests', () => { title: 'Issue for deletion', description: 'Description Issue for deletion' } - const issuesPage = new IssuesPage(page) - await issuesPage.modelSelectorAll().click() + await issuesPage.clickModelSelectorAll() await issuesPage.searchIssueByName(deleteIssue.title) await issuesPage.openIssueByName(deleteIssue.title) - - const issuesDetailsPage = new IssuesDetailsPage(page) await issuesDetailsPage.waitDetailsOpened(deleteIssue.title) - await issuesDetailsPage.moreActionOnIssue('Delete') await issuesDetailsPage.pressYesForPopup(page) - await issuesPage.searchIssueByName(deleteIssue.title) await issuesPage.checkIssueNotExist(deleteIssue.title) }) @@ -277,8 +260,6 @@ test.describe('Tracker issue tests', () => { description: 'Check the changed description activity description' } await prepareNewIssueWithOpenStep(page, changedDescriptionIssue) - - const issuesDetailsPage = new IssuesDetailsPage(page) await issuesDetailsPage.waitDetailsOpened(changedDescriptionIssue.title) await issuesDetailsPage.checkIssue(changedDescriptionIssue) await issuesDetailsPage.addToDescription(additionalDescription) @@ -292,8 +273,6 @@ test.describe('Tracker issue tests', () => { description: 'Add comment with image attachment' } await prepareNewIssueWithOpenStep(page, commentImageIssue) - - const issuesDetailsPage = new IssuesDetailsPage(page) await issuesDetailsPage.waitDetailsOpened(commentImageIssue.title) await issuesDetailsPage.addCommentWithImage('Added comment with atttachment', 'cat3.jpeg') await issuesDetailsPage.checkCommentWithImageExist('left a comment', 'cat3.jpeg') @@ -307,27 +286,17 @@ test.describe('Tracker issue tests', () => { description: 'Issue for add comment by popup' } await prepareNewIssueWithOpenStep(page, commentIssue) - - const issuesDetailsPage = new IssuesDetailsPage(page) await issuesDetailsPage.waitDetailsOpened(commentIssue.title) await issuesDetailsPage.addComment(commentInside) await issuesDetailsPage.checkCommentExist(commentInside) - - const trackerNavigationMenuPage = new TrackerNavigationMenuPage(page) await trackerNavigationMenuPage.openIssuesForProject('Default') - - const issuesPage = new IssuesPage(page) await issuesPage.searchIssueByName(commentIssue.title) await issuesPage.checkCommentsCount(commentIssue.title, '1') await issuesPage.openCommentPopupForIssueByName(commentIssue.title) - - const issueCommentPopup = new IssueCommentPopup(page) await issueCommentPopup.addCommentInPopup(commentPopup, 'cat2.jpeg') await issueCommentPopup.checkCommentWithImageExist('left a comment', 'cat2.jpeg') await issueCommentPopup.checkCommentExist(commentPopup) - - await issuesPage.modelSelectorAll().click() - + await issuesPage.clickModelSelectorAll() await issuesPage.searchIssueByName(commentIssue.title) await issuesPage.checkCommentsCount(commentIssue.title, '2') }) diff --git a/tests/sanity/tests/tracker/layout.spec.ts b/tests/sanity/tests/tracker/layout.spec.ts index c44014ef6c..086997021d 100644 --- a/tests/sanity/tests/tracker/layout.spec.ts +++ b/tests/sanity/tests/tracker/layout.spec.ts @@ -84,7 +84,7 @@ async function initIssues (prefix: string, page: Page): Promise { await page.click('text="Issues"') const issuesPage = new IssuesPage(page) - await issuesPage.modelSelectorAll().click() + await issuesPage.clickModelSelectorAll() return issuesProps } @@ -126,7 +126,7 @@ test.describe('tracker layout tests', () => { const issueNames = issuesProps.map((props) => props.name) const issuesPage = new IssuesPage(page) - await issuesPage.modelSelectorAll().click() + await issuesPage.clickModelSelectorAll() await page.click(ViewletSelectors.Table) for (const g of groupLabels) { await expect(locator).toContainText(g) @@ -184,7 +184,7 @@ test.describe('tracker layout tests', () => { orderedIssueNames = issuesProps.map((props) => props.name).reverse() } const issuesPage = new IssuesPage(page) - await issuesPage.modelSelectorAll().click() + await issuesPage.clickModelSelectorAll() await page.click(ViewletSelectors.Board) await setViewGroup(page, 'No grouping') await setViewOrder(page, order) diff --git a/tests/sanity/tests/tracker/loading.spec.ts b/tests/sanity/tests/tracker/loading.spec.ts index 5b249f9c49..5e0717edf6 100644 --- a/tests/sanity/tests/tracker/loading.spec.ts +++ b/tests/sanity/tests/tracker/loading.spec.ts @@ -1,4 +1,4 @@ -import { test, expect } from '@playwright/test' +import { test } from '@playwright/test' import { IssuesPage } from '../model/tracker/issues-page' import { PlatformSetting, PlatformURI } from '../utils' test.use({ @@ -9,13 +9,7 @@ test('check-status-loading', async ({ page }) => { await ( await page.goto(`${PlatformURI}/workbench/sanity-ws/tracker/tracker%3Aproject%3ADefaultProject/issues`) )?.finished() - const issuesPage = new IssuesPage(page) - await issuesPage.modelSelectorAll().click() - - await expect(page.locator('.categoryHeader :text-is("In Progress")').first()).toBeVisible() - await expect(page.locator('.categoryHeader :text-is("Backlog")').first()).toBeVisible() - await expect(page.locator('.categoryHeader :text-is("Todo")').first()).toBeVisible() - await expect(page.locator('.categoryHeader :text-is("Done")').first()).toBeVisible() - await expect(page.locator('.categoryHeader :text-is("Canceled")').first()).toBeVisible() + await issuesPage.clickModelSelectorAll() + await issuesPage.verifyCategoryHeadersVisibility() }) diff --git a/tests/sanity/tests/tracker/mentions.spec.ts b/tests/sanity/tests/tracker/mentions.spec.ts index 49281034a7..d8659fec32 100644 --- a/tests/sanity/tests/tracker/mentions.spec.ts +++ b/tests/sanity/tests/tracker/mentions.spec.ts @@ -11,26 +11,33 @@ test.use({ }) test.describe('Mentions issue tests', () => { + let leftSideMenuPage: LeftSideMenuPage + let issuesPage: IssuesPage + let issuesDetailsPage: IssuesDetailsPage + let employeeDetailsPage: EmployeeDetailsPage + test.beforeEach(async ({ page }) => { + leftSideMenuPage = new LeftSideMenuPage(page) + issuesPage = new IssuesPage(page) + issuesDetailsPage = new IssuesDetailsPage(page) + employeeDetailsPage = new EmployeeDetailsPage(page) + await (await page.goto(`${PlatformURI}/workbench/sanity-ws`))?.finished() }) - test('If user mentioned in the issue than he should be added as Collaborators', async ({ page }) => { + test('If user mentioned in the issue than he should be added as Collaborators', async () => { const mentionIssue: NewIssue = { title: `Issue user mentioned as Collaborators-${generateId()}`, description: 'Issue user mentioned as Collaborators description' } - const leftSideMenuPage = new LeftSideMenuPage(page) await leftSideMenuPage.clickTracker() - const issuesPage = new IssuesPage(page) - await issuesPage.modelSelectorAll().click() + await issuesPage.clickModelSelectorAll() await issuesPage.createNewIssue(mentionIssue) await issuesPage.searchIssueByName(mentionIssue.title) await issuesPage.openIssueByName(mentionIssue.title) - const issuesDetailsPage = new IssuesDetailsPage(page) await issuesDetailsPage.addMentions('Dirak Kainin') await issuesDetailsPage.checkCommentExist('@Dirak Kainin') @@ -43,16 +50,13 @@ test.describe('Mentions issue tests', () => { description: 'When Change assigner user should be added as Collaborators description' } - const leftSideMenuPage = new LeftSideMenuPage(page) await leftSideMenuPage.clickTracker() - const issuesPage = new IssuesPage(page) - await issuesPage.modelSelectorAll().click() + await issuesPage.clickModelSelectorAll() await issuesPage.createNewIssue(mentionIssue) await issuesPage.searchIssueByName(mentionIssue.title) await issuesPage.openIssueByName(mentionIssue.title) - const issuesDetailsPage = new IssuesDetailsPage(page) await issuesDetailsPage.editIssue({ assignee: 'Dirak Kainin' }) await issuesDetailsPage.checkIssue({ ...mentionIssue, @@ -69,17 +73,12 @@ test.describe('Mentions issue tests', () => { title: `Check that the backlink shown in the Contact activity-${generateId()}`, description: 'Check that the backlink shown in the Contact activity description' } - - const leftSideMenuPage = new LeftSideMenuPage(page) await leftSideMenuPage.clickTracker() - - const issuesPage = new IssuesPage(page) - await issuesPage.modelSelectorAll().click() + await issuesPage.clickModelSelectorAll() await issuesPage.createNewIssue(backlinkIssue) await issuesPage.searchIssueByName(backlinkIssue.title) await issuesPage.openIssueByName(backlinkIssue.title) - const issuesDetailsPage = new IssuesDetailsPage(page) await issuesDetailsPage.checkActivityContentExist(`New issue: ${backlinkIssue.title}`) await issuesDetailsPage.openLinkFromActivitiesByText(backlinkIssue.title) await issuesDetailsPage.checkIssue(backlinkIssue) @@ -88,7 +87,6 @@ test.describe('Mentions issue tests', () => { await issuesDetailsPage.checkCommentExist(`@${mentionName}`) await issuesDetailsPage.openLinkFromActivitiesByText(mentionName) - const employeeDetailsPage = new EmployeeDetailsPage(page) await employeeDetailsPage.checkEmployee({ firstName: mentionName.split(' ')[1], lastName: mentionName.split(' ')[0] diff --git a/tests/sanity/tests/tracker/milestone.spec.ts b/tests/sanity/tests/tracker/milestone.spec.ts index 53cd6acf57..879af315da 100644 --- a/tests/sanity/tests/tracker/milestone.spec.ts +++ b/tests/sanity/tests/tracker/milestone.spec.ts @@ -11,33 +11,34 @@ test.use({ }) test.describe('Tracker milestone tests', () => { + let leftSideMenuPage: LeftSideMenuPage + let trackerNavigationMenuPage: TrackerNavigationMenuPage + let milestonesPage: MilestonesPage + let milestonesDetailsPage: MilestonesDetailsPage + test.beforeEach(async ({ page }) => { + leftSideMenuPage = new LeftSideMenuPage(page) + trackerNavigationMenuPage = new TrackerNavigationMenuPage(page) + milestonesPage = new MilestonesPage(page) + milestonesDetailsPage = new MilestonesDetailsPage(page) await (await page.goto(`${PlatformURI}/workbench/sanity-ws`))?.finished() }) - test('Create a Milestone', async ({ page }) => { + test('Create a Milestone', async () => { const newMilestone: NewMilestone = { name: `Created Milestone-${generateId()}`, description: 'Create a Milestone', status: 'In progress', targetDateInDays: 'in 3 days' } - - const leftSideMenuPage = new LeftSideMenuPage(page) await leftSideMenuPage.clickTracker() - - const trackerNavigationMenuPage = new TrackerNavigationMenuPage(page) await trackerNavigationMenuPage.openMilestonesForProject('Default') - - const milestonesPage = new MilestonesPage(page) await milestonesPage.createNewMilestone(newMilestone) await milestonesPage.openMilestoneByName(newMilestone.name) - - const milestonesDetailsPage = new MilestonesDetailsPage(page) await milestonesDetailsPage.checkIssue(newMilestone) }) - test('Edit a Milestone', async ({ page }) => { + test('Edit a Milestone', async () => { const commentText = 'Edit Milestone comment' const editMilestone: NewMilestone = { name: 'Edit Milestone', @@ -45,48 +46,29 @@ test.describe('Tracker milestone tests', () => { status: 'Completed', targetDateInDays: 'in 30 days' } - - const leftSideMenuPage = new LeftSideMenuPage(page) await leftSideMenuPage.clickTracker() - - const trackerNavigationMenuPage = new TrackerNavigationMenuPage(page) await trackerNavigationMenuPage.openMilestonesForProject('Default') - - const milestonesPage = new MilestonesPage(page) await milestonesPage.openMilestoneByName(editMilestone.name) - - const milestonesDetailsPage = new MilestonesDetailsPage(page) await milestonesDetailsPage.editIssue(editMilestone) await milestonesDetailsPage.checkIssue(editMilestone) - await milestonesDetailsPage.addComment(commentText) await milestonesDetailsPage.checkCommentExist(commentText) - await milestonesDetailsPage.checkActivityContentExist(`New milestone: ${editMilestone.name}`) await milestonesDetailsPage.checkActivityContentExist(`Status set to ${editMilestone.status}`) await milestonesDetailsPage.checkActivityExist('changed description at') }) - test('Delete a Milestone', async ({ page }) => { + test('Delete a Milestone', async () => { const deleteMilestone: NewMilestone = { name: 'Delete Milestone', description: 'Delete Milestone Description', status: 'Canceled' } - - const leftSideMenuPage = new LeftSideMenuPage(page) await leftSideMenuPage.clickTracker() - - const trackerNavigationMenuPage = new TrackerNavigationMenuPage(page) await trackerNavigationMenuPage.openMilestonesForProject('Default') - - const milestonesPage = new MilestonesPage(page) await milestonesPage.openMilestoneByName(deleteMilestone.name) - - const milestonesDetailsPage = new MilestonesDetailsPage(page) await milestonesDetailsPage.checkIssue(deleteMilestone) await milestonesDetailsPage.deleteMilestone() - await milestonesPage.checkMilestoneNotExist(deleteMilestone.name) }) }) diff --git a/tests/sanity/tests/tracker/projects.spec.ts b/tests/sanity/tests/tracker/projects.spec.ts index cfeaa6b15c..8002c9c70d 100644 --- a/tests/sanity/tests/tracker/projects.spec.ts +++ b/tests/sanity/tests/tracker/projects.spec.ts @@ -10,11 +10,18 @@ test.use({ }) test.describe('Tracker Projects tests', () => { + let trackerNavigationMenuPage: TrackerNavigationMenuPage + let newProjectPage: NewProjectPage + let editProjectPage: EditProjectPage + test.beforeEach(async ({ page }) => { + trackerNavigationMenuPage = new TrackerNavigationMenuPage(page) + newProjectPage = new NewProjectPage(page) + editProjectPage = new EditProjectPage(page) await (await page.goto(`${PlatformURI}/workbench/sanity-ws`))?.finished() }) - test('Create project', async ({ page }) => { + test('Create project', async () => { const newProjectData: NewProject = { title: 'TestProject', identifier: 'QWERT', @@ -24,18 +31,14 @@ test.describe('Tracker Projects tests', () => { defaultIssueStatus: 'In Progress' } - const trackerNavigationMenuPage = new TrackerNavigationMenuPage(page) await trackerNavigationMenuPage.checkProjectNotExist(newProjectData.title) await trackerNavigationMenuPage.pressCreateProjectButton() - - const newProjectPage = new NewProjectPage(page) await newProjectPage.createNewProject(newProjectData) await trackerNavigationMenuPage.checkProjectExist(newProjectData.title) - await trackerNavigationMenuPage.openProject(newProjectData.title) }) - test('Edit project', async ({ page }) => { + test('Edit project', async () => { const editProjectData: NewProject = { title: 'EditProject', identifier: 'EDIT', @@ -53,19 +56,12 @@ test.describe('Tracker Projects tests', () => { defaultIssueStatus: 'Done' } - const trackerNavigationMenuPage = new TrackerNavigationMenuPage(page) await trackerNavigationMenuPage.checkProjectNotExist(editProjectData.title) await trackerNavigationMenuPage.pressCreateProjectButton() - - const newProjectPage = new NewProjectPage(page) await newProjectPage.createNewProject(editProjectData) await trackerNavigationMenuPage.checkProjectExist(editProjectData.title) - await trackerNavigationMenuPage.makeActionWithProject(editProjectData.title, 'Edit project') - - const editProjectPage = new EditProjectPage(page) await editProjectPage.checkProject(editProjectData) - await editProjectPage.updateProject(updateProjectData) await trackerNavigationMenuPage.makeActionWithProject(updateProjectData.title, 'Edit project') await editProjectPage.checkProject(updateProjectData) @@ -81,17 +77,12 @@ test.describe('Tracker Projects tests', () => { defaultIssueStatus: 'In Progress' } - const trackerNavigationMenuPage = new TrackerNavigationMenuPage(page) await trackerNavigationMenuPage.checkProjectNotExist(archiveProjectData.title) await trackerNavigationMenuPage.pressCreateProjectButton() - - const newProjectPage = new NewProjectPage(page) await newProjectPage.createNewProject(archiveProjectData) await trackerNavigationMenuPage.checkProjectExist(archiveProjectData.title) - await trackerNavigationMenuPage.makeActionWithProject(archiveProjectData.title, 'Archive') await trackerNavigationMenuPage.pressYesForPopup(page) - await trackerNavigationMenuPage.checkProjectNotExist(archiveProjectData.title) }) }) diff --git a/tests/sanity/tests/tracker/related-issues.spec.ts b/tests/sanity/tests/tracker/related-issues.spec.ts index f42b6c13ef..d23d8cac0a 100644 --- a/tests/sanity/tests/tracker/related-issues.spec.ts +++ b/tests/sanity/tests/tracker/related-issues.spec.ts @@ -11,11 +11,21 @@ test.use({ }) test.describe('Tracker related issue tests', () => { + let leftSideMenuPage: LeftSideMenuPage + let issuesPage: IssuesPage + let issuesDetailsPage: IssuesDetailsPage + let trackerNavigationMenuPage: TrackerNavigationMenuPage + test.beforeEach(async ({ page }) => { + leftSideMenuPage = new LeftSideMenuPage(page) + issuesPage = new IssuesPage(page) + issuesDetailsPage = new IssuesDetailsPage(page) + trackerNavigationMenuPage = new TrackerNavigationMenuPage(page) + await (await page.goto(`${PlatformURI}/workbench/sanity-ws`))?.finished() }) - test('New related issue', async ({ page }) => { + test('New related issue', async () => { const newIssue: NewIssue = { title: `New Issue with related issue-${generateId()}`, description: 'Description New Issue with related issue' @@ -32,27 +42,17 @@ test.describe('Tracker related issue tests', () => { milestone: 'No Milestone', duedate: 'today' } - - const leftSideMenuPage = new LeftSideMenuPage(page) await leftSideMenuPage.clickTracker() - - const issuesPage = new IssuesPage(page) - await issuesPage.modelSelectorAll().click() + await issuesPage.clickModelSelectorAll() await issuesPage.createNewIssue(newIssue) await issuesPage.searchIssueByName(newIssue.title) await issuesPage.openIssueByName(newIssue.title) - - const issuesDetailsPage = new IssuesDetailsPage(page) await issuesDetailsPage.moreActionOnIssue('New related issue') - await issuesPage.fillNewIssueForm(relatedIssue) - await issuesPage.buttonCreateIssue().click() - - const trackerNavigationMenuPage = new TrackerNavigationMenuPage(page) + await issuesPage.clickButtonCreateIssue() await trackerNavigationMenuPage.openIssuesForProject('Default') await issuesPage.searchIssueByName(relatedIssue.title) await issuesPage.openIssueByName(relatedIssue.title) - await issuesDetailsPage.waitDetailsOpened(relatedIssue.title) await issuesDetailsPage.checkIssue({ ...newIssue, diff --git a/tests/sanity/tests/tracker/relations.spec.ts b/tests/sanity/tests/tracker/relations.spec.ts index 8df565d659..668c560a7e 100644 --- a/tests/sanity/tests/tracker/relations.spec.ts +++ b/tests/sanity/tests/tracker/relations.spec.ts @@ -11,7 +11,16 @@ test.use({ storageState: PlatformSetting }) test.describe('Relations', () => { + let leftSideMenuPage: LeftSideMenuPage + let issuesPage: IssuesPage + let issuesDetailsPage: IssuesDetailsPage + let trackerNavigationMenuPage: TrackerNavigationMenuPage + test.beforeEach(async ({ page }) => { + leftSideMenuPage = new LeftSideMenuPage(page) + issuesPage = new IssuesPage(page) + issuesDetailsPage = new IssuesDetailsPage(page) + trackerNavigationMenuPage = new TrackerNavigationMenuPage(page) await (await page.goto(`${PlatformURI}/workbench/sanity-ws`))?.finished() }) @@ -24,21 +33,17 @@ test.describe('Relations', () => { title: `Second. Mark as blocked by-${generateId()}`, description: 'Second. Mark as blocked by' } - const leftSideMenuPage = new LeftSideMenuPage(page) await leftSideMenuPage.clickTracker() const secondIssueId = await prepareNewIssueStep(page, secondIssue) const firstIssueId = await prepareNewIssueStep(page, firstIssue) - const issuesPage = new IssuesPage(page) await issuesPage.openIssueByName(firstIssue.title) - const issuesDetailsPage = new IssuesDetailsPage(page) await test.step('Set blocked by and check issue description', async () => { await issuesDetailsPage.waitDetailsOpened(firstIssue.title) await issuesDetailsPage.moreActionOnIssueWithSecondLevel('Relations', 'Mark as blocked by...') await issuesDetailsPage.fillSearchForIssueModal(secondIssue.title) - await issuesDetailsPage.checkIssue({ ...firstIssue, blockedBy: secondIssueId @@ -47,12 +52,9 @@ test.describe('Relations', () => { }) await test.step('Check the second issue description', async () => { - const trackerNavigationMenuPage = new TrackerNavigationMenuPage(page) await trackerNavigationMenuPage.openIssuesForProject('Default') - await issuesPage.searchIssueByName(secondIssue.title) await issuesPage.openIssueByName(secondIssue.title) - await issuesDetailsPage.waitDetailsOpened(secondIssue.title) await issuesDetailsPage.checkIssue({ ...secondIssue, @@ -70,16 +72,11 @@ test.describe('Relations', () => { title: `Second. Mark as blocked by-${generateId()}`, description: 'Second. Mark as blocked by' } - const leftSideMenuPage = new LeftSideMenuPage(page) await leftSideMenuPage.clickTracker() const secondIssueId = await prepareNewIssueStep(page, secondIssue) const firstIssueId = await prepareNewIssueStep(page, firstIssue) - - const issuesPage = new IssuesPage(page) await issuesPage.openIssueByName(firstIssue.title) - - const issuesDetailsPage = new IssuesDetailsPage(page) await test.step('Mark as blocking... and check issue description', async () => { await issuesDetailsPage.waitDetailsOpened(firstIssue.title) await issuesDetailsPage.moreActionOnIssueWithSecondLevel('Relations', 'Mark as blocking...') @@ -95,12 +92,9 @@ test.describe('Relations', () => { }) await test.step('Check the second issue description', async () => { - const trackerNavigationMenuPage = new TrackerNavigationMenuPage(page) await trackerNavigationMenuPage.openIssuesForProject('Default') - await issuesPage.searchIssueByName(secondIssue.title) await issuesPage.openIssueByName(secondIssue.title) - await issuesDetailsPage.waitDetailsOpened(secondIssue.title) await issuesDetailsPage.checkIssue({ ...secondIssue, @@ -118,16 +112,11 @@ test.describe('Relations', () => { title: `Second. Reference another issue-${generateId()}`, description: 'Second. Reference another issue' } - const leftSideMenuPage = new LeftSideMenuPage(page) await leftSideMenuPage.clickTracker() const secondIssueId = await prepareNewIssueStep(page, secondIssue) const firstIssueId = await prepareNewIssueStep(page, firstIssue) - - const issuesPage = new IssuesPage(page) await issuesPage.openIssueByName(firstIssue.title) - - const issuesDetailsPage = new IssuesDetailsPage(page) await test.step('Reference another issue... and check issue description', async () => { await issuesDetailsPage.waitDetailsOpened(firstIssue.title) await issuesDetailsPage.moreActionOnIssueWithSecondLevel('Relations', 'Reference another issue...') @@ -141,12 +130,9 @@ test.describe('Relations', () => { }) await test.step('Check the second issue description', async () => { - const trackerNavigationMenuPage = new TrackerNavigationMenuPage(page) await trackerNavigationMenuPage.openIssuesForProject('Default') - await issuesPage.searchIssueByName(secondIssue.title) await issuesPage.openIssueByName(secondIssue.title) - await issuesDetailsPage.waitDetailsOpened(secondIssue.title) await issuesDetailsPage.checkIssue({ ...secondIssue, @@ -164,16 +150,10 @@ test.describe('Relations', () => { title: `Second. Remove relation be editing issue details-${generateId()}`, description: 'Second. Remove relation be editing issue details' } - const leftSideMenuPage = new LeftSideMenuPage(page) await leftSideMenuPage.clickTracker() - const secondIssueId = await prepareNewIssueStep(page, secondIssue) await prepareNewIssueStep(page, firstIssue) - - const issuesPage = new IssuesPage(page) await issuesPage.openIssueByName(firstIssue.title) - - const issuesDetailsPage = new IssuesDetailsPage(page) await test.step('Reference another issue... and check issue description', async () => { await issuesDetailsPage.waitDetailsOpened(firstIssue.title) await issuesDetailsPage.moreActionOnIssueWithSecondLevel('Relations', 'Mark as blocked by...') @@ -191,9 +171,7 @@ test.describe('Relations', () => { }) await test.step('Check the second issue description', async () => { - const trackerNavigationMenuPage = new TrackerNavigationMenuPage(page) await trackerNavigationMenuPage.openIssuesForProject('Default') - await issuesPage.searchIssueByName(secondIssue.title) await issuesPage.openIssueByName(secondIssue.title) await issuesDetailsPage.waitDetailsOpened(secondIssue.title) diff --git a/tests/sanity/tests/tracker/subissues.spec.ts b/tests/sanity/tests/tracker/subissues.spec.ts index c0e3f7c70e..f9833dbc2b 100644 --- a/tests/sanity/tests/tracker/subissues.spec.ts +++ b/tests/sanity/tests/tracker/subissues.spec.ts @@ -13,18 +13,27 @@ import { import { Issue, NewIssue } from '../model/tracker/types' import { LeftSideMenuPage } from '../model/left-side-menu-page' import { IssuesDetailsPage } from '../model/tracker/issues-details-page' +import { CommonTrackerPage } from '../model/tracker/common-tracker-page' test.use({ storageState: PlatformSetting }) test.describe('Tracker sub-issues tests', () => { + let issuesPage: IssuesPage + let leftSideMenuPage: LeftSideMenuPage + let issuesDetailsPage: IssuesDetailsPage + let commonTrackerPage: CommonTrackerPage + test.beforeEach(async ({ page }) => { + issuesPage = new IssuesPage(page) + leftSideMenuPage = new LeftSideMenuPage(page) + issuesDetailsPage = new IssuesDetailsPage(page) + commonTrackerPage = new CommonTrackerPage(page) await (await page.goto(`${PlatformURI}/workbench/sanity-ws`))?.finished() }) test('create sub-issue', async ({ page }) => { - await page.click('[id="app-tracker\\:string\\:TrackerApplication"]') - + await commonTrackerPage.clickOnApplicationButton() const props = { name: `issue-${generateId(5)}`, description: 'description', @@ -34,25 +43,20 @@ test.describe('Tracker sub-issues tests', () => { } await navigate(page) await createIssue(page, props) - await page.click('text="Issues"') - - const issuesPage = new IssuesPage(page) - await issuesPage.modelSelectorAll().click() + await issuesPage.clickModelSelectorAll() await issuesPage.searchIssueByName(props.name) await issuesPage.openIssueByName(props.name) - await checkIssue(page, props) props.name = `sub${props.name}` - await page.click('button:has-text("Add sub-issue")') + await issuesPage.clickOnSubIssues() await fillIssueForm(page, props) await page.keyboard.press('Escape') await page.keyboard.press('Escape') - - await page.locator('#new-issue').click() + await issuesPage.clickOnNewIssue() await checkIssueDraft(page, props) }) - test('Edit a sub-issue', async ({ page }) => { + test('Edit a sub-issue', async () => { const newIssue: NewIssue = { title: `Issue for the sub-issue-${generateId()}`, description: 'Description Issue for the sub-issue' @@ -74,20 +78,15 @@ test.describe('Tracker sub-issues tests', () => { filePath: 'cat.jpeg' } - const leftSideMenuPage = new LeftSideMenuPage(page) await leftSideMenuPage.clickTracker() - - const issuesPage = new IssuesPage(page) - await issuesPage.modelSelectorAll().click() + await issuesPage.clickModelSelectorAll() await issuesPage.createNewIssue(newIssue) await issuesPage.searchIssueByName(newIssue.title) await issuesPage.openIssueByName(newIssue.title) - - const issuesDetailsPage = new IssuesDetailsPage(page) await issuesDetailsPage.clickButtonAddSubIssue() await issuesPage.fillNewIssueForm(newSubIssue) - await issuesPage.buttonCreateIssue().click() + await issuesPage.clickButtonCreateIssue() await issuesDetailsPage.openSubIssueByName(newSubIssue.title) await issuesDetailsPage.waitDetailsOpened(newSubIssue.title) @@ -110,21 +109,15 @@ test.describe('Tracker sub-issues tests', () => { title: `Delete Sub-Issue with parameter-${generateId()}`, description: 'Delete Description Sub-Issue with parameter' } - - const leftSideMenuPage = new LeftSideMenuPage(page) await leftSideMenuPage.clickTracker() - - const issuesPage = new IssuesPage(page) - await issuesPage.modelSelectorAll().click() + await issuesPage.clickModelSelectorAll() await issuesPage.createNewIssue(deleteIssue) await issuesPage.searchIssueByName(deleteIssue.title) await issuesPage.openIssueByName(deleteIssue.title) - - const issuesDetailsPage = new IssuesDetailsPage(page) await issuesDetailsPage.clickButtonAddSubIssue() await issuesPage.fillNewIssueForm(deleteSubIssue) - await issuesPage.buttonCreateIssue().click() + await issuesPage.clickButtonCreateIssue() await issuesDetailsPage.openSubIssueByName(deleteSubIssue.title) await issuesDetailsPage.waitDetailsOpened(deleteSubIssue.title) @@ -150,22 +143,16 @@ test.describe('Tracker sub-issues tests', () => { description: 'Create sub-issue from template' } const templateName = 'New Issue' - - const leftSideMenuPage = new LeftSideMenuPage(page) await leftSideMenuPage.clickTracker() - - const issuesPage = new IssuesPage(page) - await issuesPage.modelSelectorAll().click() + await issuesPage.clickModelSelectorAll() await issuesPage.createNewIssue(parentIssue) await issuesPage.searchIssueByName(parentIssue.title) await issuesPage.openIssueByName(parentIssue.title) - - const issuesDetailsPage = new IssuesDetailsPage(page) await issuesDetailsPage.moreActionOnIssue('Add sub-issue...') await issuesPage.selectTemplate(templateName) await expect(issuesPage.buttonPopupCreateNewIssueTemplate()).toHaveText(templateName) await issuesPage.fillNewIssueForm(subIssue) - await issuesPage.buttonCreateIssue().click() + await issuesPage.clickButtonCreateIssue() await issuesDetailsPage.openSubIssueByName(subIssue.title) await issuesDetailsPage.waitDetailsOpened(subIssue.title) diff --git a/tests/sanity/tests/tracker/template.spec.ts b/tests/sanity/tests/tracker/template.spec.ts index 864512e055..c379928c09 100644 --- a/tests/sanity/tests/tracker/template.spec.ts +++ b/tests/sanity/tests/tracker/template.spec.ts @@ -11,11 +11,20 @@ test.use({ }) test.describe('Tracker template tests', () => { + let leftSideMenuPage: LeftSideMenuPage + let trackerNavigationMenuPage: TrackerNavigationMenuPage + let templatePage: TemplatePage + let templateDetailsPage: TemplateDetailsPage + test.beforeEach(async ({ page }) => { + leftSideMenuPage = new LeftSideMenuPage(page) + trackerNavigationMenuPage = new TrackerNavigationMenuPage(page) + templatePage = new TemplatePage(page) + templateDetailsPage = new TemplateDetailsPage(page) await (await page.goto(`${PlatformURI}/workbench/sanity-ws`))?.finished() }) - test('Create a Template', async ({ page }) => { + test('Create a Template', async () => { const newTemplate: NewIssue = { title: `Template with all parameters-${generateId()}`, description: 'Created template with all parameters', @@ -28,17 +37,10 @@ test.describe('Tracker template tests', () => { milestone: 'No Milestone' } - const leftSideMenuPage = new LeftSideMenuPage(page) await leftSideMenuPage.clickTracker() - - const trackerNavigationMenuPage = new TrackerNavigationMenuPage(page) await trackerNavigationMenuPage.openTemplateForProject('Default') - - const templatePage = new TemplatePage(page) await templatePage.createNewTemplate(newTemplate) await templatePage.openTemplate(newTemplate.title) - - const templateDetailsPage = new TemplateDetailsPage(page) await templateDetailsPage.checkTemplate({ ...newTemplate, estimation: '2h' @@ -60,20 +62,11 @@ test.describe('Tracker template tests', () => { estimation: '8', duedate: 'today' } - - const leftSideMenuPage = new LeftSideMenuPage(page) await leftSideMenuPage.clickTracker() - - const trackerNavigationMenuPage = new TrackerNavigationMenuPage(page) await trackerNavigationMenuPage.openTemplateForProject('Default') - - const templatePage = new TemplatePage(page) await templatePage.createNewTemplate(newTemplate) await templatePage.openTemplate(newTemplate.title) - - const templateDetailsPage = new TemplateDetailsPage(page) await templateDetailsPage.editTemplate(editTemplate) - await templateDetailsPage.checkTemplate({ ...newTemplate, ...editTemplate, @@ -110,27 +103,16 @@ test.describe('Tracker template tests', () => { } }) - test('Delete a Template', async ({ page }) => { + test('Delete a Template', async () => { const deleteTemplate: NewIssue = { title: `Template for delete-${generateId()}`, description: 'Created template for delete' } - - const leftSideMenuPage = new LeftSideMenuPage(page) await leftSideMenuPage.clickTracker() - - const trackerNavigationMenuPage = new TrackerNavigationMenuPage(page) await trackerNavigationMenuPage.openTemplateForProject('Default') - - let templatePage = new TemplatePage(page) await templatePage.createNewTemplate(deleteTemplate) await templatePage.openTemplate(deleteTemplate.title) - - const templateDetailsPage = new TemplateDetailsPage(page) - await templateDetailsPage.deleteTemplate() - - templatePage = new TemplatePage(page) await templatePage.checkTemplateNotExist(deleteTemplate.title) }) }) diff --git a/tests/sanity/tests/tracker/tracker.spec.ts b/tests/sanity/tests/tracker/tracker.spec.ts index f14cbdd765..4325e0dd15 100644 --- a/tests/sanity/tests/tracker/tracker.spec.ts +++ b/tests/sanity/tests/tracker/tracker.spec.ts @@ -1,6 +1,6 @@ -import { expect, test } from '@playwright/test' +import { test } from '@playwright/test' import { IssuesPage } from '../model/tracker/issues-page' -import { PlatformSetting, fillSearch, generateId } from '../utils' +import { PlatformSetting, fillSearch } from '../utils' import { DEFAULT_STATUSES, ViewletSelectors, @@ -8,17 +8,15 @@ import { createIssue, navigate, openIssue, - toTime + performPanelTest, + getIssueName } from './tracker.utils' -import { TrackerNavigationMenuPage } from '../model/tracker/tracker-navigation-menu-page' import { IssuesDetailsPage } from '../model/tracker/issues-details-page' - +import { CommonTrackerPage } from '../model/tracker/common-tracker-page' test.use({ storageState: PlatformSetting }) -const getIssueName = (postfix: string = generateId()): string => `issue-${postfix}` - const panelStatusMap = new Map([ ['Issues/All', DEFAULT_STATUSES], ['Issues/Active', ['Todo', 'In Progress']], @@ -27,196 +25,98 @@ const panelStatusMap = new Map([ test.describe('Tracker tests', () => { test('issues-status-display', async ({ page }) => { - const locator = page.locator('.list-container') await navigate(page) for (const status of DEFAULT_STATUSES) { await createIssue(page, { name: getIssueName(status), status }) } for (const [panel, statuses] of panelStatusMap) { const pPage = panel.split('/') - await performPanelTest(statuses, pPage[0], pPage[1]) - } - - async function performPanelTest (statuses: string[], panel: string, mode: string): Promise { - const excluded = DEFAULT_STATUSES.filter((status) => !statuses.includes(status)) - await new TrackerNavigationMenuPage(page).openIssuesForProject('Default') - await page.locator(`.ac-header .overflow-label:has-text("${mode}")`).click() - await page.click(ViewletSelectors.Table) - for (const s of statuses) { - await expect(locator).toContainText(s) - } - if (excluded.length > 0) { - await expect(locator).not.toContainText(excluded) - } - await page.click(ViewletSelectors.Board) - - if (excluded.length > 0) { - await expect(locator).not.toContainText(excluded) - } - for (const status of statuses) { - await expect( - page.locator('.panel-container', { - has: page.locator(`.header:has-text("${status}")`) - }) - ).toContainText(getIssueName(status), { timeout: 15000 }) - } + await performPanelTest(page, statuses, pPage[0], pPage[1]) } }) test('save-view-options', async ({ page }) => { const panels = ['Issues', 'Active', 'Backlog'] + const commonTrackerPage = new CommonTrackerPage(page) await navigate(page) for (const viewletSelector of [ViewletSelectors.Board, ViewletSelectors.Table]) { for (const panel of panels) { - await page.click(`text="${panel}"`) - await page.click(viewletSelector) - await page.click('button:has-text("View")') - await page.click('.antiCard >> button >> nth=0') - await page.click('.menu-item:has-text("Assignee")') - await page.keyboard.press('Escape') + await commonTrackerPage.selectPanelAndViewlet(panel, viewletSelector) + await commonTrackerPage.openViewOptionsAndSelectAssignee() } for (const panel of panels) { - await page.click(`text="${panel}"`) - await expect(page.locator(viewletSelector)).toHaveClass(/selected/) - await page.click('button:has-text("View")') - await expect(page.locator('.antiCard >> button >> nth=0')).toContainText('Assignee') - await page.keyboard.press('Escape') + await commonTrackerPage.verifyViewOption(panel, viewletSelector) } } }) test('my-issues', async ({ page }) => { + const issuesPage = new IssuesPage(page) const name = getIssueName() await navigate(page) await createIssue(page, { name }) - await page.click('text="My issues"') - const issuesPage = new IssuesPage(page) + await issuesPage.navigateToMyIssues() await issuesPage.searchIssueByName(name) - - await page.click('[data-id="tab-assigned"]') - await expect(page.locator('.antiPanel-component')).not.toContainText(name) - await page.click('[data-id="tab-created"]') - await page.waitForTimeout(3000) - await expect(page.locator('.antiPanel-component')).toContainText(name) - await page.click('[data-id="tab-subscribed"]') - await page.waitForTimeout(3000) - await expect(page.locator('.antiPanel-component')).toContainText(name) + await issuesPage.checkIssuePresenceInTabs(name, true) await openIssue(page, name) - // click "Don't track" - await page.click('button:has-text("Appleseed John") >> nth=1') - await page.click('.selectPopup >> button:has-text("Appleseed John")') - await page.waitForTimeout(100) - await page.keyboard.press('Escape') - await page.keyboard.press('Escape') - await expect(page.locator('.antiPanel-component')).not.toContainText(name) + await issuesPage.stopTrackingIssue(name) }) test('report-time-from-issue-card', async ({ page }) => { + const issuesPage = new IssuesPage(page) await navigate(page) const assignee = 'Chen Rosamund' const status = 'In Progress' const values = [2, 4, 6, 8] + for (let i = 0; i < 5; i++) { const random = Math.floor(Math.random() * values.length) const time = values[random] const name = getIssueName() - try { - await page.evaluate(() => { - localStorage.setItem('#platform.notification.timeout', '5000') - }) - await createIssue(page, { name, assignee, status }) - await page.waitForSelector(`text="${name}"`) - await page.waitForSelector('text="View issue"') - await page.click('text="View issue"') - } finally { - await page.evaluate(() => { - localStorage.setItem('#platform.notification.timeout', '0') - }) - } - await page.click('#ReportedTimeEditor') - await page.waitForSelector('text="Time spent reports"') - await page.click('#ReportsPopupAddButton') - await page.waitForSelector('text="Add time report"') - await expect(page.locator('button:has-text("Create")')).toBeDisabled() - await page.fill('[placeholder="Spent time"]', `${time}`) - await expect(page.locator('button:has-text("Create")')).toBeEnabled() - await page.click('button:has-text("Create")') - await page.click('#card-close') - - await expect(page.locator('#ReportedTimeEditor')).toContainText(await toTime(time)) + await issuesPage.createAndOpenIssue(name, assignee, status) + await issuesPage.reportTime(time) + await issuesPage.verifyReportedTime(time) } }) test('report-multiple-time-from-issue-card', async ({ page }) => { await navigate(page) + const issuesPage = new IssuesPage(page) const assignee = 'Chen Rosamund' const status = 'In Progress' const time = 0.25 - const name = getIssueName() - - try { - await page.evaluate(() => { - localStorage.setItem('#platform.notification.timeout', '5000') - }) - await createIssue(page, { name, assignee, status }) - await page.waitForSelector(`text="${name}"`) - await page.waitForSelector('text="View issue"') - await page.click('text="View issue"') - } finally { - await page.evaluate(() => { - localStorage.setItem('#platform.notification.timeout', '0') - }) - } - - await page.click('#ReportedTimeEditor') + await issuesPage.createAndOpenIssue(name, assignee, status) + await issuesPage.clickOnReportedTimeEditor() for (let i = 0; i < 5; i++) { - await expect(page.locator('.antiCard-content >> .footer')).toContainText(`Total: ${i}`) - await page.waitForSelector('text="Time spent reports"') - await page.click('#ReportsPopupAddButton') - await page.waitForSelector('text="Add time report"') - await expect(page.locator('button:has-text("Create")')).toBeDisabled() - await page.fill('[placeholder="Spent time"]', `${time}`) - await expect(page.locator('button:has-text("Create")')).toBeEnabled() - await page.click('button:has-text("Create")') - await expect(page.locator('.antiCard-content >> .footer')).toContainText(`Total: ${i + 1}`) + await issuesPage.checkTotalFooter(i) + await issuesPage.waitForTimeSpentReports() + await issuesPage.clickAddReportButton() + await issuesPage.waitForAddTimeReport() + await issuesPage.checkCreateButtonDisabled() + await issuesPage.fillSpentTime(time) + await issuesPage.checkCreateButtonEnabled() + await issuesPage.clickCreateButton() + await issuesPage.checkTotalFooter(i + 1) } }) test('report-time-from-main-view', async ({ page }) => { + const issuesPage = new IssuesPage(page) await navigate(page) - - await page.click('text="Issues"') - await page.keyboard.press('Escape') - + await issuesPage.navigateToIssues() const values = [2, 4, 6, 8] const assignee = 'Chen Rosamund' const status = 'In Progress' const name = getIssueName() - try { - await page.evaluate(() => { - localStorage.setItem('#platform.notification.timeout', '5000') - }) - await createIssue(page, { name, assignee, status }) - await page.waitForSelector(`text="${name}"`) - await page.waitForSelector('text="View issue"') - await page.click('text="View issue"') - } finally { - await page.evaluate(() => { - localStorage.setItem('#platform.notification.timeout', '0') - }) - } - + await issuesPage.createAndOpenIssue(name, assignee, status) // await page.click('.close-button > .antiButton') - // We need to fait for indexer to complete indexing. await fillSearch(page, name) - const issuesDetailsPage = new IssuesDetailsPage(page) await issuesDetailsPage.waitDetailsOpened(name) - let count = 0 for (let j = 0; j < 5; j++) { const random = Math.floor(Math.random() * values.length) @@ -224,78 +124,40 @@ test.describe('Tracker tests', () => { count += time await page.click('text="Issues"') const issuesPage = new IssuesPage(page) - await issuesPage.modelSelectorAll().click() - await page.click('button:has-text("View")') - await page.click('.ordering >> nth=0') - await page.locator('button.menu-item', { hasText: 'Modified date' }).click() - await page.keyboard.press('Escape') - - await page.locator('.estimation-container').first().click() - await page.waitForSelector('text="Estimation"') - - await page.click('button:has-text("Add time report")') - await page.waitForSelector('[id="tracker\\:string\\:TimeSpendReportAdd"] >> text=Add time report') - await expect(page.locator('button:has-text("Create")')).toBeDisabled() - await page.fill('[placeholder="Spent time"]', `${time}`) - await expect(page.locator('button:has-text("Create")')).toBeEnabled() - await page.click('button:has-text("Create")') - await page.click('#card-close') - - await expect(page.locator('.estimation-container >> span').first()).toContainText(await toTime(count)) + await issuesPage.clickModelSelectorAll() + await issuesPage.clickModelSelectorAll() + await issuesPage.clickView() + await issuesPage.clickOrdering() + await issuesPage.selectModifiedDate() + await issuesPage.pressEscape() + await issuesPage.clickEstimationContainer() + await issuesPage.waitForEstimation() + await issuesPage.clickAddTimeReport() + await issuesPage.waitForTimeReportAdd() + await issuesPage.fillSpentTime(time) + await issuesPage.expectCreateEnabled() + await issuesPage.clickCreate() + await issuesPage.clickOkButton() + await issuesPage.checkEstimation(count) } }) test('create-issue-draft', async ({ page }) => { - await navigate(page) - + const issuesPage = new IssuesPage(page) const issueName = 'Draft issue' - - // Click text=Issues >> nth=1 - await page.locator('text=Issues').nth(2).click() - await expect(page).toHaveURL(/.*\/workbench\/sanity-ws\/tracker\/tracker%3Aproject%3ADefaultProject\/issues/) - await expect(page.locator('#new-issue')).toHaveText('New issue') - // Click button:has-text("New issue") - await page.locator('#new-issue').click() - - // Click [placeholder="Issue title"] - await page.locator('#issue-name').click() - // Fill [placeholder="Issue title"] - await page.locator('#issue-name >> input').fill(issueName) - await expect(page.locator('#new-issue')).toHaveText('Resume draft') - - await page.locator('#issue-description').click() - await page.locator('#issue-description >> [contenteditable]').fill(issueName) - - // Click button:has-text("Backlog") - await page.locator('#status-editor').click() - // Click button:has-text("Todo") - await page.locator('button:has-text("Todo")').click() - - // Click button:has-text("No priority") - await page.locator('#priority-editor').click() - // Click button:has-text("Urgent") - await page.locator('button:has-text("Urgent")').click() - // Click button:has-text("Assignee") - await page.locator('#assignee-editor').click() - // Click button:has-text("Appleseed John") - await page.locator('button:has-text("Appleseed John")').click() - // Click button:has-text("0d") - await page.locator('#estimation-editor').click() - // Click [placeholder="Type text\.\.\."] - await page.locator('[placeholder="Type text\\.\\.\\."]').click() - // Fill [placeholder="Type text\.\.\."] - await page.locator('[placeholder="Type text\\.\\.\\."]').fill('1') - await page.locator('.ml-2 > .antiButton').click() - - // Click button:has-text("No due date") - await page.locator('button:has-text("Due date")').click() - // Click text=24 >> nth=0 - await page.locator('.date-popup-container div.day >> text=24').first().click() - - await page.keyboard.press('Escape') - await page.keyboard.press('Escape') - - await page.locator('#new-issue').click() + await navigate(page) + await issuesPage.clickIssuesIndex(2) + await issuesPage.clickNewIssue() + await issuesPage.clickAndFillIssueName(issueName) + await issuesPage.clickAndFillIssueDescription(issueName) + await issuesPage.selectStatus() + await issuesPage.selectPriority() + await issuesPage.clickAssignee() + await issuesPage.setEstimation() + await issuesPage.inputTextPlaceholderFill('1') + await issuesPage.setDueDate('24') + await issuesPage.pressEscapeTwice() + await issuesPage.clickOnNewIssue() await checkIssueDraft(page, { name: issueName, description: issueName, diff --git a/tests/sanity/tests/tracker/tracker.utils.ts b/tests/sanity/tests/tracker/tracker.utils.ts index e7e2ecc07b..f2260bc317 100644 --- a/tests/sanity/tests/tracker/tracker.utils.ts +++ b/tests/sanity/tests/tracker/tracker.utils.ts @@ -1,5 +1,6 @@ import { expect, Page } from '@playwright/test' -import { PlatformURI } from '../utils' +import { generateId, PlatformURI } from '../utils' +import { TrackerNavigationMenuPage } from '../model/tracker/tracker-navigation-menu-page' export interface IssueProps { name: string @@ -238,3 +239,29 @@ export async function toTime (value: number): Promise { ...(minutes > 0 ? [`${minutes}m`] : []) ].join(' ') } +export const getIssueName = (postfix: string = generateId()): string => `issue-${postfix}` +export async function performPanelTest (page: Page, statuses: string[], panel: string, mode: string): Promise { + const locator = page.locator('.list-container') + const excluded = DEFAULT_STATUSES.filter((status) => !statuses.includes(status)) + await new TrackerNavigationMenuPage(page).openIssuesForProject('Default') + await page.locator(`.ac-header .overflow-label:has-text("${mode}")`).click() + await page.click(ViewletSelectors.Table) + for (const s of statuses) { + await expect(locator).toContainText(s) + } + if (excluded.length > 0) { + await expect(locator).not.toContainText(excluded) + } + await page.click(ViewletSelectors.Board) + + if (excluded.length > 0) { + await expect(locator).not.toContainText(excluded) + } + for (const status of statuses) { + await expect( + page.locator('.panel-container', { + has: page.locator(`.header:has-text("${status}")`) + }) + ).toContainText(getIssueName(status), { timeout: 15000 }) + } +} diff --git a/tests/sanity/tests/workspace/create.spec.ts b/tests/sanity/tests/workspace/create.spec.ts index 3114767dc5..4760555390 100644 --- a/tests/sanity/tests/workspace/create.spec.ts +++ b/tests/sanity/tests/workspace/create.spec.ts @@ -75,7 +75,7 @@ test.describe('Workspace tests', () => { await trackerNavigationMenuPage.openIssuesForProject('Default') const issuesPage = new IssuesPage(page) - await issuesPage.modelSelectorAll().click() + await issuesPage.clickModelSelectorAll() await issuesPage.createNewIssue(newIssue) await issuesPage.searchIssueByName(newIssue.title) await issuesPage.openIssueByName(newIssue.title)