diff --git a/tests/end2end/playwright/axis_orientation.spec.js b/tests/end2end/playwright/axis_orientation.spec.js index 4324f9242b..c8022b0cc0 100644 --- a/tests/end2end/playwright/axis_orientation.spec.js +++ b/tests/end2end/playwright/axis_orientation.spec.js @@ -1,12 +1,16 @@ // @ts-check import { test, expect } from '@playwright/test'; -import { gotoMap } from './globals'; +import {ProjectPage} from "./pages/project"; +import {expectParametersToContain} from "./globals"; -test.describe('Axis Orientation', () => { +test.describe('Axis Orientation', + { + tag: ['@readonly'], + },() => { test('Axis Orientation NEU for EPSG:3044', async ({ page }) => { - const url = '/index.php/view/map/?repository=testsrepository&project=axis_orientation_neu_3044'; - await gotoMap(url, page) + const project = new ProjectPage(page, 'axis_orientation_neu_3044'); + await project.open(); // Get blank buffer let buffer = await page.screenshot({clip:{x:950/2-380/2, y:600/2-380/2, width:380, height:380}}); @@ -18,17 +22,21 @@ test.describe('Axis Orientation', () => { await page.getByLabel('Bundesländer').check(); const getMapRequest = await getMapPromise; const getMapUrl = getMapRequest.url(); - expect(getMapUrl).toContain('SERVICE=WMS'); - expect(getMapUrl).toContain('VERSION=1.3.0'); - expect(getMapUrl).toContain('REQUEST=GetMap'); - expect(getMapUrl).toContain('FORMAT=image%2Fpng'); - expect(getMapUrl).toContain('TRANSPARENT=TRUE'); - expect(getMapUrl).toContain('LAYERS=Bundeslander'); - expect(getMapUrl).toContain('CRS=EPSG%3A3044'); - expect(getMapUrl).toContain('STYLES=default'); - expect(getMapUrl).toContain('WIDTH=958'); - expect(getMapUrl).toContain('HEIGHT=633'); - expect(getMapUrl).toMatch(/BBOX=5276843.28\d+%2C-14455.54\d+%2C6114251.21\d+%2C1252901.15\d+/); + const expectedParameters = { + 'SERVICE': 'WMS', + 'VERSION': '1.3.0', + 'REQUEST': 'GetMap', + 'FORMAT': 'image/png', + 'TRANSPARENT': /\b(\w*^true$\w*)\b/gmi, + 'CRS': 'EPSG:3044', + 'LAYERS': 'Bundeslander', + 'STYLES': 'default', + 'WIDTH': '958', + 'HEIGHT': '633', + 'BBOX': /5276843.28\d+%2C-14455.54\d+%2C6114251.21\d+%2C1252901.15\d+/, + } + let getMapParams = await expectParametersToContain('GetMap', getMapUrl, expectedParameters) + await expect(getMapParams.size).toBe(15) const getMapResponse = await getMapRequest.response(); expect(getMapResponse).not.toBeNull(); @@ -42,13 +50,13 @@ test.describe('Axis Orientation', () => { const bundeslanderByteLength = buffer.byteLength; await expect(bundeslanderByteLength).toBeGreaterThan(blankByteLength); - // Catch GetTile request; + // Catch GetTile request let GetTiles = []; await page.route('https://tile.openstreetmap.org/*/*/*.png', (route) => { const request = route.request(); GetTiles.push(request.url()); }, { times: 6 }); - await page.locator('#switcher-baselayer').getByRole('combobox').selectOption('OpenStreetMap'); + await project.baseLayerSelect.selectOption('OpenStreetMap'); while (GetTiles.length < 6) { await page.waitForTimeout(100); } @@ -72,8 +80,8 @@ test.describe('Axis Orientation', () => { }); test('Axis Orientation NEU for EPSG:3844', async ({ page }) => { - const url = '/index.php/view/map/?repository=testsrepository&project=axis_orientation_neu_3844'; - await gotoMap(url, page) + const project = new ProjectPage(page, 'axis_orientation_neu_3044'); + await project.open(); // Get blank buffer let buffer = await page.screenshot({clip:{x:950/2-380/2, y:600/2-380/2, width:380, height:380}}); @@ -85,17 +93,21 @@ test.describe('Axis Orientation', () => { await page.getByLabel('județ').check(); const getMapRequest = await getMapPromise; const getMapUrl = getMapRequest.url(); - expect(getMapUrl).toContain('SERVICE=WMS'); - expect(getMapUrl).toContain('VERSION=1.3.0'); - expect(getMapUrl).toContain('REQUEST=GetMap'); - expect(getMapUrl).toContain('FORMAT=image%2Fpng'); - expect(getMapUrl).toContain('TRANSPARENT=TRUE'); - expect(getMapUrl).toContain('LAYERS=judet'); - expect(getMapUrl).toContain('CRS=EPSG%3A3844'); - expect(getMapUrl).toContain('STYLES=default'); - expect(getMapUrl).toContain('WIDTH=958'); - expect(getMapUrl).toContain('HEIGHT=633'); - expect(getMapUrl).toMatch(/BBOX=72126.00\d+%2C-122200.57\d+%2C909533.92\d+%2C1145156.12\d+/); + const expectedParameters = { + 'SERVICE': 'WMS', + 'VERSION': '1.3.0', + 'REQUEST': 'GetMap', + 'FORMAT': 'image/png', + 'TRANSPARENT': /\b(\w*^true$\w*)\b/gmi, + 'CRS': 'EPSG:3844', + 'LAYERS': 'judet', + 'STYLES': 'default', + 'WIDTH': '958', + 'HEIGHT': '633', + 'BBOX': /72126.00\d+%2C-122200.57\d+%2C909533.92\d+%2C1145156.12\d+/, + } + let getMapParams = await expectParametersToContain('GetMap', getMapUrl, expectedParameters) + await expect(getMapParams.size).toBe(15) const getMapResponse = await getMapRequest.response(); expect(getMapResponse).not.toBeNull(); @@ -111,13 +123,13 @@ test.describe('Axis Orientation', () => { const judetByteLength = buffer.byteLength; await expect(judetByteLength).toBeGreaterThan(blankByteLength); - // Catch GetTile request; + // Catch GetTile request let GetTiles = []; await page.route('https://tile.openstreetmap.org/*/*/*.png', (route) => { const request = route.request(); GetTiles.push(request.url()); }, { times: 6 }); - await page.locator('#switcher-baselayer').getByRole('combobox').selectOption('OpenStreetMap'); + await project.baseLayerSelect.selectOption('OpenStreetMap'); while (GetTiles.length < 6) { await page.waitForTimeout(100); } diff --git a/tests/end2end/playwright/globals.js b/tests/end2end/playwright/globals.js index 7aba31eb3f..53329d8783 100644 --- a/tests/end2end/playwright/globals.js +++ b/tests/end2end/playwright/globals.js @@ -140,21 +140,37 @@ export async function getEchoRequestParams(page, url) { /** * Check parameters against an object containing expected parameters - * @param {string} label + * @param {string} title Check title, for testing and debug * @param {string} parameters * @param {Object} expectedParameters * @returns {Promise} */ -export async function expectParametersToContain(label, parameters, expectedParameters) { +export async function expectParametersToContain(title, parameters, expectedParameters) { const searchParams = new URLSearchParams(parameters) - await expect(searchParams.size, label + ': Not enough parameters compared to expected!').toBeGreaterThanOrEqual(Object.keys(expectedParameters).length) + + await expect( + searchParams.size, + `Check "${title}" : Not enough parameters compared to expected!` + ).toBeGreaterThanOrEqual(Object.keys(expectedParameters).length) + for (const param in expectedParameters) { - await expect(searchParams.has(param), label + ': ' + param + ' not in ' + Array.from(searchParams.keys()).join(', ')).toBe(true) + await expect( + searchParams.has(param), + `Check "${title}" : ${param} not in ${Array.from(searchParams.keys()).join(', ')}` + ).toBe(true) + const expectedValue = expectedParameters[param] if (expectedValue instanceof RegExp) { - await expect(searchParams.get(param), label + ': ' + param + ' does not match the expected value!').toMatch(expectedValue) + await expect( + searchParams.get(param), + `Title "${title}" : ${param} does not match the expected value!` + ).toMatch(expectedValue) + } else { - await expect(searchParams.get(param), label + ': ' + param + ' has not the right value!').toBe(expectedValue) + await expect( + searchParams.get(param), + `Title "${title}" : ${param} has not the right value!` + ).toBe(expectedValue) } } diff --git a/tests/end2end/playwright/pages/project.js b/tests/end2end/playwright/pages/project.js index 1c7a8876d4..e10cd12c6d 100644 --- a/tests/end2end/playwright/pages/project.js +++ b/tests/end2end/playwright/pages/project.js @@ -44,6 +44,11 @@ export class ProjectPage extends BasePage { * @type {Locator} */ switcher; + /** + * Base layer select + * @type {Locator} + */ + baseLayerSelect; /** * Editing menu * @type {Locator} @@ -130,6 +135,7 @@ export class ProjectPage extends BasePage { this.warningMessage = page.locator('#lizmap-warning-message'); this.search = page.locator('#search-query'); this.switcher = page.locator('#button-switcher'); + this.baseLayerSelect = this.switcher.locator('#switcher-baselayer').getByRole('combobox') this.buttonEditing = page.locator('#button-edition'); }