mirror of
https://github.com/hcengineering/platform.git
synced 2025-05-28 10:57:36 +00:00
Refactor tracker tests (#5494)
Signed-off-by: Jasmin <jasmin@hardcoreeng.com>
This commit is contained in:
parent
1c3edbc395
commit
aca8b9e2e5
@ -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')
|
||||
|
@ -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()
|
||||
|
@ -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()
|
||||
}
|
||||
}
|
||||
|
@ -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')
|
||||
|
@ -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)
|
||||
|
@ -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)
|
||||
})
|
||||
})
|
||||
|
@ -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)
|
||||
|
@ -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
|
||||
})
|
||||
|
@ -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')
|
||||
})
|
||||
|
@ -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)
|
||||
|
@ -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()
|
||||
})
|
||||
|
@ -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]
|
||||
|
@ -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)
|
||||
})
|
||||
})
|
||||
|
@ -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)
|
||||
})
|
||||
})
|
||||
|
@ -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,
|
||||
|
@ -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)
|
||||
|
@ -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)
|
||||
|
@ -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)
|
||||
})
|
||||
})
|
||||
|
@ -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,
|
||||
|
@ -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 })
|
||||
}
|
||||
}
|
||||
|
@ -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)
|
||||
|
Loading…
Reference in New Issue
Block a user