From ec696d029b5a30bd993d590cf93dfb4b4c552442 Mon Sep 17 00:00:00 2001 From: Alexander Platov Date: Fri, 4 Oct 2024 07:23:46 +0300 Subject: [PATCH] Fix uitests (#6804) Signed-off-by: Alexander Platov --- tests/sanity/tests/model/channel-page.ts | 5 +- tests/sanity/tests/model/common-page.ts | 6 +++ .../tests/model/planning/planning-page.ts | 47 ++++++++++++++++++- tests/sanity/tests/model/planning/types.ts | 6 +-- tests/sanity/tests/model/settings-page.ts | 7 +++ tests/sanity/tests/planning/plan.spec.ts | 23 +++++---- .../sanity/tests/recruiting/vacancies.spec.ts | 17 ++++++- tests/sanity/tests/utils.ts | 8 ++++ 8 files changed, 101 insertions(+), 18 deletions(-) diff --git a/tests/sanity/tests/model/channel-page.ts b/tests/sanity/tests/model/channel-page.ts index 79fe454fcc..9a5aefb9fa 100644 --- a/tests/sanity/tests/model/channel-page.ts +++ b/tests/sanity/tests/model/channel-page.ts @@ -296,9 +296,8 @@ export class ChannelPage extends CommonPage { } async checkIfNameIsChanged (channel: string): Promise { - await expect(this.channel(channel).nth(0)).toBeVisible() - await expect(this.channel(channel).nth(1)).toBeVisible() - await expect(this.channel(channel).nth(2)).toBeVisible() + await expect(this.channelContainers().filter({ hasText: channel })).toBeVisible() + await expect(this.buttonBreadcrumb(channel)).toBeVisible() } async makeActionWithChannelInMenu (channelName: string, action: string): Promise { diff --git a/tests/sanity/tests/model/common-page.ts b/tests/sanity/tests/model/common-page.ts index 55da551ee1..b5044b51b8 100644 --- a/tests/sanity/tests/model/common-page.ts +++ b/tests/sanity/tests/model/common-page.ts @@ -12,6 +12,7 @@ export class CommonPage { selectPopupInputSearch = (): Locator => this.page.locator('div.popup input.search') selectPopupListItem = (name: string): Locator => this.page.locator('div.selectPopup div.list-item', { hasText: name }) selectPopupListItemFirst = (): Locator => this.page.locator('div.selectPopup div.list-item') + selectPopupApMenuItem = (hasText: string): Locator => this.page.locator('div.popup button.ap-menuItem', { hasText }) selectPopupAddButton = (): Locator => this.page.locator('div.selectPopup button[data-id="btnAdd"]') selectPopupButton = (): Locator => this.page.locator('div.selectPopup button') selectPopupExpandButton = (): Locator => this.page.locator('div.selectPopup button[data-id="btnExpand"]') @@ -89,6 +90,7 @@ export class CommonPage { 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"]') + buttonBreadcrumb = (hasText?: string): Locator => this.page.locator('button.hulyBreadcrumb-container', { hasText }) async selectMenuItem (page: Page, name: string, fullWordFilter: boolean = false): Promise { if (name !== 'first') { @@ -194,6 +196,10 @@ export class CommonPage { await this.selectPopupListItem(name).click({ delay: 100 }) } + async selectPopupAp (name: string): Promise { + await this.selectPopupApMenuItem(name).click({ delay: 100 }) + } + async selectPopupItem (name: string): Promise { await this.hulyPopupRowButton(name).click({ delay: 100 }) } diff --git a/tests/sanity/tests/model/planning/planning-page.ts b/tests/sanity/tests/model/planning/planning-page.ts index 575bd9d258..c7a52dbe76 100644 --- a/tests/sanity/tests/model/planning/planning-page.ts +++ b/tests/sanity/tests/model/planning/planning-page.ts @@ -73,7 +73,20 @@ export class PlanningPage extends CalendarPage { readonly buttonMenuDelete = (): Locator => this.page.locator('button.ap-menuItem span', { hasText: 'Delete' }) readonly buttonPopupSelectDateNextMonth = (): Locator => - this.popup().locator('div.header > div:last-child > button:last-child') + this.popup().locator('div.month-container > div.header > div:last-child > button:last-child') + + readonly buttonPopupSelectDatePrevMonth = (): Locator => + this.popup().locator('div.month-container > div.header > div:last-child > button:first-child') + + readonly buttonPrevDayInSchedule = (): Locator => + this.page + .locator('div.hulyHeader-container', { hasText: 'Schedule:' }) + .locator('div.hulyHeader-buttonsGroup > button:first-child') + + readonly buttonNextDayInSchedule = (): Locator => + this.page + .locator('div.hulyHeader-container', { hasText: 'Schedule:' }) + .locator('div.hulyHeader-buttonsGroup > button:last-child') readonly selectInputToDo = (): Locator => this.toDosContainer().getByPlaceholder('Add Action Item, press Enter to save') @@ -102,6 +115,14 @@ export class PlanningPage extends CalendarPage { .locator('xpath=..') .locator('button.reference') + async clickButtonPrevDayInSchedule (): Promise { + await this.buttonPrevDayInSchedule().click() + } + + async clickButtonNextDayInSchedule (): Promise { + await this.buttonNextDayInSchedule().click() + } + async dragToCalendar (title: string, column: number, time: string, addHalf: boolean = false): Promise { await this.toDosContainer().getByRole('button', { name: title }).hover() @@ -224,7 +245,7 @@ export class PlanningPage extends CalendarPage { await row.locator('div.dateEditor-container:first-child > div.min-w-28:first-child .hulyButton').click() if (slot.dateStart === 'today') { await this.buttonCalendarToday().click() - } else { + } else if (typeof slot.dateStart === 'string') { if (slot.dateStart === '1') { await this.buttonPopupSelectDateNextMonth().click() } @@ -232,6 +253,28 @@ export class PlanningPage extends CalendarPage { .locator('div.popup div.calendar button.day') .filter({ has: this.page.locator(`text="${slot.dateStart}"`) }) .click() + } else { + const today = new Date() + const target = new Date( + parseInt(slot.dateStart.year, 10), + parseInt(slot.dateStart.month, 10) - 1, + parseInt(slot.dateStart.day, 10) + ) + const before: boolean = target.getTime() < today.getTime() + const diffYear: number = Math.abs(target.getFullYear() - today.getFullYear()) + const diffMonth: number = + diffYear === 0 + ? Math.abs(target.getMonth() - today.getMonth()) + : (diffYear - 1) * 12 + + (before ? today.getMonth() + 12 - target.getMonth() : target.getMonth() + 12 - today.getMonth()) + for (let i = 0; i < diffMonth; i++) { + if (before) await this.buttonPopupSelectDatePrevMonth().click() + else await this.buttonPopupSelectDateNextMonth().click() + } + await this.page + .locator('div.popup div.calendar button.day') + .filter({ has: this.page.locator(`text="${target.getDate()}"`) }) + .click() } // timeStart const hours = slot.timeStart.substring(0, 2) diff --git a/tests/sanity/tests/model/planning/types.ts b/tests/sanity/tests/model/planning/types.ts index 4a7056e85a..aa1caa59fe 100644 --- a/tests/sanity/tests/model/planning/types.ts +++ b/tests/sanity/tests/model/planning/types.ts @@ -10,13 +10,13 @@ export interface NewToDo { } export interface Slot { - dateStart: string + dateStart: string | TDate timeStart: string - dateEnd: Date + dateEnd: TDate timeEnd: string } -export interface Date { +export interface TDate { day: string month: string year: string diff --git a/tests/sanity/tests/model/settings-page.ts b/tests/sanity/tests/model/settings-page.ts index d0ed8f4ff4..9edf42c85e 100644 --- a/tests/sanity/tests/model/settings-page.ts +++ b/tests/sanity/tests/model/settings-page.ts @@ -53,6 +53,13 @@ export class SettingsPage extends CommonPage { asideFooterButton = (hasText: string): Locator => this.page.locator('div.hulyModal-container.type-aside div.hulyModal-footer button', { hasText }) + buttonRoleInComponent = (hasText: string): Locator => + this.page.locator('div.hulyComponent-content > div.flex-row-center', { hasText }).locator('button') + + async clickButtonRoleInComponent (name: string): Promise { + await this.buttonRoleInComponent(name).click() + } + async navigateToWorkspace (workspaceUrl: string): Promise { const response = await this.page.goto(workspaceUrl) if (response === null || response === undefined) { diff --git a/tests/sanity/tests/planning/plan.spec.ts b/tests/sanity/tests/planning/plan.spec.ts index b8a693fbca..3a269fce75 100644 --- a/tests/sanity/tests/planning/plan.spec.ts +++ b/tests/sanity/tests/planning/plan.spec.ts @@ -6,7 +6,8 @@ import { generateTestData, getTimeForPlanner, getSecondPageByInvite, - getInviteLink + getInviteLink, + convertDate } from '../utils' import { PlanningPage } from '../model/planning/planning-page' import { NewToDo } from '../model/planning/types' @@ -344,23 +345,21 @@ test.describe('Planning ToDo tests', () => { }) }) - test.skip('Change ToDo start and end times by dragging', async ({ page }) => { + test('Change ToDo start and end times by dragging', async ({ page }) => { const planningPage = new PlanningPage(page) const planningNavigationMenuPage = new PlanningNavigationMenuPage(page) - const dateEnd = new Date() + const today = new Date() + const date = new Date() + date.setDate(date.getDate() + 3) const toDoWithLabel: NewToDo = { title: `ToDo to change duration-${generateId()}`, description: 'Description for ToDo to change duration', slots: [ { - dateStart: 'today', + dateStart: convertDate(date), timeStart: '1400', - dateEnd: { - day: dateEnd.getDate().toString(), - month: (dateEnd.getMonth() + 1).toString(), - year: dateEnd.getFullYear().toString() - }, + dateEnd: convertDate(date), timeEnd: '1500' } ] @@ -369,6 +368,12 @@ test.describe('Planning ToDo tests', () => { await test.step('Prepare ToDo', async () => { await planningNavigationMenuPage.clickOnButtonToDoAll() await planningPage.createNewToDo(toDoWithLabel) + const diff = date.getTime() - today.getTime() + for (let i = 0; i < Math.abs(diff) / 86400000; i++) { + if (diff < 0) await planningPage.clickButtonPrevDayInSchedule() + else await planningPage.clickButtonNextDayInSchedule() + } + await planningPage.selectTimeCell('10am').scrollIntoViewIfNeeded() }) await test.step('Resize ToDo', async () => { diff --git a/tests/sanity/tests/recruiting/vacancies.spec.ts b/tests/sanity/tests/recruiting/vacancies.spec.ts index 4730d6e9de..4e369e22c0 100644 --- a/tests/sanity/tests/recruiting/vacancies.spec.ts +++ b/tests/sanity/tests/recruiting/vacancies.spec.ts @@ -4,6 +4,8 @@ import { NavigationMenuPage } from '../model/recruiting/navigation-menu-page' import { VacanciesPage } from '../model/recruiting/vacancies-page' import { VacancyDetailsPage } from '../model/recruiting/vacancy-details-page' import { NewVacancy } from '../model/recruiting/types' +import { SettingsPage } from '../model/settings-page' +import { WorkspaceSettingsPage } from '../model/workspace/workspace-settings-page' test.use({ storageState: PlatformSetting @@ -21,7 +23,20 @@ test.describe('Vacancy tests', () => { await (await page.goto(`${PlatformURI}/workbench/sanity-ws/recruit`))?.finished() }) - test('create-vacancy', async () => { + test('create-vacancy', async ({ page }) => { + const settingsPage: SettingsPage = new SettingsPage(page) + await settingsPage.profileButton().click() + await settingsPage.selectPopupAp('Settings') + const wsPage: WorkspaceSettingsPage = new WorkspaceSettingsPage(page) + await wsPage.owners().click() + await settingsPage.checkOpened('Owners') + await settingsPage.clickButtonRoleInComponent('Appleseed John') + await settingsPage.selectPopupMenu('Owner').click() + const count = await page.locator('div[id="workbench:component:WorkbenchTabs"] div.container.main').count() + for (let i = 1; i < count; i++) { + await page.locator('div[id="workbench:component:WorkbenchTabs"] div.container.main:first-child button').click() + } + const vacancyId = 'My vacancy ' + generateId(4) await vacanciesPage.createVacancy(vacancyId) await vacanciesPage.modifyVacancy(vacancyId) diff --git a/tests/sanity/tests/utils.ts b/tests/sanity/tests/utils.ts index ad43112342..11e69c82aa 100644 --- a/tests/sanity/tests/utils.ts +++ b/tests/sanity/tests/utils.ts @@ -261,3 +261,11 @@ export async function createAccountAndWorkspace (page: Page, request: APIRequest await api.createWorkspaceWithLogin(data.workspaceName, data.userName, '1234') await reLogin(page, data) } + +export const convertDate = (date: Date): { day: string, month: string, year: string } => { + return { + day: date.getDate().toString(), + month: (date.getMonth() + 1).toString(), + year: date.getFullYear().toString() + } +}