diff --git a/e2e/location.spec.ts b/e2e/location.spec.ts index 2de343794..d6347ff8f 100644 --- a/e2e/location.spec.ts +++ b/e2e/location.spec.ts @@ -1,6 +1,5 @@ import { test } from './fixtures/test-options.ts'; import { getProjects } from './page-objects/helperBase.ts'; -import type { Page } from '@playwright/test'; import type { Project } from './page-objects/helperBase.ts'; import type { PageManager } from './page-objects/pageManager.ts'; @@ -10,7 +9,7 @@ let projects = getProjects(); // Temporally switched off oam untill 18508 issue is fixed // Atlas has no 'Locate me' feature for guest -projects = projects.filter((arg) => arg.name === 'smart-city'); +projects = projects.filter((arg: Project) => arg.name === 'smart-city'); // Setting 3 retries for CI as it is very flacky with screenshots const retriesNumber = process.env.CI ? 3 : 1; @@ -19,7 +18,7 @@ test.describe.configure({ retries: retriesNumber }); // Moving test to a separate function to reuse it const testLocation = async function (pageManager: PageManager, project: Project) { await pageManager.atBrowser.openProject(project); - await pageManager.fromNavigationMenu.goToMap(); + await pageManager.atNavigationMenu.clickButtonToOpenPage('Map'); await ( await pageManager.atToolBar.getButtonByText('Locate me') ).click({ timeout: 15000 }); diff --git a/e2e/locationWithPro.spec.ts b/e2e/locationWithPro.spec.ts index 64e8a11c2..4d9ece1b9 100644 --- a/e2e/locationWithPro.spec.ts +++ b/e2e/locationWithPro.spec.ts @@ -1,6 +1,5 @@ import { test } from './fixtures/test-options.ts'; import { getProjects } from './page-objects/helperBase.ts'; -import type { Page } from '@playwright/test'; import type { Project } from './page-objects/helperBase.ts'; import type { PageManager } from './page-objects/pageManager.ts'; @@ -9,7 +8,9 @@ let projects = getProjects(); // Temporally switched off disaster-ninja untill 15482 issue is fixed // Temporally switched off oam untill 18508 issue is fixed -projects = projects.filter((arg) => arg.name !== 'disaster-ninja' && arg.name !== 'oam'); +projects = projects.filter( + ({ name }: Project) => name !== 'disaster-ninja' && name !== 'oam', +); // Setting 3 retries for CI as it is very flacky with screenshots const retriesNumber = process.env.CI ? 3 : 1; @@ -18,7 +19,7 @@ test.describe.configure({ retries: retriesNumber }); // Moving test to a separate function to reuse it const testLocation = async function (pageManager: PageManager, project: Project) { await pageManager.atBrowser.openProject(project, { skipCookieBanner: true }); - await pageManager.fromNavigationMenu.goToMap(); + await pageManager.atNavigationMenu.clickButtonToOpenPage('Map'); await ( await pageManager.atToolBar.getButtonByText('Locate me') ).click({ timeout: 15000 }); diff --git a/e2e/locationWithUser.spec.ts b/e2e/locationWithUser.spec.ts index 62361bfe9..7c891625b 100644 --- a/e2e/locationWithUser.spec.ts +++ b/e2e/locationWithUser.spec.ts @@ -18,7 +18,7 @@ for (const project of projects) { pageManager, }) => { await pageManager.atBrowser.openProject(project, { skipCookieBanner: true }); - await pageManager.fromNavigationMenu.goToMap(); + await pageManager.atNavigationMenu.clickButtonToOpenPage('Map'); await ( await pageManager.atToolBar.getButtonByText('Locate me') ).click({ timeout: 15000 }); diff --git a/e2e/login.spec.ts b/e2e/login.spec.ts index 3030e4f39..3c8b2b91a 100644 --- a/e2e/login.spec.ts +++ b/e2e/login.spec.ts @@ -1,4 +1,3 @@ -import { expect } from '@playwright/test'; import { test } from './fixtures/test-options.ts'; import { getProjects } from './page-objects/helperBase.ts'; @@ -7,24 +6,21 @@ const projects = getProjects(); // Create a loop to loop over all the projects and create a test for everyone for (const project of projects) { test(`As Guest, I can log in to ${project.title}, check that this profile is mine, and log out`, async ({ - page, pageManager, }) => { await pageManager.atBrowser.openProject(project); - await pageManager.fromNavigationMenu.goToLoginPage(); + await pageManager.atNavigationMenu.clickButtonToOpenPage('Login'); await pageManager.atLoginPage.typeLoginPasswordAndLogin( process.env.EMAIL!, process.env.PASSWORD!, { shouldSuccess: true, project }, ); - // TO DO: activate this check once 19103 issue is done - // expect(page.url()).toContain('autotests'); + pageManager.atBrowser.checkCampaignIsAutotest(); await pageManager.atProfilePage.checkLogoutBtnProfileTitleAndEmail( process.env.EMAIL!, ); await pageManager.atProfilePage.clickLogout(); - // TO DO: activate this check once 19103 issue is done - // expect(page.url()).toContain('autotests'); + pageManager.atBrowser.checkCampaignIsAutotest(); await pageManager.atProfilePage.checkLogoutBtnAndProfileAbsence(); await pageManager.atLoginPage.checkLoginAndSignupPresence(); }); diff --git a/e2e/openOsm.spec.ts b/e2e/openOsm.spec.ts index b14e753d0..a511b941e 100644 --- a/e2e/openOsm.spec.ts +++ b/e2e/openOsm.spec.ts @@ -1,11 +1,12 @@ import { expect } from '@playwright/test'; import { test } from './fixtures/test-options.ts'; import { getProjects } from './page-objects/helperBase.ts'; +import type { Project } from './page-objects/helperBase.ts'; let projects = getProjects(); // Atlas has no 'Edit map in OSM' feature for guest -projects = projects.filter((arg) => arg.name !== 'atlas'); +projects = projects.filter((arg: Project) => arg.name !== 'atlas'); for (const project of projects) { test.fixme( @@ -18,7 +19,7 @@ for (const project of projects) { }, async ({ context, pageManager }) => { await pageManager.atBrowser.openProject(project); - await pageManager.fromNavigationMenu.goToMap(); + await pageManager.atNavigationMenu.clickButtonToOpenPage('Map'); // TO DO: remove this action after 18582 issue is fixed await pageManager.atMap.goToSpecificAreaByUrl(10.597, 53.9196, 27.5097, project); diff --git a/e2e/openOsmWithPro.spec.ts b/e2e/openOsmWithPro.spec.ts index e75a11700..d23c2d244 100644 --- a/e2e/openOsmWithPro.spec.ts +++ b/e2e/openOsmWithPro.spec.ts @@ -33,7 +33,7 @@ for (const project of projects) { }); }); await pageManager.atBrowser.openProject(project, { skipCookieBanner: true }); - await pageManager.fromNavigationMenu.goToProfilePage(); + await pageManager.atNavigationMenu.clickButtonToOpenPage('Profile'); const osmEditorValue = await pageManager.atProfilePage.getOsmEditorValue(); expect(osmEditorValue).toBe('OpenStreetMap.org default editor'); }); @@ -48,7 +48,7 @@ test.describe(`As PRO User, I can use different OSM editors to open the map`, () pageManager, }) => { await pageManager.atBrowser.openProject(project, { skipCookieBanner: true }); - await pageManager.fromNavigationMenu.goToProfilePage(); + await pageManager.atNavigationMenu.clickButtonToOpenPage('Profile'); const osmEditorValue = await pageManager.atProfilePage.getOsmEditorValue(); if (osmEditorValue !== editor) { await pageManager.atProfilePage.setOsmEditorValue(editor); @@ -57,7 +57,7 @@ test.describe(`As PRO User, I can use different OSM editors to open the map`, () expect(editedOsmEditorValue).toEqual(editor); } - await pageManager.fromNavigationMenu.goToMap(); + await pageManager.atNavigationMenu.clickButtonToOpenPage('Map'); await pageManager.atMap.waitForTextBeingVisible('Toolbar'); await pageManager.atMap.waitForUrlToMatchPattern(/\?map=/i); diff --git a/e2e/openOsmWithUser.spec.ts b/e2e/openOsmWithUser.spec.ts index ac7208853..86cb78246 100644 --- a/e2e/openOsmWithUser.spec.ts +++ b/e2e/openOsmWithUser.spec.ts @@ -13,7 +13,7 @@ for (const project of projects) { pageManager, }) => { await pageManager.atBrowser.openProject(project, { skipCookieBanner: true }); - await pageManager.fromNavigationMenu.goToMap(); + await pageManager.atNavigationMenu.clickButtonToOpenPage('Map'); // TO DO: remove this action after 18582 issue is fixed await pageManager.atMap.goToSpecificAreaByUrl(10.597, 53.9196, 27.5097, project); diff --git a/e2e/page-objects/helperBase.ts b/e2e/page-objects/helperBase.ts index f5d639d7a..d65bc48b6 100644 --- a/e2e/page-objects/helperBase.ts +++ b/e2e/page-objects/helperBase.ts @@ -36,8 +36,11 @@ export class HelperBase { project: Project, { skipCookieBanner = false, operablePage = this.page }: OpenProjectOptions = {}, ) { - await operablePage.goto(project.url); - await operablePage.waitForLoadState(); + await operablePage.goto(project.url, { waitUntil: 'commit' }); + await Promise.all([ + this.waitForEventWithFilter(operablePage, 'METRICS', 'router-layout-ready'), + operablePage.waitForLoadState(), + ]); // Expect correct app to be opened. await this.waitForTextBeingVisible(`${project.title}`, operablePage); @@ -47,6 +50,55 @@ export class HelperBase { await operablePage.getByText('Accept optional cookies').click(); } + /** + * This method waits for event to be emitted and filtering to return true. It enters a browser console and waits for browser event to be emitted. If it is not emitted in several seconds, it fails the test. + * @param operablePage playwright page to use + * @param eventType event type to wait for + * @param eventName event name to wait for + * @returns event object + * @throws error if event is not emitted in time + */ + + async waitForEventWithFilter( + operablePage: Page = this.page, + eventType: string, + eventName: string, + ) { + // If you need to wait for other events using this method, try to use page.addInitScript instead of page.evaluate because page.evaluate does not support passing functions + const waitingTimeout = process.env.CI ? 40000 : 25000; + // Entering browser console to wait for event to be emitted + const filteredEvent: CustomEvent = await operablePage.evaluate( + (filterOptions) => { + return new Promise((resolve, reject) => { + // Reject Promise if event is late + const timeout = setTimeout(() => { + reject( + new Error( + `Timeout waiting for '${filterOptions.eventType}' event with '${filterOptions.eventName}' name in the browser (${filterOptions.waitingTimeout} ms) matching filtering condition (checking event.detail.name property)`, + ), + ); + }, filterOptions.waitingTimeout); + + // Clear timeout if event is emitted matching filter, remove event listener and resolve Promise with event + const eventListener = (event: Event) => { + //@ts-expect-error if no detail property, we should fail, no way to pass function here (playwright limitation), but you can call such function, if it is added to HEAP using page.addInitScript + if (event?.detail?.name === filterOptions.eventName) { + clearTimeout(timeout); + globalThis.removeEventListener(filterOptions.eventName, eventListener); + resolve(event as CustomEvent); + } + }; + globalThis.addEventListener(filterOptions.eventType, eventListener); + }); + }, + { waitingTimeout, eventName, eventType }, + ); + expect( + filteredEvent, + `'${eventType}' event should be emitted and event.detail.name to equal '${eventName}'`, + ).toBeDefined(); + } + /** * This method waits for a specific page to have a specific text */ @@ -91,10 +143,13 @@ export class HelperBase { async compareUrlsAfterReload(project: Project) { const currentUrl = this.page.url().replace(/\//g, ''); - await this.page.reload({ waitUntil: 'load' }); + await this.page.reload({ waitUntil: 'commit' }); + await Promise.all([ + this.waitForEventWithFilter(this.page, 'METRICS', 'router-layout-ready'), + this.page.waitForLoadState(), + ]); expect(this.page.url().replace(/\//g, '')).toEqual(currentUrl); - // TO DO: activate this check once 19103 issue is done - // await expect(this.page).toHaveTitle(`${project.title}`); + await expect(this.page).toHaveTitle(new RegExp(project.title)); } /** @@ -117,6 +172,16 @@ export class HelperBase { async waitForUrlToMatchPattern(pattern: RegExp, page: Page = this.page) { await page.waitForURL(pattern, { timeout: 30000 }); } + + /** + * This method checks that campaign is autotests. It is needed for Google Analytics and other tracking services to differ normal users and autotests + */ + + checkCampaignIsAutotest(): void { + expect(this.page.url(), 'URL should contain utm_campaign=autotests').toContain( + 'utm_campaign=autotests', + ); + } } /** diff --git a/e2e/page-objects/keycloakPage.ts b/e2e/page-objects/keycloakPage.ts index 6b9ae4481..82109874a 100644 --- a/e2e/page-objects/keycloakPage.ts +++ b/e2e/page-objects/keycloakPage.ts @@ -1,4 +1,4 @@ -import { expect, request } from '@playwright/test'; +import { expect } from '@playwright/test'; import { HelperBase } from './helperBase'; import type { Project } from './helperBase'; import type { Page, APIRequestContext } from '@playwright/test'; diff --git a/e2e/page-objects/loginPage.ts b/e2e/page-objects/loginPage.ts index 77e0fc9a4..f14edd97e 100644 --- a/e2e/page-objects/loginPage.ts +++ b/e2e/page-objects/loginPage.ts @@ -62,9 +62,10 @@ export class LoginPage extends HelperBase { async clickSignUpAndNavigateToKeycloak(context: BrowserContext) { // Start waiting for new page being opened and click sign up const [keycloakPage] = await Promise.all([ - context.waitForEvent('page'), + context.waitForEvent('page', { timeout: 25000 }), this.page.getByText('Sign up').click({ delay: 330 }), ]); + await keycloakPage.waitForLoadState(); await expect(keycloakPage).toHaveTitle(/Sign in/); return keycloakPage; } diff --git a/e2e/page-objects/mapPage.ts b/e2e/page-objects/mapPage.ts index 27b52baf1..e22a66449 100644 --- a/e2e/page-objects/mapPage.ts +++ b/e2e/page-objects/mapPage.ts @@ -54,7 +54,11 @@ export class MapCanvas extends HelperBase { project: Project, ) { const urlForPlace = `${project.url}&map=${zoom}/${latitude}/${longitude}`; - await this.page.goto(urlForPlace, { waitUntil: 'domcontentloaded' }); + await this.page.goto(urlForPlace, { waitUntil: 'commit' }); + await Promise.all([ + this.waitForEventWithFilter(this.page, 'METRICS', 'router-layout-ready'), + this.page.waitForLoadState(), + ]); await this.waitForZoom(); } diff --git a/e2e/page-objects/navigationMenu.ts b/e2e/page-objects/navigationMenu.ts index 370c0c053..c605620ed 100644 --- a/e2e/page-objects/navigationMenu.ts +++ b/e2e/page-objects/navigationMenu.ts @@ -4,15 +4,18 @@ import type { Page } from '@playwright/test'; export class NavigationMenu extends HelperBase { /** - * This method allows to open map from navigation menu + * Opens a page by clicking a button in the navigation menu. + * @param buttonName - name of the button to click + * @param operablePage - playwright page to use */ - async goToMap() { - // TO DO: replace locator here once 19141 task is done, refactor this logics - // When no need will be present to get locator every time - await this.waitForTextBeingVisible('Map'); - await this.page.getByText('Map', { exact: true }).hover(); - await this.page.getByText('Map', { exact: true }).click({ delay: 330 }); + async clickButtonToOpenPage(buttonName: string, operablePage: Page = this.page) { + const button = operablePage + .getByTestId('side-bar') + .getByText(buttonName, { exact: true }); + await button.hover(); + // Delay is needed to emulate a real user click + await button.click({ delay: 500 }); } /** @@ -20,52 +23,9 @@ export class NavigationMenu extends HelperBase { */ async checkThereIsNoMap() { - // TO DO: replace locator here once 19141 task is done - await this.page.locator('[value]').first().waitFor({ state: 'visible' }); - await expect(this.page.locator('[value]').getByText('Map')).not.toBeVisible(); - } - - /** - * This method allows to open login page from navigation menu - */ - - async goToLoginPage(operablePage: Page = this.page) { - // TO DO: replace locator here once 19141 task is done, refactor this logics - // When no need will be present to get locator every time - await operablePage.locator('[value="profile"]').first().waitFor({ state: 'visible' }); - await operablePage.locator('[value="profile"]').getByText('Login').hover(); - await operablePage - .locator('[value="profile"]') - .getByText('Login') - .click({ delay: 330 }); - } - - /** - * This method opens up the profile page from navigation menu - */ - async goToProfilePage() { - // TO DO: replace locator here once 19141 task is done, refactor this logics - // When no need will be present to get locator every time - await this.page.locator('[value="profile"]').first().waitFor({ state: 'visible' }); - await this.page.locator('[value="profile"]').getByText('Profile').hover(); - await this.page - .locator('[value="profile"]') - .getByText('Profile') - .click({ delay: 330 }); - } - - /** - * This method opens up the privacy page from navigation menu - */ - - async goToPrivacyPage() { - // TO DO: replace locator here once 19141 task is done, refactor this logics - // When no need will be present to get locator every time - await this.page.locator('[value="privacy"]').first().waitFor({ state: 'visible' }); - await this.page.locator('[value="privacy"]').getByText('Privacy').hover(); - await this.page - .locator('[value="privacy"]') - .getByText('Privacy') - .click({ delay: 330 }); + const sidebar = this.page.getByTestId('side-bar'); + await expect(sidebar).toBeVisible(); + const mapElement = sidebar.getByText('Map', { exact: true }); + await expect(mapElement).not.toBeVisible(); } } diff --git a/e2e/page-objects/pageManager.ts b/e2e/page-objects/pageManager.ts index 7c62e7c6b..b1e60aed2 100644 --- a/e2e/page-objects/pageManager.ts +++ b/e2e/page-objects/pageManager.ts @@ -44,7 +44,7 @@ export class PageManager { return this.helperBase; } - get fromNavigationMenu() { + get atNavigationMenu() { return this.navigationMenu; } @@ -74,7 +74,7 @@ export class PageManager { async auth(project: Project, email: string, password: string, operablePage: Page) { await this.atBrowser.openProject(project, { operablePage }); - await this.fromNavigationMenu.goToLoginPage(operablePage); + await this.atNavigationMenu.clickButtonToOpenPage('Login', operablePage); await this.atLoginPage.typeLoginPasswordAndLogin(email, password, { shouldSuccess: true, project, diff --git a/e2e/page-objects/profilePage.ts b/e2e/page-objects/profilePage.ts index 6330fb3c1..63b2daafd 100644 --- a/e2e/page-objects/profilePage.ts +++ b/e2e/page-objects/profilePage.ts @@ -157,9 +157,8 @@ export class ProfilePage extends HelperBase { .textContent() : 'No access'; - // TO DO: turn on this check once 19103 issue is done - // if (project.name !== 'disaster-ninja') - // await expect(this.page.getByText('Default disaster feed')).not.toBeVisible(); + if (project.name !== 'disaster-ninja') + await expect(this.page.getByText('Default disaster feed')).not.toBeVisible(); if (!shouldOsmEditorBeSeenOnAtlas && project.name === 'atlas') await expect( this.page.getByText('Default OpenStreetMap editor (beta)'), diff --git a/e2e/page-objects/toolBar.ts b/e2e/page-objects/toolBar.ts index 7db710682..8e00d967d 100644 --- a/e2e/page-objects/toolBar.ts +++ b/e2e/page-objects/toolBar.ts @@ -22,7 +22,7 @@ export class ToolBar extends HelperBase { */ async getButtonByText(text: string) { - const aliveMap = this.page.locator('#withKeepAlivemap'); + const aliveMap = this.page.locator('.keep-alive-render'); return aliveMap.getByText(text, { exact: true }); } diff --git a/e2e/privacy.spec.ts b/e2e/privacy.spec.ts index 29f5fec68..4c9c390a7 100644 --- a/e2e/privacy.spec.ts +++ b/e2e/privacy.spec.ts @@ -1,4 +1,3 @@ -import { expect } from '@playwright/test'; import { getProjects } from './page-objects/helperBase.ts'; import { test } from './fixtures/test-options.ts'; @@ -7,14 +6,12 @@ const projects = getProjects(); for (const project of projects) { test(`As Guest, I can go to ${project.title}, open Privacy tab and analyze this page, verify cookies page`, async ({ pageManager, - page, context, }) => { await pageManager.atBrowser.openProject(project); - await pageManager.fromNavigationMenu.goToPrivacyPage(); + await pageManager.atNavigationMenu.clickButtonToOpenPage('Privacy'); await pageManager.atBrowser.waitForUrlToMatchPattern(/privacy/); - // TO DO: activate this check once 19103 issue is done - // expect(page.url()).toContain('autotests'); + pageManager.atBrowser.checkCampaignIsAutotest(); await pageManager.atPrivacyPage.checkTitles( [ 'Privacy Policy for EU/UK Residents', @@ -29,8 +26,7 @@ for (const project of projects) { // Specify links to check at links-privacy.json file await pageManager.atPrivacyPage.checkLinks(context); - // TO DO: activate this check once 19103 issue is done - // expect(page.url()).toContain('autotests'); + pageManager.atBrowser.checkCampaignIsAutotest(); await pageManager.atPrivacyPage.openAndVerifyCookiesPage(); }); } diff --git a/e2e/privacyWithPro.spec.ts b/e2e/privacyWithPro.spec.ts index b037e9f6d..f303d3094 100644 --- a/e2e/privacyWithPro.spec.ts +++ b/e2e/privacyWithPro.spec.ts @@ -1,4 +1,3 @@ -import { expect } from '@playwright/test'; import { getProjects } from './page-objects/helperBase.ts'; import { test } from './fixtures/test-options.ts'; @@ -7,14 +6,12 @@ const projects = getProjects(); for (const project of projects) { test(`As PRO user, I can go to ${project.title}, open Privacy tab, analyze this page, verify cookies page`, async ({ pageManager, - page, context, }) => { await pageManager.atBrowser.openProject(project, { skipCookieBanner: true }); - await pageManager.fromNavigationMenu.goToPrivacyPage(); + await pageManager.atNavigationMenu.clickButtonToOpenPage('Privacy'); await pageManager.atBrowser.waitForUrlToMatchPattern(/privacy/); - // TO DO: activate this check once 19103 issue is done - // expect(page.url()).toContain('autotests'); + pageManager.atBrowser.checkCampaignIsAutotest(); await pageManager.atPrivacyPage.checkTitles( [ 'Privacy Policy for EU/UK Residents', @@ -28,8 +25,7 @@ for (const project of projects) { ); // Specify links to check at links-privacy.json file await pageManager.atPrivacyPage.checkLinks(context); - // TO DO: activate this check once 19103 issue is done - // expect(page.url()).toContain('autotests'); + pageManager.atBrowser.checkCampaignIsAutotest(); await pageManager.atPrivacyPage.openAndVerifyCookiesPage(); }); } diff --git a/e2e/privacyWithUser.spec.ts b/e2e/privacyWithUser.spec.ts index 967cbb7e3..12b446f35 100644 --- a/e2e/privacyWithUser.spec.ts +++ b/e2e/privacyWithUser.spec.ts @@ -1,4 +1,3 @@ -import { expect } from '@playwright/test'; import { getProjects } from './page-objects/helperBase.ts'; import { test } from './fixtures/test-options.ts'; @@ -7,14 +6,12 @@ const projects = getProjects(); for (const project of projects) { test(`As User with no rights, I can go to ${project.title}, open Privacy tab, analyze this page, verify cookies page`, async ({ pageManager, - page, context, }) => { await pageManager.atBrowser.openProject(project, { skipCookieBanner: true }); - await pageManager.fromNavigationMenu.goToPrivacyPage(); + await pageManager.atNavigationMenu.clickButtonToOpenPage('Privacy'); await pageManager.atBrowser.waitForUrlToMatchPattern(/privacy/); - // TO DO: activate this check once 19103 issue is done - // expect(page.url()).toContain('autotests'); + pageManager.atBrowser.checkCampaignIsAutotest(); await pageManager.atPrivacyPage.checkTitles( [ 'Privacy Policy for EU/UK Residents', @@ -28,8 +25,7 @@ for (const project of projects) { ); // Specify links to check at links-privacy.json file await pageManager.atPrivacyPage.checkLinks(context); - // TO DO: activate this check once 19103 issue is done - // expect(page.url()).toContain('autotests'); + pageManager.atBrowser.checkCampaignIsAutotest(); await pageManager.atPrivacyPage.openAndVerifyCookiesPage(); }); } diff --git a/e2e/registration.spec.ts b/e2e/registration.spec.ts index b86c1dcff..6fabf415e 100644 --- a/e2e/registration.spec.ts +++ b/e2e/registration.spec.ts @@ -28,7 +28,7 @@ for (const project of projects) { const password = faker.internet.password({ length: 12 }); await pageManager.atBrowser.openProject(project); - await pageManager.fromNavigationMenu.goToLoginPage(); + await pageManager.atNavigationMenu.clickButtonToOpenPage('Login'); const keycloakPage = await pageManager.atLoginPage.clickSignUpAndNavigateToKeycloak(context); @@ -66,7 +66,7 @@ for (const project of projects) { }); await pageManager.atBrowser.openProject(project, { skipCookieBanner: true }); - await pageManager.fromNavigationMenu.goToLoginPage(); + await pageManager.atNavigationMenu.clickButtonToOpenPage('Login'); await pageManager.atLoginPage.typeLoginPasswordAndLogin(email, password, { project, shouldSuccess: true, diff --git a/e2e/reload.spec.ts b/e2e/reload.spec.ts index 0eeb3ada8..767a16617 100644 --- a/e2e/reload.spec.ts +++ b/e2e/reload.spec.ts @@ -1,4 +1,3 @@ -import { expect } from '@playwright/test'; import { test } from './fixtures/test-options.ts'; import { getProjects } from './page-objects/helperBase.ts'; @@ -7,26 +6,23 @@ const projects = getProjects(); for (const project of projects) { test.describe(`As Guest, I can reload the page of ${project.title} and see the info kept`, () => { if (project.name !== 'atlas') { - test(`Url of map is still the same`, async ({ page, pageManager }) => { + test(`Url of map is still the same`, async ({ pageManager }) => { await pageManager.atBrowser.openProject(project, { skipCookieBanner: true }); - await pageManager.fromNavigationMenu.goToMap(); + await pageManager.atNavigationMenu.clickButtonToOpenPage('Map'); if (project.name !== 'disaster-ninja') await pageManager.atBrowser.waitForUrlToMatchPattern(/map=/); - // TO DO: activate this check once 19103 issue is done - // expect(page.url()).toContain('autotests'); + pageManager.atBrowser.checkCampaignIsAutotest(); await pageManager.atMap.compareUrlsAfterReload(project); - // TO DO: activate this check once 19103 issue is done - // expect(page.url()).toContain('autotests'); + pageManager.atBrowser.checkCampaignIsAutotest(); }); } else { - test(`Map is not accessible`, async ({ page, pageManager }) => { + test(`Map is not accessible`, async ({ pageManager }) => { await pageManager.atBrowser.openProject(project, { skipCookieBanner: true }); - await pageManager.fromNavigationMenu.checkThereIsNoMap(); - // TO DO: activate this checks once 19103 issue is done - // expect(page.url()).toContain('autotests'); - // await pageManager.atLoginPage.compareUrlsAfterReload(project); - // expect(page.url()).toContain('autotests'); - // await pageManager.fromNavigationMenu.checkThereIsNoMap(); + await pageManager.atNavigationMenu.checkThereIsNoMap(); + pageManager.atBrowser.checkCampaignIsAutotest(); + await pageManager.atLoginPage.compareUrlsAfterReload(project); + pageManager.atBrowser.checkCampaignIsAutotest(); + await pageManager.atNavigationMenu.checkThereIsNoMap(); }); } }); diff --git a/e2e/reloadWithPro.spec.ts b/e2e/reloadWithPro.spec.ts index 2c45db268..2cabc3a31 100644 --- a/e2e/reloadWithPro.spec.ts +++ b/e2e/reloadWithPro.spec.ts @@ -14,25 +14,21 @@ for (const project of projects) { browserName === 'webkit', 'Fix issue https://kontur.fibery.io/Tasks/Task/FE-Application-adds-reference-area-focused-geometry-parameters-in-url-too-late-(Safari-browser)-19487 to activate this test', ); - await pageManager.fromNavigationMenu.goToMap(); + await pageManager.atNavigationMenu.clickButtonToOpenPage('Map'); if (project.name !== 'disaster-ninja') await pageManager.atBrowser.waitForUrlToMatchPattern(/map=/); - // TO DO: activate this check once 19103 issue is done - // expect(page.url()).toContain('autotests'); + pageManager.atBrowser.checkCampaignIsAutotest(); await pageManager.atMap.compareUrlsAfterReload(project); - // TO DO: activate this check once 19103 issue is done - // expect(page.url()).toContain('autotests'); + pageManager.atBrowser.checkCampaignIsAutotest(); }); - test('My profile has the same data', async ({ page, pageManager }) => { - await pageManager.fromNavigationMenu.goToProfilePage(); + test('My profile has the same data', async ({ pageManager }) => { + await pageManager.atNavigationMenu.clickButtonToOpenPage('Profile'); const settingsValues = await pageManager.atProfilePage.getProfileData(project, { shouldOsmEditorBeSeenOnAtlas: true, }); - // TO DO: activate this check once 19103 issue is done - // expect(page.url()).toContain('autotests'); + pageManager.atBrowser.checkCampaignIsAutotest(); await pageManager.atProfilePage.compareUrlsAfterReload(project); - // TO DO: activate this check once 19103 issue is done - // expect(page.url()).toContain('autotests'); + pageManager.atBrowser.checkCampaignIsAutotest(); const settingsValuesAfterReload = await pageManager.atProfilePage.getProfileData( project, { shouldOsmEditorBeSeenOnAtlas: true }, diff --git a/e2e/reloadWithUser.spec.ts b/e2e/reloadWithUser.spec.ts index e936d692a..2859a6960 100644 --- a/e2e/reloadWithUser.spec.ts +++ b/e2e/reloadWithUser.spec.ts @@ -11,32 +11,29 @@ for (const project of projects) { }); if (project.name !== 'atlas') { test(`Url of map is still the same`, async ({ pageManager }) => { - await pageManager.fromNavigationMenu.goToMap(); + await pageManager.atNavigationMenu.clickButtonToOpenPage('Map'); if (project.name !== 'disaster-ninja') await pageManager.atBrowser.waitForUrlToMatchPattern(/map=/); await pageManager.atMap.compareUrlsAfterReload(project); }); } else { - test(`Map is not accessible`, async ({ page, pageManager }) => { + test(`Map is not accessible`, async ({ pageManager }) => { await pageManager.atBrowser.openProject(project, { skipCookieBanner: true }); - await pageManager.fromNavigationMenu.checkThereIsNoMap(); - // TO DO: activate this checks once 19103 issue is done - // expect(page.url()).toContain('autotests'); - // await pageManager.atLoginPage.compareUrlsAfterReload(project); - // await pageManager.fromNavigationMenu.checkThereIsNoMap(); - // expect(page.url()).toContain('autotests'); + await pageManager.atNavigationMenu.checkThereIsNoMap(); + pageManager.atBrowser.checkCampaignIsAutotest(); + await pageManager.atLoginPage.compareUrlsAfterReload(project); + await pageManager.atNavigationMenu.checkThereIsNoMap(); + pageManager.atBrowser.checkCampaignIsAutotest(); }); } - test('My profile has the same data', async ({ page, pageManager }) => { - await pageManager.fromNavigationMenu.goToProfilePage(); + test('My profile has the same data', async ({ pageManager }) => { + await pageManager.atNavigationMenu.clickButtonToOpenPage('Profile'); const settingsValues = await pageManager.atProfilePage.getProfileData(project, { shouldOsmEditorBeSeenOnAtlas: true, }); - // TO DO: activate this check once 19103 issue is done - // expect(page.url()).toContain('autotests'); + pageManager.atBrowser.checkCampaignIsAutotest(); await pageManager.atProfilePage.compareUrlsAfterReload(project); - // TO DO: activate this check once 19103 issue is done - // expect(page.url()).toContain('autotests'); + pageManager.atBrowser.checkCampaignIsAutotest(); const settingsValuesAfterReload = await pageManager.atProfilePage.getProfileData( project, { shouldOsmEditorBeSeenOnAtlas: true }, diff --git a/e2e/toolBarTexts.spec.ts b/e2e/toolBarTexts.spec.ts index dc101175e..bd6597fa2 100644 --- a/e2e/toolBarTexts.spec.ts +++ b/e2e/toolBarTexts.spec.ts @@ -39,7 +39,7 @@ for (const project of projects) { if (project.name === 'atlas') { await pageManager.atMap.goToSpecificAreaByUrl(5, 134, 80, project); } else { - await pageManager.fromNavigationMenu.goToMap(); + await pageManager.atNavigationMenu.clickButtonToOpenPage('Map'); } if (project.name !== 'atlas') { diff --git a/e2e/toolBarTextsWithPro.spec.ts b/e2e/toolBarTextsWithPro.spec.ts index b16595b7c..c3e7755e3 100644 --- a/e2e/toolBarTextsWithPro.spec.ts +++ b/e2e/toolBarTextsWithPro.spec.ts @@ -106,7 +106,7 @@ for (const project of projects) { } await pageManager.atBrowser.openProject(project, { skipCookieBanner: true }); - await pageManager.fromNavigationMenu.goToMap(); + await pageManager.atNavigationMenu.clickButtonToOpenPage('Map'); await pageManager.atToolBar.checkTextsAndTooltipsInToolbar(visibleTexts, hiddenTexts); await pageManager.atToolBar.resizeToolbar({ collapse: true }); await pageManager.atToolBar.checkTooltipsInShortToolbar( diff --git a/e2e/toolBarTextsWithUser.spec.ts b/e2e/toolBarTextsWithUser.spec.ts index ee7b573c3..2a59e4293 100644 --- a/e2e/toolBarTextsWithUser.spec.ts +++ b/e2e/toolBarTextsWithUser.spec.ts @@ -62,10 +62,11 @@ for (const project of projects) { } await pageManager.atBrowser.openProject(project, { skipCookieBanner: true }); + // Atlas project has no map page at navigation menu if (project.name === 'atlas') { await pageManager.atMap.goToSpecificAreaByUrl(5, 134, 80, project); } else { - await pageManager.fromNavigationMenu.goToMap(); + await pageManager.atNavigationMenu.clickButtonToOpenPage('Map'); } if (project.name !== 'atlas') { diff --git a/src/features/side_bar/components/SideBar/SideBar.tsx b/src/features/side_bar/components/SideBar/SideBar.tsx index 0eaf7ddd5..4d0464970 100644 --- a/src/features/side_bar/components/SideBar/SideBar.tsx +++ b/src/features/side_bar/components/SideBar/SideBar.tsx @@ -48,7 +48,10 @@ export function SideBar({ }, [isOpen]); return ( -
+
{availableRoutes && (