Refactor tracker tests (#5494)

Signed-off-by: Jasmin <jasmin@hardcoreeng.com>
This commit is contained in:
JasminMus 2024-05-03 11:40:29 +02:00 committed by GitHub
parent 1c3edbc395
commit aca8b9e2e5
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
21 changed files with 656 additions and 562 deletions

View File

@ -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')

View File

@ -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<void> {
await this.page.click(`text="${panel}"`)
await this.page.click(viewletSelector)
}
async openViewOptionsAndSelectAssignee (): Promise<void> {
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<void> {
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<void> {
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<void> {
await this.trackerApplicationButton().click()
}
async createComponent (componentName: string): Promise<void> {
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<void> {
await this.componentName(componentName).click()
}
async createIssueForComponent (componentName: string): Promise<void> {
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<void> {
await this.buttonFilter().click()
await this.selectPopupMenu(filter).click()

View File

@ -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<void> => {
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<void> {
await this.page.click('text="Issues"')
await this.page.keyboard.press('Escape')
}
async createAndOpenIssue (name: string, assignee: string, status: string): Promise<void> {
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<void> {
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<void> {
// Assuming toTime is defined elsewhere
await expect(this.page.locator('#ReportedTimeEditor')).toContainText(await toTime(time))
}
// ACTIONS
async clickOnReportedTimeEditor (): Promise<void> {
await this.reportedTimeEditor().click()
}
async clickButtonCreateNewIssue (): Promise<void> {
await this.buttonCreateNewIssue().click()
}
async clickButtonCreateIssue (): Promise<void> {
await this.buttonCreateIssue().click()
}
async clickOnIssues (): Promise<void> {
await this.issues().click()
}
async clickOnSubIssues (): Promise<void> {
await this.subIssues().click()
}
async clickOnNewIssue (): Promise<void> {
await this.newIssue().click()
}
async navigateToMyIssues (): Promise<void> {
await this.myIssuesButton().click()
}
async clickReportedTimeEditor (): Promise<void> {
await this.reportedTimeEditor().click()
}
async waitForTimeSpentReports (): Promise<void> {
await this.timeSpentReports().waitFor()
}
async clickAddReportButton (): Promise<void> {
await this.addReportButton().click()
}
async waitForAddTimeReport (): Promise<void> {
await this.addTimeReport().waitFor()
}
async fillSpentTime (time: number): Promise<void> {
await this.spentTimeInput().fill(`${time}`)
}
async checkCreateButtonEnabled (): Promise<void> {
await expect(this.createButton()).toBeEnabled()
}
async clickCreateButton (): Promise<void> {
await this.createButton().click()
}
async clickCloseButton (): Promise<void> {
await this.closeButton().click()
}
async clickIssuesIndex (index: number): Promise<void> {
await this.issuesButton().nth(index).click()
}
async clickIssues (): Promise<void> {
await this.issuesButton().click()
}
async clickView (): Promise<void> {
await this.viewButton().click()
}
async clickOrdering (): Promise<void> {
await this.orderingButton().click()
}
async selectModifiedDate (): Promise<void> {
await this.modifiedDateMenuItem().click()
}
async pressEscape (): Promise<void> {
await this.page.keyboard.press('Escape')
}
async clickEstimationContainer (): Promise<void> {
await this.estimationContainer().click()
}
async waitForEstimation (): Promise<void> {
await this.page.waitForSelector('text="Estimation"')
}
async clickAddTimeReport (): Promise<void> {
await this.addTimeReportButton().click()
}
async waitForTimeReportAdd (): Promise<void> {
await this.timeReportCreationArea().waitFor()
}
async expectCreateEnabled (): Promise<void> {
await expect(this.createButton()).toBeEnabled()
}
async clickCreate (): Promise<void> {
await this.createButton().click()
}
async clickOkButton (): Promise<void> {
await this.okButton().click()
}
async checkEstimation (count: number): Promise<void> {
// Assuming toTime is defined elsewhere
await expect(this.estimationSpan()).toContainText(await toTime(count))
}
async clickNewIssue (): Promise<void> {
await this.newIssueButton().click()
}
async clickAndFillIssueName (issueName: string): Promise<void> {
await this.issueNameInput().click()
await this.issueNameInput().fill(issueName)
}
async clickAndFillIssueDescription (issueDescription: string): Promise<void> {
await this.issueDescriptionInput().click()
await this.issueDescriptionInput().fill(issueDescription)
}
async selectStatus (): Promise<void> {
await this.statusEditor().click()
await this.todoButton().click()
}
async selectPriority (): Promise<void> {
await this.priorityEditor().click()
await this.urgentButton().click()
}
async clickAssignee (): Promise<void> {
await this.assigneeEditor().click()
await this.appleseedJohnButton().click()
}
async inputTextPlaceholderFill (text: string): Promise<void> {
await this.inputTextPlaceholder().fill(text)
await this.confirmInput().click()
}
async setEstimation (): Promise<void> {
await this.estimationEditor().click()
}
async setDueDate (day: string): Promise<void> {
await this.dueDateButton().click()
await this.specificDay(day).click()
}
async pressEscapeTwice (): Promise<void> {
await this.page.keyboard.press('Escape')
await this.page.keyboard.press('Escape')
}
async checkIssuePresenceInTabs (issueName: string, presence: boolean): Promise<void> {
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<void> {
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<void> {
@ -117,7 +402,7 @@ export class IssuesPage extends CommonTrackerPage {
async createNewIssue (data: NewIssue, closeNotification: boolean = false): Promise<void> {
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<void> {
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<void> {
for await (const category of iterateLocator(this.buttonCollapsedCategories())) {
await category.click()
}
}
async checkTotalFooter (expectedTotal: number): Promise<void> {
await expect(this.totalFooter()).toContainText(`Total: ${expectedTotal}`)
}
async checkCreateButtonDisabled (): Promise<void> {
await expect(this.createButton()).toBeDisabled()
}
}

View File

@ -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')

View File

@ -5,7 +5,7 @@ import { NewIssue } from '../model/tracker/types'
export async function prepareNewIssueStep (page: Page, issue: NewIssue): Promise<string> {
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)

View File

@ -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)
})
})

View File

@ -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)

View File

@ -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
})

View File

@ -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')
})

View File

@ -84,7 +84,7 @@ async function initIssues (prefix: string, page: Page): Promise<IssueProps[]> {
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)

View File

@ -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()
})

View File

@ -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]

View File

@ -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)
})
})

View File

@ -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)
})
})

View File

@ -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,

View File

@ -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)

View File

@ -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)

View File

@ -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)
})
})

View File

@ -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<void> {
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,

View File

@ -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<string> {
...(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<void> {
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 })
}
}

View File

@ -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)