mirror of
https://github.com/hcengineering/platform.git
synced 2025-04-23 16:56:07 +00:00
Updated planning UI tests (#6211)
Signed-off-by: Alexander Platov <alexander.platov@hardcoreeng.com> Co-authored-by: Alexey Zinoviev <alexey.zinoviev@xored.com>
This commit is contained in:
parent
0d18674027
commit
486ef0dc03
@ -3,7 +3,6 @@
|
|||||||
"temp/**",
|
"temp/**",
|
||||||
".build/**",
|
".build/**",
|
||||||
"coverage/**",
|
"coverage/**",
|
||||||
"**/*.svelte",
|
|
||||||
".build/**",
|
".build/**",
|
||||||
".validate/**",
|
".validate/**",
|
||||||
".format/**",
|
".format/**",
|
||||||
|
@ -190,6 +190,7 @@
|
|||||||
{size}
|
{size}
|
||||||
icon={IconAdd}
|
icon={IconAdd}
|
||||||
showTooltip={{ label: create.label }}
|
showTooltip={{ label: create.label }}
|
||||||
|
dataId={'btnAdd'}
|
||||||
on:click={onCreate}
|
on:click={onCreate}
|
||||||
disabled={readonly || loading}
|
disabled={readonly || loading}
|
||||||
/>
|
/>
|
||||||
|
@ -146,12 +146,15 @@
|
|||||||
kind={'ghost'}
|
kind={'ghost'}
|
||||||
size={'large'}
|
size={'large'}
|
||||||
icon={show ? IconView : IconViewHide}
|
icon={show ? IconView : IconViewHide}
|
||||||
|
dataId={`btn${show ? 'Collapse' : 'Expand'}`}
|
||||||
on:click={() => {
|
on:click={() => {
|
||||||
show = !show
|
show = !show
|
||||||
}}
|
}}
|
||||||
/>
|
/>
|
||||||
{/if}
|
{/if}
|
||||||
{#if !hideAdd}<Button kind={'ghost'} size={'large'} icon={IconAdd} on:click={createTagElementPopup} />{/if}
|
{#if !hideAdd}
|
||||||
|
<Button kind={'ghost'} size={'large'} icon={IconAdd} dataId={'btnAdd'} on:click={createTagElementPopup} />
|
||||||
|
{/if}
|
||||||
</div>
|
</div>
|
||||||
<div class="scroll">
|
<div class="scroll">
|
||||||
<div class="box">
|
<div class="box">
|
||||||
|
@ -58,6 +58,7 @@
|
|||||||
icon={IconChevronLeft}
|
icon={IconChevronLeft}
|
||||||
kind={'secondary'}
|
kind={'secondary'}
|
||||||
size={'small'}
|
size={'small'}
|
||||||
|
dataId={'btnPrev'}
|
||||||
on:click={() => {
|
on:click={() => {
|
||||||
inc(-1)
|
inc(-1)
|
||||||
}}
|
}}
|
||||||
@ -69,6 +70,7 @@
|
|||||||
type={!doubleRow ? 'type-button' : 'type-button-icon'}
|
type={!doubleRow ? 'type-button' : 'type-button-icon'}
|
||||||
kind={'secondary'}
|
kind={'secondary'}
|
||||||
size={'small'}
|
size={'small'}
|
||||||
|
dataId={'btnToday'}
|
||||||
inheritFont
|
inheritFont
|
||||||
hasMenu
|
hasMenu
|
||||||
disabled={isToday}
|
disabled={isToday}
|
||||||
@ -80,6 +82,7 @@
|
|||||||
icon={IconChevronRight}
|
icon={IconChevronRight}
|
||||||
kind={'secondary'}
|
kind={'secondary'}
|
||||||
size={'small'}
|
size={'small'}
|
||||||
|
dataId={'btnNext'}
|
||||||
on:click={() => {
|
on:click={() => {
|
||||||
inc(1)
|
inc(1)
|
||||||
}}
|
}}
|
||||||
|
@ -118,6 +118,7 @@
|
|||||||
</button>
|
</button>
|
||||||
<button
|
<button
|
||||||
class="filter-button hoverable lower"
|
class="filter-button hoverable lower"
|
||||||
|
data-id="btnCondition"
|
||||||
on:click={(e) => {
|
on:click={(e) => {
|
||||||
clickHandler(e, false)
|
clickHandler(e, false)
|
||||||
}}
|
}}
|
||||||
|
@ -1,4 +1,5 @@
|
|||||||
import { type Locator, type Page, expect } from '@playwright/test'
|
import { type Locator, type Page, expect } from '@playwright/test'
|
||||||
|
import { DateDivided } from './types'
|
||||||
|
|
||||||
export class CommonPage {
|
export class CommonPage {
|
||||||
readonly page: Page
|
readonly page: Page
|
||||||
@ -11,9 +12,9 @@ export class CommonPage {
|
|||||||
selectPopupInputSearch = (): Locator => this.page.locator('div.popup input.search')
|
selectPopupInputSearch = (): Locator => this.page.locator('div.popup input.search')
|
||||||
selectPopupListItem = (name: string): Locator => this.page.locator('div.selectPopup div.list-item', { hasText: name })
|
selectPopupListItem = (name: string): Locator => this.page.locator('div.selectPopup div.list-item', { hasText: name })
|
||||||
selectPopupListItemFirst = (): Locator => this.page.locator('div.selectPopup div.list-item')
|
selectPopupListItemFirst = (): Locator => this.page.locator('div.selectPopup div.list-item')
|
||||||
selectPopupHeaderButtonLast = (): Locator => this.page.locator('div.selectPopup div.header button:last-child')
|
selectPopupAddButton = (): Locator => this.page.locator('div.selectPopup button[data-id="btnAdd"]')
|
||||||
selectPopupButton = (): Locator => this.page.locator('div.selectPopup button')
|
selectPopupButton = (): Locator => this.page.locator('div.selectPopup button')
|
||||||
selectPopupHeaderButtonFirst = (): Locator => this.page.locator('div.selectPopup div.header button:nth-of-type(1)')
|
selectPopupExpandButton = (): Locator => this.page.locator('div.selectPopup button[data-id="btnExpand"]')
|
||||||
popupSpanLabel = (point: string): Locator =>
|
popupSpanLabel = (point: string): Locator =>
|
||||||
this.page.locator('div[class$="opup"] span[class*="label"]', { hasText: point })
|
this.page.locator('div[class$="opup"] span[class*="label"]', { hasText: point })
|
||||||
|
|
||||||
@ -46,6 +47,46 @@ export class CommonPage {
|
|||||||
menuPopupItemButton = (itemText: string): Locator =>
|
menuPopupItemButton = (itemText: string): Locator =>
|
||||||
this.page.locator('div.selectPopup button.menu-item', { hasText: itemText })
|
this.page.locator('div.selectPopup button.menu-item', { hasText: itemText })
|
||||||
|
|
||||||
|
buttonFilter = (): Locator => this.page.getByRole('button', { name: 'Filter' })
|
||||||
|
inputFilterTitle = (): Locator => this.page.locator('div.selectPopup input[placeholder="Title"]')
|
||||||
|
inputSearch = (): Locator => this.page.locator('div.selectPopup input[placeholder="Search..."]')
|
||||||
|
buttonFilterApply = (): Locator => this.page.locator('div.selectPopup button[type="button"]', { hasText: 'Apply' })
|
||||||
|
buttonClearFilters = (): Locator => this.page.locator('button > span', { hasText: 'Clear filters' })
|
||||||
|
filterButton = (index: number): Locator => this.page.locator(`div.filter-section button:nth-child(${index})`)
|
||||||
|
selectFilterSection = (label: string): Locator =>
|
||||||
|
this.page.locator('div.filterbar-container div.filter-section', { hasText: label })
|
||||||
|
|
||||||
|
selectPopupMenu = (filter: string): Locator =>
|
||||||
|
this.page.locator('div.selectPopup [class*="menu"]', { hasText: filter })
|
||||||
|
|
||||||
|
calendarDay = (daySelector: string): Locator => this.page.locator(`div.popup div.calendar button.day${daySelector}`)
|
||||||
|
|
||||||
|
linesFromTable = (text: string = ''): Locator =>
|
||||||
|
this.page.locator('.hulyComponent table tbody tr').filter({ hasText: text })
|
||||||
|
|
||||||
|
linesFromList = (text: string = ''): Locator =>
|
||||||
|
this.page.locator('.hulyComponent .list-container div.row').filter({ hasText: text })
|
||||||
|
|
||||||
|
firstInputFirstDigit = (): Locator =>
|
||||||
|
this.page.locator('div.date-popup-container div.input:first-child span.digit:first-child')
|
||||||
|
|
||||||
|
firstInputThirdDigit = (): Locator =>
|
||||||
|
this.page.locator('div.date-popup-container div.input:first-child span.digit:nth-child(3)')
|
||||||
|
|
||||||
|
firstInputFifthDigit = (): Locator =>
|
||||||
|
this.page.locator('div.date-popup-container div.input:first-child span.digit:nth-child(5)')
|
||||||
|
|
||||||
|
lastInputFirstDigit = (): Locator =>
|
||||||
|
this.page.locator('div.date-popup-container div.input:last-child span.digit:first-child')
|
||||||
|
|
||||||
|
lastInputThirdDigit = (): Locator =>
|
||||||
|
this.page.locator('div.date-popup-container div.input:last-child span.digit:nth-child(3)')
|
||||||
|
|
||||||
|
lastInputFifthDigit = (): Locator =>
|
||||||
|
this.page.locator('div.date-popup-container div.input:last-child span.digit:nth-child(5)')
|
||||||
|
|
||||||
|
submitButton = (): Locator => this.page.locator('div.date-popup-container button[type="submit"]')
|
||||||
|
|
||||||
async selectMenuItem (page: Page, name: string, fullWordFilter: boolean = false): Promise<void> {
|
async selectMenuItem (page: Page, name: string, fullWordFilter: boolean = false): Promise<void> {
|
||||||
if (name !== 'first') {
|
if (name !== 'first') {
|
||||||
const filterText = fullWordFilter ? name : name.split(' ')[0]
|
const filterText = fullWordFilter ? name : name.split(' ')[0]
|
||||||
@ -57,11 +98,11 @@ export class CommonPage {
|
|||||||
}
|
}
|
||||||
|
|
||||||
async pressCreateButtonSelectPopup (page: Page): Promise<void> {
|
async pressCreateButtonSelectPopup (page: Page): Promise<void> {
|
||||||
await this.selectPopupHeaderButtonLast().click()
|
await this.selectPopupAddButton().click()
|
||||||
}
|
}
|
||||||
|
|
||||||
async pressShowAllButtonSelectPopup (page: Page): Promise<void> {
|
async pressShowAllButtonSelectPopup (page: Page): Promise<void> {
|
||||||
await this.selectPopupHeaderButtonFirst().click()
|
await this.selectPopupExpandButton().click()
|
||||||
}
|
}
|
||||||
|
|
||||||
async selectFromDropdown (page: Page, point: string): Promise<void> {
|
async selectFromDropdown (page: Page, point: string): Promise<void> {
|
||||||
@ -159,4 +200,102 @@ export class CommonPage {
|
|||||||
async checkPopupItem (itemText: string): Promise<void> {
|
async checkPopupItem (itemText: string): Promise<void> {
|
||||||
await expect(this.menuPopupItemButton(itemText)).toBeVisible()
|
await expect(this.menuPopupItemButton(itemText)).toBeVisible()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
async selectFilter (filter: string, filterSecondLevel?: string): Promise<void> {
|
||||||
|
await this.buttonFilter().click()
|
||||||
|
await this.selectPopupMenu(filter).click()
|
||||||
|
|
||||||
|
if (filterSecondLevel !== null && typeof filterSecondLevel === 'string') {
|
||||||
|
switch (filter) {
|
||||||
|
case 'Title':
|
||||||
|
await this.inputFilterTitle().fill(filterSecondLevel)
|
||||||
|
await this.buttonFilterApply().click()
|
||||||
|
break
|
||||||
|
case 'Labels':
|
||||||
|
await this.selectFromDropdown(this.page, filterSecondLevel)
|
||||||
|
break
|
||||||
|
case 'Skills':
|
||||||
|
await this.inputSearch().fill(filterSecondLevel)
|
||||||
|
await this.selectFromDropdown(this.page, filterSecondLevel)
|
||||||
|
await this.page.keyboard.press('Escape')
|
||||||
|
break
|
||||||
|
default:
|
||||||
|
await this.selectPopupMenu(filterSecondLevel).click()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
async filterOppositeCondition (filter: string, conditionBefore: string, conditionAfter: string): Promise<void> {
|
||||||
|
const filterSection = this.selectFilterSection(filter)
|
||||||
|
await filterSection.locator('button', { hasText: conditionBefore }).isVisible()
|
||||||
|
await filterSection.locator('button[data-id="btnCondition"]').click()
|
||||||
|
await this.page.locator('div.selectPopup button.menu-item', { hasText: conditionAfter }).click()
|
||||||
|
}
|
||||||
|
|
||||||
|
async checkFilter (filter: string, filterSecondLevel?: string, filterThirdLevel?: string): Promise<void> {
|
||||||
|
await expect(this.filterButton(1)).toHaveText(filter)
|
||||||
|
if (filterSecondLevel !== undefined) {
|
||||||
|
await expect(this.filterButton(2)).toContainText(filterSecondLevel)
|
||||||
|
}
|
||||||
|
if (filterThirdLevel !== undefined) {
|
||||||
|
await expect(this.filterButton(3)).toContainText(filterThirdLevel)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
async updateFilterDimension (
|
||||||
|
filterSecondLevel: string,
|
||||||
|
dateStart?: string,
|
||||||
|
needToOpenCalendar: boolean = false
|
||||||
|
): Promise<void> {
|
||||||
|
await this.filterButton(2).click()
|
||||||
|
await this.selectPopupMenu(filterSecondLevel).click()
|
||||||
|
|
||||||
|
if (dateStart !== undefined) {
|
||||||
|
if (needToOpenCalendar) {
|
||||||
|
await this.filterButton(3).click()
|
||||||
|
}
|
||||||
|
await this.calendarDay(dateStart === 'Today' ? '.today' : `:has-text("${dateStart}")`).click()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
async fillBetweenDate (dateStart: DateDivided, dateEnd: DateDivided): Promise<void> {
|
||||||
|
// dateStart - day
|
||||||
|
await this.firstInputFirstDigit().click({ delay: 100, position: { x: 1, y: 1 } })
|
||||||
|
await this.firstInputFirstDigit().pressSequentially(dateStart.day)
|
||||||
|
|
||||||
|
// dateStart - month
|
||||||
|
await this.firstInputThirdDigit().click({ delay: 100, position: { x: 1, y: 1 } })
|
||||||
|
await this.firstInputThirdDigit().pressSequentially(dateStart.month)
|
||||||
|
|
||||||
|
// dateStart - year
|
||||||
|
await this.firstInputFifthDigit().click({ delay: 100, position: { x: 1, y: 1 } })
|
||||||
|
await this.firstInputFifthDigit().pressSequentially(dateStart.year)
|
||||||
|
|
||||||
|
// dateEnd - day
|
||||||
|
await this.lastInputFirstDigit().click({ delay: 100, position: { x: 1, y: 1 } })
|
||||||
|
await this.lastInputFirstDigit().pressSequentially(dateEnd.day)
|
||||||
|
|
||||||
|
// dateEnd - month
|
||||||
|
await this.lastInputThirdDigit().click({ delay: 100, position: { x: 1, y: 1 } })
|
||||||
|
await this.lastInputThirdDigit().pressSequentially(dateEnd.month)
|
||||||
|
|
||||||
|
// dateEnd - year
|
||||||
|
await this.lastInputFifthDigit().click({ delay: 100, position: { x: 1, y: 1 } })
|
||||||
|
await this.lastInputFifthDigit().pressSequentially(dateEnd.year)
|
||||||
|
|
||||||
|
// Submit
|
||||||
|
await this.submitButton().click({ delay: 100 })
|
||||||
|
}
|
||||||
|
|
||||||
|
async checkRowsInTableExist (text: string, count: number = 1): Promise<void> {
|
||||||
|
await expect(this.linesFromTable(text)).toHaveCount(count)
|
||||||
|
}
|
||||||
|
|
||||||
|
async checkRowsInTableNotExist (text: string): Promise<void> {
|
||||||
|
await expect(this.linesFromTable(text)).toHaveCount(0)
|
||||||
|
}
|
||||||
|
|
||||||
|
async openRowInTableByText (text: string): Promise<void> {
|
||||||
|
await this.linesFromTable(text).locator('a', { hasText: text }).click()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -15,6 +15,8 @@ export class LeftSideMenuPage extends CommonPage {
|
|||||||
buttonRecruiting = (): Locator => this.page.locator('[id="app-recruit\\:string\\:RecruitApplication"]')
|
buttonRecruiting = (): Locator => this.page.locator('[id="app-recruit\\:string\\:RecruitApplication"]')
|
||||||
buttonNotification = (): Locator => this.page.locator('button[id$="Inbox"]')
|
buttonNotification = (): Locator => this.page.locator('button[id$="Inbox"]')
|
||||||
buttonDocuments = (): Locator => this.page.locator('button[id$="document:string:DocumentApplication"]')
|
buttonDocuments = (): Locator => this.page.locator('button[id$="document:string:DocumentApplication"]')
|
||||||
|
buttonPlanner = (): Locator => this.page.locator('button[id$="app-time:string:Planner"]')
|
||||||
|
buttonTeam = (): Locator => this.page.locator('button[id$="app-time:string:Team"]')
|
||||||
profileButton = (): Locator => this.page.locator('#profile-button')
|
profileButton = (): Locator => this.page.locator('#profile-button')
|
||||||
inviteToWorkspaceButton = (): Locator => this.page.locator('button:has-text("Invite to workspace")')
|
inviteToWorkspaceButton = (): Locator => this.page.locator('button:has-text("Invite to workspace")')
|
||||||
getInviteLinkButton = (): Locator => this.page.locator('button:has-text("Get invite link")')
|
getInviteLinkButton = (): Locator => this.page.locator('button:has-text("Get invite link")')
|
||||||
@ -53,6 +55,14 @@ export class LeftSideMenuPage extends CommonPage {
|
|||||||
await this.buttonDocuments().click()
|
await this.buttonDocuments().click()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
async clickPlanner (): Promise<void> {
|
||||||
|
await this.buttonPlanner().click()
|
||||||
|
}
|
||||||
|
|
||||||
|
async clickTeam (): Promise<void> {
|
||||||
|
await this.buttonTeam().click()
|
||||||
|
}
|
||||||
|
|
||||||
async clickRecruiting (): Promise<void> {
|
async clickRecruiting (): Promise<void> {
|
||||||
await this.buttonRecruiting().click()
|
await this.buttonRecruiting().click()
|
||||||
}
|
}
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
import { type Locator, type Page } from '@playwright/test'
|
import { type Locator, type Page, expect } from '@playwright/test'
|
||||||
|
|
||||||
export class PlanningNavigationMenuPage {
|
export class PlanningNavigationMenuPage {
|
||||||
readonly page: Page
|
readonly page: Page
|
||||||
@ -20,6 +20,9 @@ export class PlanningNavigationMenuPage {
|
|||||||
readonly buttonToDoPlanned = (): Locator =>
|
readonly buttonToDoPlanned = (): Locator =>
|
||||||
this.page.locator('button[class*="hulyNavItem-container"] span[class*="hulyNavItem-label"]:text-is("Planned")')
|
this.page.locator('button[class*="hulyNavItem-container"] span[class*="hulyNavItem-label"]:text-is("Planned")')
|
||||||
|
|
||||||
|
readonly accordionContainerToDoUnplanned = (): Locator =>
|
||||||
|
this.page.locator('div.toDos-container div.hulyAccordionItem-container', { hasText: 'Unplanned' })
|
||||||
|
|
||||||
async clickOnButtonToDoAll (): Promise<void> {
|
async clickOnButtonToDoAll (): Promise<void> {
|
||||||
await this.buttonToDoAll().click()
|
await this.buttonToDoAll().click()
|
||||||
}
|
}
|
||||||
@ -31,4 +34,13 @@ export class PlanningNavigationMenuPage {
|
|||||||
async clickOnButtonToDoPlanned (): Promise<void> {
|
async clickOnButtonToDoPlanned (): Promise<void> {
|
||||||
await this.buttonToDoPlanned().click()
|
await this.buttonToDoPlanned().click()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
async compareCountersUnplannedToDos (): Promise<void> {
|
||||||
|
const navCount = parseInt(
|
||||||
|
await this.buttonToDoUnplanned().locator('xpath=..').locator('span.hulyNavItem-count').innerText(),
|
||||||
|
10
|
||||||
|
)
|
||||||
|
const accCount = await this.accordionContainerToDoUnplanned().locator('button.hulyToDoLine-container').count()
|
||||||
|
expect(accCount).toBe(navCount)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -30,6 +30,9 @@ export class PlanningPage extends CalendarPage {
|
|||||||
readonly buttonPopupVisibleToEveryone = (): Locator =>
|
readonly buttonPopupVisibleToEveryone = (): Locator =>
|
||||||
this.popup().getByRole('button', { name: 'Visible to everyone' })
|
this.popup().getByRole('button', { name: 'Visible to everyone' })
|
||||||
|
|
||||||
|
readonly buttonPopupOnlyVisibleToYou = (): Locator =>
|
||||||
|
this.popup().getByRole('button', { name: 'Only visible to you' })
|
||||||
|
|
||||||
readonly buttonPopupSave = (): Locator => this.popup().getByRole('button', { name: 'Save' })
|
readonly buttonPopupSave = (): Locator => this.popup().getByRole('button', { name: 'Save' })
|
||||||
readonly buttonPopupCreateAddLabel = (): Locator =>
|
readonly buttonPopupCreateAddLabel = (): Locator =>
|
||||||
this.popup().locator('button.antiButton', { hasText: 'Add label' })
|
this.popup().locator('button.antiButton', { hasText: 'Add label' })
|
||||||
|
@ -10,6 +10,7 @@ export class TalentDetailsPage extends CommonRecruitingPage {
|
|||||||
this.page = page
|
this.page = page
|
||||||
}
|
}
|
||||||
|
|
||||||
|
readonly buttonClosePanel = (): Locator => this.page.locator('#btnPClose')
|
||||||
readonly buttonAddSkill = (): Locator => this.page.locator('button#add-tag')
|
readonly buttonAddSkill = (): Locator => this.page.locator('button#add-tag')
|
||||||
readonly textTagItem = (): Locator => this.page.locator('div.tag-item')
|
readonly textTagItem = (): Locator => this.page.locator('div.tag-item')
|
||||||
readonly inputLocation = (): Locator => this.page.locator('div.location input')
|
readonly inputLocation = (): Locator => this.page.locator('div.location input')
|
||||||
|
26
tests/sanity/tests/model/team-page.ts
Normal file
26
tests/sanity/tests/model/team-page.ts
Normal file
@ -0,0 +1,26 @@
|
|||||||
|
import { expect, Locator, Page } from '@playwright/test'
|
||||||
|
import { CommonPage } from './common-page'
|
||||||
|
|
||||||
|
export class TeamPage extends CommonPage {
|
||||||
|
readonly page: Page
|
||||||
|
|
||||||
|
constructor (page: Page) {
|
||||||
|
super(page)
|
||||||
|
this.page = page
|
||||||
|
}
|
||||||
|
|
||||||
|
appHeader = (): Locator => this.page.locator('div.hulyNavPanel-header', { hasText: 'Team Planner' })
|
||||||
|
buttonTeam = (name: string): Locator =>
|
||||||
|
this.page.locator('div#navGroup-projects-planning button.hulyNavItem-container', { hasText: name })
|
||||||
|
|
||||||
|
buttonNextDay = (): Locator =>
|
||||||
|
this.page.locator('div.hulyComponent div.hulyHeader-container .actions button[data-id="btnNext"]')
|
||||||
|
|
||||||
|
async checkTeamPageIsOpened (): Promise<void> {
|
||||||
|
await expect(this.appHeader()).toBeVisible()
|
||||||
|
}
|
||||||
|
|
||||||
|
async selectTeam (name: string): Promise<void> {
|
||||||
|
await this.buttonTeam(name).click()
|
||||||
|
}
|
||||||
|
}
|
@ -1,6 +1,5 @@
|
|||||||
import { expect, Locator, Page } from '@playwright/test'
|
import { expect, Locator, Page } from '@playwright/test'
|
||||||
import { CalendarPage } from '../calendar-page'
|
import { CalendarPage } from '../calendar-page'
|
||||||
import { DateDivided } from './types'
|
|
||||||
import path from 'path'
|
import path from 'path'
|
||||||
|
|
||||||
export class CommonTrackerPage extends CalendarPage {
|
export class CommonTrackerPage extends CalendarPage {
|
||||||
@ -36,16 +35,9 @@ export class CommonTrackerPage extends CalendarPage {
|
|||||||
this.page.locator('div[slot="header"] div.item div.name', { hasText: fileName })
|
this.page.locator('div[slot="header"] div.item div.name', { hasText: fileName })
|
||||||
|
|
||||||
commentImg = (): Locator => this.page.locator('div.activityMessage div.content img')
|
commentImg = (): Locator => this.page.locator('div.activityMessage div.content img')
|
||||||
inputFilterTitle = (): Locator => this.page.locator('div.selectPopup input[placeholder="Title"]')
|
|
||||||
buttonFilterApply = (): Locator => this.page.locator('div.selectPopup button[type="button"]', { hasText: 'Apply' })
|
|
||||||
buttonClearFilters = (): Locator => this.page.locator('button > span', { hasText: 'Clear filters' })
|
|
||||||
textCategoryHeader = (): Locator =>
|
textCategoryHeader = (): Locator =>
|
||||||
this.page.locator('div.category-container > div.categoryHeader span[class*="label"]')
|
this.page.locator('div.category-container > div.categoryHeader span[class*="label"]')
|
||||||
|
|
||||||
buttonFilter = (): Locator => this.page.getByRole('button', { name: 'Filter' })
|
|
||||||
selectPopupMenu = (filter: string): Locator =>
|
|
||||||
this.page.locator('div.selectPopup [class*="menu"]', { hasText: filter })
|
|
||||||
|
|
||||||
popupCalendarButton = (dateStart: string): Locator =>
|
popupCalendarButton = (dateStart: string): Locator =>
|
||||||
this.page.locator('div.popup div.calendar button.day', { hasText: dateStart })
|
this.page.locator('div.popup div.calendar button.day', { hasText: dateStart })
|
||||||
|
|
||||||
@ -59,27 +51,6 @@ export class CommonTrackerPage extends CalendarPage {
|
|||||||
this.page.locator('div.date-popup-container div.input:first-child span.digit:nth-child(5)')
|
this.page.locator('div.date-popup-container div.input:first-child span.digit:nth-child(5)')
|
||||||
|
|
||||||
submitDatePopup = (): Locator => this.page.locator('div.date-popup-container button[type="submit"]')
|
submitDatePopup = (): Locator => this.page.locator('div.date-popup-container button[type="submit"]')
|
||||||
filterButton = (index: number): Locator => this.page.locator(`div.filter-section button:nth-child(${index})`)
|
|
||||||
calendarDay = (daySelector: string): Locator => this.page.locator(`div.popup div.calendar button.day${daySelector}`)
|
|
||||||
firstInputFirstDigit = (): Locator =>
|
|
||||||
this.page.locator('div.date-popup-container div.input:first-child span.digit:first-child')
|
|
||||||
|
|
||||||
firstInputThirdDigit = (): Locator =>
|
|
||||||
this.page.locator('div.date-popup-container div.input:first-child span.digit:nth-child(3)')
|
|
||||||
|
|
||||||
firstInputFifthDigit = (): Locator =>
|
|
||||||
this.page.locator('div.date-popup-container div.input:first-child span.digit:nth-child(5)')
|
|
||||||
|
|
||||||
lastInputFirstDigit = (): Locator =>
|
|
||||||
this.page.locator('div.date-popup-container div.input:last-child span.digit:first-child')
|
|
||||||
|
|
||||||
lastInputThirdDigit = (): Locator =>
|
|
||||||
this.page.locator('div.date-popup-container div.input:last-child span.digit:nth-child(3)')
|
|
||||||
|
|
||||||
lastInputFifthDigit = (): Locator =>
|
|
||||||
this.page.locator('div.date-popup-container div.input:last-child span.digit:nth-child(5)')
|
|
||||||
|
|
||||||
submitButton = (): Locator => this.page.locator('div.date-popup-container button[type="submit"]')
|
|
||||||
|
|
||||||
trackerApplicationButton = (): Locator => this.page.locator('[id="app-tracker\\:string\\:TrackerApplication"]')
|
trackerApplicationButton = (): Locator => this.page.locator('[id="app-tracker\\:string\\:TrackerApplication"]')
|
||||||
componentsLink = (): Locator => this.page.locator('text=Components')
|
componentsLink = (): Locator => this.page.locator('text=Components')
|
||||||
@ -101,7 +72,6 @@ export class CommonTrackerPage extends CalendarPage {
|
|||||||
header = (): Locator =>
|
header = (): Locator =>
|
||||||
this.page.locator('button.hulyBreadcrumb-container > span.hulyBreadcrumb-label', { hasText: 'Issues' })
|
this.page.locator('button.hulyBreadcrumb-container > span.hulyBreadcrumb-label', { hasText: 'Issues' })
|
||||||
|
|
||||||
filter = (): Locator => this.page.getByRole('button', { name: 'Filter' })
|
|
||||||
view = (): Locator => this.page.locator('.hulyHeader-buttonsGroup > button[data-id="btn-viewOptions"]')
|
view = (): Locator => this.page.locator('.hulyHeader-buttonsGroup > button[data-id="btn-viewOptions"]')
|
||||||
showMore = (): Locator => this.page.locator('.hulyHeader-buttonsGroup > button[data-id="btn-viewSetting"]')
|
showMore = (): Locator => this.page.locator('.hulyHeader-buttonsGroup > button[data-id="btn-viewSetting"]')
|
||||||
task1 = (): Locator => this.page.getByRole('link', { name: 'Welcome to Huly! 🌟' })
|
task1 = (): Locator => this.page.getByRole('link', { name: 'Welcome to Huly! 🌟' })
|
||||||
@ -177,80 +147,6 @@ export class CommonTrackerPage extends CalendarPage {
|
|||||||
await this.page.waitForSelector('form.antiCard', { state: 'detached' })
|
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()
|
|
||||||
|
|
||||||
if (filterSecondLevel !== null && typeof filterSecondLevel === 'string') {
|
|
||||||
switch (filter) {
|
|
||||||
case 'Title':
|
|
||||||
await this.inputFilterTitle().fill(filterSecondLevel)
|
|
||||||
await this.buttonFilterApply().click()
|
|
||||||
break
|
|
||||||
case 'Labels':
|
|
||||||
await this.selectFromDropdown(this.page, filterSecondLevel)
|
|
||||||
break
|
|
||||||
default:
|
|
||||||
await this.selectPopupMenu(filterSecondLevel).click()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
async checkFilter (filter: string, filterSecondLevel?: string, filterThirdLevel?: string): Promise<void> {
|
|
||||||
await expect(this.filterButton(1)).toHaveText(filter)
|
|
||||||
if (filterSecondLevel !== undefined) {
|
|
||||||
await expect(this.filterButton(2)).toContainText(filterSecondLevel)
|
|
||||||
}
|
|
||||||
if (filterThirdLevel !== undefined) {
|
|
||||||
await expect(this.filterButton(3)).toContainText(filterThirdLevel)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
async updateFilterDimension (
|
|
||||||
filterSecondLevel: string,
|
|
||||||
dateStart?: string,
|
|
||||||
needToOpenCalendar: boolean = false
|
|
||||||
): Promise<void> {
|
|
||||||
await this.filterButton(2).click()
|
|
||||||
await this.selectPopupMenu(filterSecondLevel).click()
|
|
||||||
|
|
||||||
if (dateStart !== undefined) {
|
|
||||||
if (needToOpenCalendar) {
|
|
||||||
await this.filterButton(3).click()
|
|
||||||
}
|
|
||||||
await this.calendarDay(dateStart === 'Today' ? '.today' : `:has-text("${dateStart}")`).click()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
async fillBetweenDate (dateStart: DateDivided, dateEnd: DateDivided): Promise<void> {
|
|
||||||
// dateStart - day
|
|
||||||
await this.firstInputFirstDigit().click({ delay: 100, position: { x: 1, y: 1 } })
|
|
||||||
await this.firstInputFirstDigit().pressSequentially(dateStart.day)
|
|
||||||
|
|
||||||
// dateStart - month
|
|
||||||
await this.firstInputThirdDigit().click({ delay: 100, position: { x: 1, y: 1 } })
|
|
||||||
await this.firstInputThirdDigit().pressSequentially(dateStart.month)
|
|
||||||
|
|
||||||
// dateStart - year
|
|
||||||
await this.firstInputFifthDigit().click({ delay: 100, position: { x: 1, y: 1 } })
|
|
||||||
await this.firstInputFifthDigit().pressSequentially(dateStart.year)
|
|
||||||
|
|
||||||
// dateEnd - day
|
|
||||||
await this.lastInputFirstDigit().click({ delay: 100, position: { x: 1, y: 1 } })
|
|
||||||
await this.lastInputFirstDigit().pressSequentially(dateEnd.day)
|
|
||||||
|
|
||||||
// dateEnd - month
|
|
||||||
await this.lastInputThirdDigit().click({ delay: 100, position: { x: 1, y: 1 } })
|
|
||||||
await this.lastInputThirdDigit().pressSequentially(dateEnd.month)
|
|
||||||
|
|
||||||
// dateEnd - year
|
|
||||||
await this.lastInputFifthDigit().click({ delay: 100, position: { x: 1, y: 1 } })
|
|
||||||
await this.lastInputFifthDigit().pressSequentially(dateEnd.year)
|
|
||||||
|
|
||||||
// Submit
|
|
||||||
await this.submitButton().click({ delay: 100 })
|
|
||||||
}
|
|
||||||
|
|
||||||
async addComment (comment: string): Promise<void> {
|
async addComment (comment: string): Promise<void> {
|
||||||
await this.inputComment().fill(comment)
|
await this.inputComment().fill(comment)
|
||||||
await this.buttonSendComment().click()
|
await this.buttonSendComment().click()
|
||||||
@ -313,7 +209,7 @@ export class CommonTrackerPage extends CalendarPage {
|
|||||||
|
|
||||||
async checkIfMainPanelIsVisible (): Promise<void> {
|
async checkIfMainPanelIsVisible (): Promise<void> {
|
||||||
await expect(this.header()).toBeVisible({ timeout: 60000 })
|
await expect(this.header()).toBeVisible({ timeout: 60000 })
|
||||||
await expect(this.filter()).toBeVisible()
|
await expect(this.buttonFilter()).toBeVisible()
|
||||||
await expect(this.view()).toBeVisible()
|
await expect(this.view()).toBeVisible()
|
||||||
await expect(this.showMore()).toBeVisible()
|
await expect(this.showMore()).toBeVisible()
|
||||||
}
|
}
|
||||||
|
@ -63,7 +63,6 @@ export class IssuesPage extends CommonTrackerPage {
|
|||||||
buttonCollapsedCategories = (): Locator => this.page.locator('div.categoryHeader.collapsed')
|
buttonCollapsedCategories = (): Locator => this.page.locator('div.categoryHeader.collapsed')
|
||||||
pupupTagsPopup = (): Locator => this.page.locator('.popup#TagsPopup')
|
pupupTagsPopup = (): Locator => this.page.locator('.popup#TagsPopup')
|
||||||
issueNotExist = (issueName: string): Locator => this.page.locator('tr', { hasText: issueName })
|
issueNotExist = (issueName: string): Locator => this.page.locator('tr', { hasText: issueName })
|
||||||
filterRowExists = (issueName: string): Locator => this.page.locator('div.row span', { hasText: issueName })
|
|
||||||
issueListGrid = (): Locator => this.page.locator('div.listGrid')
|
issueListGrid = (): Locator => this.page.locator('div.listGrid')
|
||||||
issueList = (): Locator => this.page.locator('div[class*="square"] > div')
|
issueList = (): Locator => this.page.locator('div[class*="square"] > div')
|
||||||
issueByName = (issueName: string): Locator => this.page.locator('a', { hasText: issueName })
|
issueByName = (issueName: string): Locator => this.page.locator('a', { hasText: issueName })
|
||||||
@ -512,11 +511,11 @@ export class IssuesPage extends CommonTrackerPage {
|
|||||||
}
|
}
|
||||||
|
|
||||||
async checkFilteredIssueExist (issueName: string): Promise<void> {
|
async checkFilteredIssueExist (issueName: string): Promise<void> {
|
||||||
await expect(this.filterRowExists(issueName)).toHaveCount(1)
|
await expect(this.linesFromList(issueName)).toHaveCount(1)
|
||||||
}
|
}
|
||||||
|
|
||||||
async checkFilteredIssueNotExist (issueName: string): Promise<void> {
|
async checkFilteredIssueNotExist (issueName: string): Promise<void> {
|
||||||
await expect(this.filterRowExists(issueName)).toHaveCount(0)
|
await expect(this.linesFromList(issueName)).toHaveCount(0)
|
||||||
}
|
}
|
||||||
|
|
||||||
async checkAllIssuesInStatus (statusId?: string, statusName?: string): Promise<void> {
|
async checkAllIssuesInStatus (statusId?: string, statusName?: string): Promise<void> {
|
||||||
|
@ -49,9 +49,3 @@ export interface NewComponent {
|
|||||||
description?: string
|
description?: string
|
||||||
lead?: string
|
lead?: string
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface DateDivided {
|
|
||||||
day: string
|
|
||||||
month: string
|
|
||||||
year: string
|
|
||||||
}
|
|
||||||
|
5
tests/sanity/tests/model/types.ts
Normal file
5
tests/sanity/tests/model/types.ts
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
export interface DateDivided {
|
||||||
|
day: string
|
||||||
|
month: string
|
||||||
|
year: string
|
||||||
|
}
|
@ -1,8 +1,16 @@
|
|||||||
import { test } from '@playwright/test'
|
import { test } from '@playwright/test'
|
||||||
import { generateId, PlatformSetting, PlatformURI } from '../utils'
|
import { generateId, PlatformSetting, PlatformURI, generateTestData } from '../utils'
|
||||||
import { PlanningPage } from '../model/planning/planning-page'
|
import { PlanningPage } from '../model/planning/planning-page'
|
||||||
import { NewToDo } from '../model/planning/types'
|
import { NewToDo } from '../model/planning/types'
|
||||||
import { PlanningNavigationMenuPage } from '../model/planning/planning-navigation-menu-page'
|
import { PlanningNavigationMenuPage } from '../model/planning/planning-navigation-menu-page'
|
||||||
|
import { SignUpData } from '../model/common-types'
|
||||||
|
import { TestData } from '../chat/types'
|
||||||
|
import { faker } from '@faker-js/faker'
|
||||||
|
import { LeftSideMenuPage } from '../model/left-side-menu-page'
|
||||||
|
import { ApiEndpoint } from '../API/Api'
|
||||||
|
import { LoginPage } from '../model/login-page'
|
||||||
|
import { SignInJoinPage } from '../model/signin-page'
|
||||||
|
import { TeamPage } from '../model/team-page'
|
||||||
|
|
||||||
test.use({
|
test.use({
|
||||||
storageState: PlatformSetting
|
storageState: PlatformSetting
|
||||||
@ -160,22 +168,74 @@ test.describe('Planning ToDo tests', () => {
|
|||||||
await planningPage.checkTimeSlotEndDate(1, dateEndTomorrow.getDate().toString())
|
await planningPage.checkTimeSlotEndDate(1, dateEndTomorrow.getDate().toString())
|
||||||
})
|
})
|
||||||
|
|
||||||
test("Drag'n'drop added Todo", async ({ page }) => {
|
test('Adding ToDo by dragging and checking visibility in the Team Planner', async ({ browser, page, request }) => {
|
||||||
|
const data: TestData = generateTestData()
|
||||||
|
const newUser2: SignUpData = {
|
||||||
|
firstName: faker.person.firstName(),
|
||||||
|
lastName: faker.person.lastName(),
|
||||||
|
email: faker.internet.email(),
|
||||||
|
password: '1234'
|
||||||
|
}
|
||||||
|
const titleV = `Visible ToDo ${generateId()}`
|
||||||
|
const titleI = `Inisible ToDo ${generateId()}`
|
||||||
|
|
||||||
let hour = new Date().getHours()
|
let hour = new Date().getHours()
|
||||||
const ampm = hour < 13 ? 'am' : 'pm'
|
const ampm = hour < 13 ? 'am' : 'pm'
|
||||||
hour = hour < 1 ? 1 : hour >= 11 && hour < 13 ? 11 : hour >= 22 ? 10 : hour > 12 ? hour - 12 : hour
|
hour = hour < 1 ? 1 : hour >= 11 && hour < 13 ? 11 : hour >= 22 ? 10 : hour > 12 ? hour - 12 : hour
|
||||||
const time = `${hour}${ampm}`
|
const timeV = `${hour}${ampm}`
|
||||||
const title = `Drag and drop ToDo ${generateId()}`
|
const timeI = `${hour + 1}${ampm}`
|
||||||
|
|
||||||
|
const leftSideMenuPage: LeftSideMenuPage = new LeftSideMenuPage(page)
|
||||||
|
const loginPage: LoginPage = new LoginPage(page)
|
||||||
|
const api: ApiEndpoint = new ApiEndpoint(request)
|
||||||
|
await api.createAccount(data.userName, '1234', data.firstName, data.lastName)
|
||||||
|
await api.createWorkspaceWithLogin(data.workspaceName, data.userName, '1234')
|
||||||
|
await (await page.goto(`${PlatformURI}`))?.finished()
|
||||||
|
await loginPage.login(data.userName, '1234')
|
||||||
|
await (await page.goto(`${PlatformURI}/workbench/${data.workspaceName}`))?.finished()
|
||||||
|
await leftSideMenuPage.clickPlanner()
|
||||||
|
|
||||||
const planningNavigationMenuPage = new PlanningNavigationMenuPage(page)
|
const planningNavigationMenuPage = new PlanningNavigationMenuPage(page)
|
||||||
await planningNavigationMenuPage.clickOnButtonToDoAll()
|
await planningNavigationMenuPage.clickOnButtonToDoAll()
|
||||||
const planningPage = new PlanningPage(page)
|
const planningPage = new PlanningPage(page)
|
||||||
await planningPage.selectInputToDo().fill(title)
|
|
||||||
|
await planningPage.selectInputToDo().fill(titleV)
|
||||||
await planningPage.selectInputToDo().press('Enter')
|
await planningPage.selectInputToDo().press('Enter')
|
||||||
await planningPage.dragdropTomorrow(title, time)
|
await planningPage.dragdropTomorrow(titleV, timeV)
|
||||||
await planningPage.eventInSchedule(title).click()
|
await planningPage.eventInSchedule(titleV).click()
|
||||||
await planningPage.buttonPopupCreateVisible().click()
|
await planningPage.buttonPopupCreateVisible().click()
|
||||||
await planningPage.buttonPopupVisibleToEveryone().click()
|
await planningPage.buttonPopupVisibleToEveryone().click()
|
||||||
await planningPage.buttonPopupSave().click()
|
await planningPage.buttonPopupSave().click()
|
||||||
|
|
||||||
|
await planningPage.selectInputToDo().fill(titleI)
|
||||||
|
await planningPage.selectInputToDo().press('Enter')
|
||||||
|
await planningPage.dragdropTomorrow(titleI, timeI)
|
||||||
|
await planningPage.eventInSchedule(titleI).click()
|
||||||
|
await planningPage.buttonPopupCreateVisible().click()
|
||||||
|
await planningPage.buttonPopupOnlyVisibleToYou().click()
|
||||||
|
await planningPage.buttonPopupSave().click()
|
||||||
|
|
||||||
|
await leftSideMenuPage.openProfileMenu()
|
||||||
|
await leftSideMenuPage.inviteToWorkspace()
|
||||||
|
await leftSideMenuPage.getInviteLink()
|
||||||
|
const linkText = await page.locator('.antiPopup .link').textContent()
|
||||||
|
const page2 = await browser.newPage()
|
||||||
|
const leftSideMenuPageSecond = new LeftSideMenuPage(page2)
|
||||||
|
await api.createAccount(newUser2.email, newUser2.password, newUser2.firstName, newUser2.lastName)
|
||||||
|
await page2.goto(linkText ?? '')
|
||||||
|
const joinPage = new SignInJoinPage(page2)
|
||||||
|
await joinPage.join(newUser2)
|
||||||
|
|
||||||
|
await leftSideMenuPageSecond.clickTeam()
|
||||||
|
const teamPage = new TeamPage(page2)
|
||||||
|
await teamPage.checkTeamPageIsOpened()
|
||||||
|
await teamPage.selectTeam('Default')
|
||||||
|
await teamPage.buttonNextDay().click()
|
||||||
|
await page2
|
||||||
|
.locator('div.hulyComponent div.item', { hasText: 'Tomorrow' })
|
||||||
|
.locator('div.item', { hasText: 'Busy 30m' })
|
||||||
|
.isVisible()
|
||||||
|
|
||||||
|
await page2.close()
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
@ -13,7 +13,7 @@ test.describe('Planning ToDo tests', () => {
|
|||||||
await (await page.goto(`${PlatformURI}/workbench/sanity-ws/time`))?.finished()
|
await (await page.goto(`${PlatformURI}/workbench/sanity-ws/time`))?.finished()
|
||||||
})
|
})
|
||||||
|
|
||||||
test('New ToDo', async ({ page }) => {
|
test('New ToDo and checking notifications about unplanned tasks', async ({ page }) => {
|
||||||
const dateEnd = new Date()
|
const dateEnd = new Date()
|
||||||
dateEnd.setDate(dateEnd.getDate() + 1)
|
dateEnd.setDate(dateEnd.getDate() + 1)
|
||||||
|
|
||||||
@ -40,9 +40,11 @@ test.describe('Planning ToDo tests', () => {
|
|||||||
}
|
}
|
||||||
|
|
||||||
const planningPage = new PlanningPage(page)
|
const planningPage = new PlanningPage(page)
|
||||||
await planningPage.createNewToDo(newToDo)
|
|
||||||
|
|
||||||
const planningNavigationMenuPage = new PlanningNavigationMenuPage(page)
|
const planningNavigationMenuPage = new PlanningNavigationMenuPage(page)
|
||||||
|
await planningNavigationMenuPage.clickOnButtonUnplanned()
|
||||||
|
await planningNavigationMenuPage.compareCountersUnplannedToDos()
|
||||||
|
await planningPage.createNewToDo(newToDo)
|
||||||
|
await planningNavigationMenuPage.compareCountersUnplannedToDos()
|
||||||
await planningNavigationMenuPage.clickOnButtonToDoAll()
|
await planningNavigationMenuPage.clickOnButtonToDoAll()
|
||||||
|
|
||||||
await planningPage.checkToDoExist(newToDo.title)
|
await planningPage.checkToDoExist(newToDo.title)
|
||||||
|
@ -131,4 +131,21 @@ test.describe('candidate/talents tests', () => {
|
|||||||
await talentsPage.rightClickAction(talentName, 'Match to vacancy')
|
await talentsPage.rightClickAction(talentName, 'Match to vacancy')
|
||||||
await talentsPage.checkMatchVacancy(`${talentName.lastName} ${talentName.firstName}`, '0')
|
await talentsPage.checkMatchVacancy(`${talentName.lastName} ${talentName.firstName}`, '0')
|
||||||
})
|
})
|
||||||
|
|
||||||
|
test('Filtering talents by skills', async ({ page }) => {
|
||||||
|
const skillName = `Skill-${generateId(4)}`
|
||||||
|
const talentName = 'P. Andrey'
|
||||||
|
|
||||||
|
await navigationMenuPage.clickButtonTalents()
|
||||||
|
await talentsPage.checkRowsInTableExist(talentName)
|
||||||
|
const talentsCount = await talentsPage.linesFromTable().count()
|
||||||
|
await talentsPage.openRowInTableByText(talentName)
|
||||||
|
await talentDetailsPage.addSkill(skillName, 'Skill Description')
|
||||||
|
await talentDetailsPage.buttonClosePanel().click()
|
||||||
|
await talentsPage.selectFilter('Skills', skillName)
|
||||||
|
await talentsPage.checkRowsInTableExist(talentName)
|
||||||
|
await talentsPage.filterOppositeCondition('Skill', 'is', 'is not')
|
||||||
|
await talentsPage.checkRowsInTableNotExist(talentName)
|
||||||
|
await talentsPage.checkRowsInTableExist('', talentsCount - 1)
|
||||||
|
})
|
||||||
})
|
})
|
||||||
|
@ -2,7 +2,8 @@ import { expect, test } from '@playwright/test'
|
|||||||
import { generateId, iterateLocator, PlatformSetting, PlatformURI } from '../utils'
|
import { generateId, iterateLocator, PlatformSetting, PlatformURI } from '../utils'
|
||||||
import { LeftSideMenuPage } from '../model/left-side-menu-page'
|
import { LeftSideMenuPage } from '../model/left-side-menu-page'
|
||||||
import { IssuesPage } from '../model/tracker/issues-page'
|
import { IssuesPage } from '../model/tracker/issues-page'
|
||||||
import { DateDivided, NewIssue } from '../model/tracker/types'
|
import { NewIssue } from '../model/tracker/types'
|
||||||
|
import { DateDivided } from '../model/types'
|
||||||
import { DEFAULT_STATUSES, DEFAULT_STATUSES_ID, PRIORITIES } from './tracker.utils'
|
import { DEFAULT_STATUSES, DEFAULT_STATUSES_ID, PRIORITIES } from './tracker.utils'
|
||||||
import { IssuesDetailsPage } from '../model/tracker/issues-details-page'
|
import { IssuesDetailsPage } from '../model/tracker/issues-details-page'
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user