From 808f5681a96b18f65d71482b7f5cbb201057f584 Mon Sep 17 00:00:00 2001 From: Aliaksei Murashka Date: Thu, 23 May 2024 16:26:06 +0200 Subject: [PATCH 1/5] added open OSM tests --- e2e/openOsm.spec.ts | 29 +++++++++++++++++++++++++++++ e2e/openOsmWithUser.spec.ts | 29 +++++++++++++++++++++++++++++ e2e/page-objects/mapPage.ts | 24 ++++++++++++++++++++++-- 3 files changed, 80 insertions(+), 2 deletions(-) create mode 100644 e2e/openOsm.spec.ts create mode 100644 e2e/openOsmWithUser.spec.ts diff --git a/e2e/openOsm.spec.ts b/e2e/openOsm.spec.ts new file mode 100644 index 000000000..00cf32002 --- /dev/null +++ b/e2e/openOsm.spec.ts @@ -0,0 +1,29 @@ +import { expect } from '@playwright/test'; +import { test } from './fixtures/test-options.ts'; +import { getProjects } from './page-objects/helperBase.ts'; + +const projects = getProjects(); + +for (const project of projects) { + test(`As Guest, I can go to ${project.title}, open map and open OSM at map coordinates`, async ({ + context, + pageManager, + }) => { + await pageManager.atBrowser.openProject(project); + await pageManager.fromNavigationMenu.goToMap(); + + // TO DO: remove this action after 18582 issue is fixed + await pageManager.atMap.goToSpecificAreaByUrl(10.597, 53.9196, 27.5097, project); + + const coordinates = await pageManager.atMap.getIntegerCoordinatesFromUrl(); + + // Start waiting for new page being opened + const newPagePromise = context.waitForEvent('page'); + + await (await pageManager.atToolBar.getButtonByText('Edit map in OSM')).click(); + const newPage = await newPagePromise; + await pageManager.atMap.waitForUrlToMatchPattern(/openstreetmap/, newPage); + const osmCoordinates = await pageManager.atMap.getIntegerCoordinatesFromUrl(newPage); + expect(osmCoordinates).toStrictEqual(coordinates); + }); +} diff --git a/e2e/openOsmWithUser.spec.ts b/e2e/openOsmWithUser.spec.ts new file mode 100644 index 000000000..c20070475 --- /dev/null +++ b/e2e/openOsmWithUser.spec.ts @@ -0,0 +1,29 @@ +import { expect } from '@playwright/test'; +import { test } from './fixtures/test-options.ts'; +import { getProjects } from './page-objects/helperBase.ts'; + +const projects = getProjects(); + +for (const project of projects) { + test(`As User with no rights, I can go to ${project.title}, open map and open Rapid OSM editor at map coordinates`, async ({ + context, + pageManager, + }) => { + await pageManager.atBrowser.openProject(project, { skipCookieBanner: true }); + await pageManager.fromNavigationMenu.goToMap(); + + // TO DO: remove this action after 18582 issue is fixed + await pageManager.atMap.goToSpecificAreaByUrl(10.597, 53.9196, 27.5097, project); + + const coordinates = await pageManager.atMap.getIntegerCoordinatesFromUrl(); + + // Start waiting for new page being opened + const newPagePromise = context.waitForEvent('page'); + + await (await pageManager.atToolBar.getButtonByText('Edit map in OSM')).click(); + const newPage = await newPagePromise; + await pageManager.atMap.waitForUrlToMatchPattern(/rapideditor/, newPage); + const osmCoordinates = await pageManager.atMap.getIntegerCoordinatesFromUrl(newPage); + expect(osmCoordinates).toStrictEqual(coordinates); + }); +} diff --git a/e2e/page-objects/mapPage.ts b/e2e/page-objects/mapPage.ts index e109d2403..f2f5b25e3 100644 --- a/e2e/page-objects/mapPage.ts +++ b/e2e/page-objects/mapPage.ts @@ -1,5 +1,6 @@ import { expect } from '@playwright/test'; import { HelperBase } from './helperBase'; +import type { Page } from '@playwright/test'; import type { Project } from './helperBase'; export class MapCanvas extends HelperBase { @@ -42,10 +43,11 @@ export class MapCanvas extends HelperBase { /** * This method waits for URL to match specific regexp pattern. It is mostly useful for testing maps. * @param pattern value for url to have inside in form of RegExp + * @param page playwright page to wait for */ - async waitForUrlToMatchPattern(pattern: RegExp) { - await this.page.waitForURL(pattern); + async waitForUrlToMatchPattern(pattern: RegExp, page: Page = this.page) { + await page.waitForURL(pattern); } /** @@ -112,4 +114,22 @@ export class MapCanvas extends HelperBase { ).not.toBeVisible(); await expect(this.page.locator('#map-view')).toBeVisible(); } + + /** + * This method gets current url coordinates and returns its integer parts + * @param page playwright page to get url from + * @returns object with zoom, latitude, longitude. Integer values at string format + */ + + async getIntegerCoordinatesFromUrl(page: Page = this.page) { + const currentUrlCutParams = page.url().split('map=')[1].split('/'); + const [zoom, latitude] = currentUrlCutParams; + const longitude = currentUrlCutParams[2].split('&')[0]; + const getIntegerPart = (value: string) => value.split('.')[0]; + return { + zoomInteger: getIntegerPart(zoom), + latitudeInteger: getIntegerPart(latitude), + longitudeInteger: getIntegerPart(longitude), + }; + } } From 8514b77c78708b464c1ca952549b6be78f5a00d1 Mon Sep 17 00:00:00 2001 From: Aliaksei Murashka Date: Fri, 24 May 2024 16:18:09 +0200 Subject: [PATCH 2/5] fix to use URL constructor --- e2e/openOsm.spec.ts | 4 +++- e2e/openOsmWithUser.spec.ts | 4 +++- e2e/page-objects/mapPage.ts | 32 ++++++++++++++++++++++++-------- 3 files changed, 30 insertions(+), 10 deletions(-) diff --git a/e2e/openOsm.spec.ts b/e2e/openOsm.spec.ts index 00cf32002..cb787d6d6 100644 --- a/e2e/openOsm.spec.ts +++ b/e2e/openOsm.spec.ts @@ -23,7 +23,9 @@ for (const project of projects) { await (await pageManager.atToolBar.getButtonByText('Edit map in OSM')).click(); const newPage = await newPagePromise; await pageManager.atMap.waitForUrlToMatchPattern(/openstreetmap/, newPage); - const osmCoordinates = await pageManager.atMap.getIntegerCoordinatesFromUrl(newPage); + const osmCoordinates = await pageManager.atMap.getIntegerCoordinatesFromUrl(newPage, { + isMapInHash: true, + }); expect(osmCoordinates).toStrictEqual(coordinates); }); } diff --git a/e2e/openOsmWithUser.spec.ts b/e2e/openOsmWithUser.spec.ts index c20070475..1d8b911ea 100644 --- a/e2e/openOsmWithUser.spec.ts +++ b/e2e/openOsmWithUser.spec.ts @@ -23,7 +23,9 @@ for (const project of projects) { await (await pageManager.atToolBar.getButtonByText('Edit map in OSM')).click(); const newPage = await newPagePromise; await pageManager.atMap.waitForUrlToMatchPattern(/rapideditor/, newPage); - const osmCoordinates = await pageManager.atMap.getIntegerCoordinatesFromUrl(newPage); + const osmCoordinates = await pageManager.atMap.getIntegerCoordinatesFromUrl(newPage, { + isMapInHash: true, + }); expect(osmCoordinates).toStrictEqual(coordinates); }); } diff --git a/e2e/page-objects/mapPage.ts b/e2e/page-objects/mapPage.ts index f2f5b25e3..df474eda1 100644 --- a/e2e/page-objects/mapPage.ts +++ b/e2e/page-objects/mapPage.ts @@ -3,6 +3,10 @@ import { HelperBase } from './helperBase'; import type { Page } from '@playwright/test'; import type { Project } from './helperBase'; +type UrlOptions = { + isMapInHash?: boolean; +}; + export class MapCanvas extends HelperBase { /** * Splits the provided text by ':' and checks the resulting parts. The first part should match the expected label, and the second part should be a number that is not NaN. Additionally, if the value cannot be zero, this is also checked. @@ -121,15 +125,27 @@ export class MapCanvas extends HelperBase { * @returns object with zoom, latitude, longitude. Integer values at string format */ - async getIntegerCoordinatesFromUrl(page: Page = this.page) { - const currentUrlCutParams = page.url().split('map=')[1].split('/'); - const [zoom, latitude] = currentUrlCutParams; - const longitude = currentUrlCutParams[2].split('&')[0]; - const getIntegerPart = (value: string) => value.split('.')[0]; + async getIntegerCoordinatesFromUrl( + page: Page = this.page, + { isMapInHash = false }: UrlOptions = {}, + ) { + const urlObj = new URL(page.url()); + const mapData = isMapInHash + ? urlObj.hash.replace('#map=', '') + : urlObj.searchParams.get('map'); + + expect(mapData).not.toBeNull(); + expect(mapData).not.toBe(''); + + const [zoom, latitude, longitude] = mapData!.split('/').map(Number); + expect(zoom).not.toBeNaN(); + expect(latitude).not.toBeNaN(); + expect(longitude).not.toBeNaN(); + return { - zoomInteger: getIntegerPart(zoom), - latitudeInteger: getIntegerPart(latitude), - longitudeInteger: getIntegerPart(longitude), + zoomInteger: Math.trunc(zoom), + latitudeInteger: Math.trunc(latitude), + longitudeInteger: Math.trunc(longitude), }; } } From 671d8d84656c487c92575ad0ddd519ba69860aa2 Mon Sep 17 00:00:00 2001 From: Aliaksei Murashka Date: Fri, 24 May 2024 16:29:29 +0200 Subject: [PATCH 3/5] add space --- e2e/openOsm.spec.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/e2e/openOsm.spec.ts b/e2e/openOsm.spec.ts index cb787d6d6..b99c1e8a4 100644 --- a/e2e/openOsm.spec.ts +++ b/e2e/openOsm.spec.ts @@ -22,6 +22,7 @@ for (const project of projects) { await (await pageManager.atToolBar.getButtonByText('Edit map in OSM')).click(); const newPage = await newPagePromise; + await pageManager.atMap.waitForUrlToMatchPattern(/openstreetmap/, newPage); const osmCoordinates = await pageManager.atMap.getIntegerCoordinatesFromUrl(newPage, { isMapInHash: true, From a085b800de67b449b487b233927ddeab501569df Mon Sep 17 00:00:00 2001 From: Aliaksei Murashka Date: Fri, 24 May 2024 18:08:41 +0200 Subject: [PATCH 4/5] fix to go back to split method --- e2e/openOsm.spec.ts | 4 +--- e2e/openOsmWithUser.spec.ts | 4 +--- e2e/page-objects/mapPage.ts | 20 ++++---------------- 3 files changed, 6 insertions(+), 22 deletions(-) diff --git a/e2e/openOsm.spec.ts b/e2e/openOsm.spec.ts index b99c1e8a4..259da9751 100644 --- a/e2e/openOsm.spec.ts +++ b/e2e/openOsm.spec.ts @@ -24,9 +24,7 @@ for (const project of projects) { const newPage = await newPagePromise; await pageManager.atMap.waitForUrlToMatchPattern(/openstreetmap/, newPage); - const osmCoordinates = await pageManager.atMap.getIntegerCoordinatesFromUrl(newPage, { - isMapInHash: true, - }); + const osmCoordinates = await pageManager.atMap.getIntegerCoordinatesFromUrl(newPage); expect(osmCoordinates).toStrictEqual(coordinates); }); } diff --git a/e2e/openOsmWithUser.spec.ts b/e2e/openOsmWithUser.spec.ts index 1d8b911ea..c20070475 100644 --- a/e2e/openOsmWithUser.spec.ts +++ b/e2e/openOsmWithUser.spec.ts @@ -23,9 +23,7 @@ for (const project of projects) { await (await pageManager.atToolBar.getButtonByText('Edit map in OSM')).click(); const newPage = await newPagePromise; await pageManager.atMap.waitForUrlToMatchPattern(/rapideditor/, newPage); - const osmCoordinates = await pageManager.atMap.getIntegerCoordinatesFromUrl(newPage, { - isMapInHash: true, - }); + const osmCoordinates = await pageManager.atMap.getIntegerCoordinatesFromUrl(newPage); expect(osmCoordinates).toStrictEqual(coordinates); }); } diff --git a/e2e/page-objects/mapPage.ts b/e2e/page-objects/mapPage.ts index df474eda1..c303e33d9 100644 --- a/e2e/page-objects/mapPage.ts +++ b/e2e/page-objects/mapPage.ts @@ -3,10 +3,6 @@ import { HelperBase } from './helperBase'; import type { Page } from '@playwright/test'; import type { Project } from './helperBase'; -type UrlOptions = { - isMapInHash?: boolean; -}; - export class MapCanvas extends HelperBase { /** * Splits the provided text by ':' and checks the resulting parts. The first part should match the expected label, and the second part should be a number that is not NaN. Additionally, if the value cannot be zero, this is also checked. @@ -122,20 +118,12 @@ export class MapCanvas extends HelperBase { /** * This method gets current url coordinates and returns its integer parts * @param page playwright page to get url from - * @returns object with zoom, latitude, longitude. Integer values at string format + * @returns object with zoom, latitude, longitude. Integer values */ - async getIntegerCoordinatesFromUrl( - page: Page = this.page, - { isMapInHash = false }: UrlOptions = {}, - ) { - const urlObj = new URL(page.url()); - const mapData = isMapInHash - ? urlObj.hash.replace('#map=', '') - : urlObj.searchParams.get('map'); - - expect(mapData).not.toBeNull(); - expect(mapData).not.toBe(''); + async getIntegerCoordinatesFromUrl(page: Page = this.page) { + const mapData = page.url().split('map=')[1].split('&')[0]; + expect(mapData).toBeDefined(); const [zoom, latitude, longitude] = mapData!.split('/').map(Number); expect(zoom).not.toBeNaN(); From 7e55132cd886ccc23ef417cdba635afb757391e3 Mon Sep 17 00:00:00 2001 From: Aliaksei Murashka Date: Fri, 24 May 2024 21:29:19 +0200 Subject: [PATCH 5/5] rename method --- e2e/openOsm.spec.ts | 4 ++-- e2e/openOsmWithUser.spec.ts | 4 ++-- e2e/page-objects/mapPage.ts | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/e2e/openOsm.spec.ts b/e2e/openOsm.spec.ts index 259da9751..82f5b82a8 100644 --- a/e2e/openOsm.spec.ts +++ b/e2e/openOsm.spec.ts @@ -15,7 +15,7 @@ for (const project of projects) { // TO DO: remove this action after 18582 issue is fixed await pageManager.atMap.goToSpecificAreaByUrl(10.597, 53.9196, 27.5097, project); - const coordinates = await pageManager.atMap.getIntegerCoordinatesFromUrl(); + const coordinates = await pageManager.atMap.getViewportFromUrl(); // Start waiting for new page being opened const newPagePromise = context.waitForEvent('page'); @@ -24,7 +24,7 @@ for (const project of projects) { const newPage = await newPagePromise; await pageManager.atMap.waitForUrlToMatchPattern(/openstreetmap/, newPage); - const osmCoordinates = await pageManager.atMap.getIntegerCoordinatesFromUrl(newPage); + const osmCoordinates = await pageManager.atMap.getViewportFromUrl(newPage); expect(osmCoordinates).toStrictEqual(coordinates); }); } diff --git a/e2e/openOsmWithUser.spec.ts b/e2e/openOsmWithUser.spec.ts index c20070475..4d25325e3 100644 --- a/e2e/openOsmWithUser.spec.ts +++ b/e2e/openOsmWithUser.spec.ts @@ -15,7 +15,7 @@ for (const project of projects) { // TO DO: remove this action after 18582 issue is fixed await pageManager.atMap.goToSpecificAreaByUrl(10.597, 53.9196, 27.5097, project); - const coordinates = await pageManager.atMap.getIntegerCoordinatesFromUrl(); + const coordinates = await pageManager.atMap.getViewportFromUrl(); // Start waiting for new page being opened const newPagePromise = context.waitForEvent('page'); @@ -23,7 +23,7 @@ for (const project of projects) { await (await pageManager.atToolBar.getButtonByText('Edit map in OSM')).click(); const newPage = await newPagePromise; await pageManager.atMap.waitForUrlToMatchPattern(/rapideditor/, newPage); - const osmCoordinates = await pageManager.atMap.getIntegerCoordinatesFromUrl(newPage); + const osmCoordinates = await pageManager.atMap.getViewportFromUrl(newPage); expect(osmCoordinates).toStrictEqual(coordinates); }); } diff --git a/e2e/page-objects/mapPage.ts b/e2e/page-objects/mapPage.ts index c303e33d9..1e441eef1 100644 --- a/e2e/page-objects/mapPage.ts +++ b/e2e/page-objects/mapPage.ts @@ -121,7 +121,7 @@ export class MapCanvas extends HelperBase { * @returns object with zoom, latitude, longitude. Integer values */ - async getIntegerCoordinatesFromUrl(page: Page = this.page) { + async getViewportFromUrl(page: Page = this.page) { const mapData = page.url().split('map=')[1].split('&')[0]; expect(mapData).toBeDefined();