From 4552741516e6fdfbcc538986164d553dcf359f70 Mon Sep 17 00:00:00 2001 From: Princesa Yoreley Date: Thu, 14 May 2026 21:15:20 -0700 Subject: [PATCH 1/6] test: add playwright specs for displacement backlog --- e2e/displacement/delete-all-series.spec.ts | 33 +++++++++++++++ e2e/displacement/delete-series.spec.ts | 31 ++++++++++++++ e2e/displacement/draw-point.spec.ts | 27 ++++++++++++ .../flight-direction-toggle.spec.ts | 41 +++++++++++++++++++ e2e/displacement/highlight-series.spec.ts | 31 ++++++++++++++ e2e/displacement/no-points-selected.spec.ts | 17 ++++++++ .../select-multiple-points.spec.ts | 27 ++++++++++++ e2e/displacement/velocity-layer.spec.ts | 23 +++++++++++ 8 files changed, 230 insertions(+) create mode 100644 e2e/displacement/delete-all-series.spec.ts create mode 100644 e2e/displacement/delete-series.spec.ts create mode 100644 e2e/displacement/draw-point.spec.ts create mode 100644 e2e/displacement/flight-direction-toggle.spec.ts create mode 100644 e2e/displacement/highlight-series.spec.ts create mode 100644 e2e/displacement/no-points-selected.spec.ts create mode 100644 e2e/displacement/select-multiple-points.spec.ts create mode 100644 e2e/displacement/velocity-layer.spec.ts diff --git a/e2e/displacement/delete-all-series.spec.ts b/e2e/displacement/delete-all-series.spec.ts new file mode 100644 index 000000000..6b85fec6b --- /dev/null +++ b/e2e/displacement/delete-all-series.spec.ts @@ -0,0 +1,33 @@ +import { test, expect } from 'e2e/fixtures'; + +test('Displacement: deleting all series clears the AOI list', async ({ + page, +}) => { + await page.goto('/'); + + await page.getByRole('button', { name: 'Geographic Search' }).click(); + await page + .getByRole('menuitem', { name: 'Displacement Displacement' }) + .click(); + + const displacementResults = page.locator('app-timeseries-results-menu'); + const seriesItems = displacementResults.locator('li.point-list-item'); + const initialSeriesCount = await seriesItems.count(); + + await expect(page.getByRole('switch', { name: 'Draw' })).toBeChecked(); + + await page.mouse.click(800, 600); + + await expect(seriesItems).toHaveCount(initialSeriesCount + 1); + + const deleteAllSection = displacementResults.locator( + 'span.parent-checkbox-section', + ); + + await deleteAllSection.hover(); + await displacementResults.locator('button.delete-all-btn2').click(); + + await page.getByRole('button', { name: 'Delete', exact: true }).click(); + + await expect(seriesItems).toHaveCount(0); +}); diff --git a/e2e/displacement/delete-series.spec.ts b/e2e/displacement/delete-series.spec.ts new file mode 100644 index 000000000..0a4b3cd9d --- /dev/null +++ b/e2e/displacement/delete-series.spec.ts @@ -0,0 +1,31 @@ +import { test, expect } from 'e2e/fixtures'; + +test('Displacement: deleting a selected series removes it from the AOI list', async ({ + page, +}) => { + await page.goto('/'); + + await page.getByRole('button', { name: 'Geographic Search' }).click(); + await page + .getByRole('menuitem', { name: 'Displacement Displacement' }) + .click(); + + const displacementResults = page.locator('app-timeseries-results-menu'); + const seriesItems = displacementResults.locator('li.point-list-item'); + const initialSeriesCount = await seriesItems.count(); + + await expect(page.getByRole('switch', { name: 'Draw' })).toBeChecked(); + + await page.mouse.click(800, 600); + + await expect(seriesItems).toHaveCount(initialSeriesCount + 1); + + const newSeriesItem = seriesItems.last(); + + await newSeriesItem.click(); + await expect(newSeriesItem).toHaveClass(/ts-highlighted/); + + await newSeriesItem.getByRole('button').click(); + + await expect(seriesItems).toHaveCount(initialSeriesCount); +}); diff --git a/e2e/displacement/draw-point.spec.ts b/e2e/displacement/draw-point.spec.ts new file mode 100644 index 000000000..a7e96b5ab --- /dev/null +++ b/e2e/displacement/draw-point.spec.ts @@ -0,0 +1,27 @@ +import { test, expect } from 'e2e/fixtures'; + +test('Displacement: drawing a point adds a series to the AOI list', async ({ + page, +}) => { + await page.goto('/'); + + await page.getByRole('button', { name: 'Geographic Search' }).click(); + await page + .getByRole('menuitem', { name: 'Displacement Displacement' }) + .click(); + + const displacementResults = page.locator('app-timeseries-results-menu'); + const initialSeriesCount = await displacementResults + .locator('li.point-list-item') + .count(); + + const drawToggle = page.getByRole('switch', { name: 'Draw' }); + await expect(drawToggle).toBeChecked(); + + await page.mouse.click(800, 600); + + await expect(displacementResults.locator('li.point-list-item')).toHaveCount( + initialSeriesCount + 1, + ); + await expect(displacementResults).toContainText(/Series\s+\d+/); +}); diff --git a/e2e/displacement/flight-direction-toggle.spec.ts b/e2e/displacement/flight-direction-toggle.spec.ts new file mode 100644 index 000000000..b8e9e9232 --- /dev/null +++ b/e2e/displacement/flight-direction-toggle.spec.ts @@ -0,0 +1,41 @@ +import { test, expect } from 'e2e/fixtures'; + +test('Displacement: flight direction toggles between ascending and descending', async ({ + page, +}) => { + await page.goto('/'); + + await page.getByRole('button', { name: 'Geographic Search' }).click(); + await page + .getByRole('menuitem', { name: 'Displacement Displacement' }) + .click(); + + const flightDirectionToggle = page.locator( + 'app-timeseries-chart-flight-direction-toggle', + ); + const flightDirectionButton = + flightDirectionToggle.getByRole('button', { name: /Ascending/i }); + + await flightDirectionButton.focus(); + await page.keyboard.press('Enter'); + + const descendingMenuItem = page.getByRole('menuitem', { + name: 'Descending', + exact: true, + }); + await descendingMenuItem.click(); + + const descendingButton = flightDirectionToggle.getByRole('button', { + name: /Descending/i, + }); + + await descendingButton.focus(); + await page.keyboard.press('Enter'); + + const ascendingMenuItem = page.getByRole('menuitem', { + name: 'Ascending', + exact: true, + }); + await ascendingMenuItem.click(); + await expect(flightDirectionToggle.getByRole('button', { name: /Ascending/i })).toBeVisible(); +}); diff --git a/e2e/displacement/highlight-series.spec.ts b/e2e/displacement/highlight-series.spec.ts new file mode 100644 index 000000000..00bb7dce8 --- /dev/null +++ b/e2e/displacement/highlight-series.spec.ts @@ -0,0 +1,31 @@ +import { test, expect } from 'e2e/fixtures'; + +test('Displacement: selecting a series highlights it in the AOI list', async ({ + page, +}) => { + await page.goto('/'); + + await page.getByRole('button', { name: 'Geographic Search' }).click(); + await page + .getByRole('menuitem', { name: 'Displacement Displacement' }) + .click(); + + const displacementResults = page.locator('app-timeseries-results-menu'); + const initialSeriesCount = await displacementResults + .locator('li.point-list-item') + .count(); + + await expect(page.getByRole('switch', { name: 'Draw' })).toBeChecked(); + + await page.mouse.click(800, 600); + + await expect(displacementResults.locator('li.point-list-item')).toHaveCount( + initialSeriesCount + 1, + ); + + const newSeriesItem = displacementResults.locator('li.point-list-item').last(); + + await newSeriesItem.click(); + + await expect(newSeriesItem).toHaveClass(/ts-highlighted/); +}); diff --git a/e2e/displacement/no-points-selected.spec.ts b/e2e/displacement/no-points-selected.spec.ts new file mode 100644 index 000000000..c8fe43369 --- /dev/null +++ b/e2e/displacement/no-points-selected.spec.ts @@ -0,0 +1,17 @@ +import { test, expect } from 'e2e/fixtures'; + +test('Displacement: shows the empty state when no points are selected', async ({ + page, +}) => { + await page.goto('/'); + + await page.getByRole('button', { name: 'Geographic Search' }).click(); + await page + .getByRole('menuitem', { name: 'Displacement Displacement' }) + .click(); + + await expect(page.getByRole('tooltip', { name: 'Click point' })).toBeVisible(); + await expect( + page.locator('app-timeseries-results-menu').locator('li.point-list-item'), + ).toHaveCount(0); +}); diff --git a/e2e/displacement/select-multiple-points.spec.ts b/e2e/displacement/select-multiple-points.spec.ts new file mode 100644 index 000000000..24df8c137 --- /dev/null +++ b/e2e/displacement/select-multiple-points.spec.ts @@ -0,0 +1,27 @@ +import { test, expect } from 'e2e/fixtures'; + +test('Displacement: adding multiple points creates multiple series', async ({ + page, +}) => { + await page.goto('/'); + + await page.getByRole('button', { name: 'Geographic Search' }).click(); + await page + .getByRole('menuitem', { name: 'Displacement Displacement' }) + .click(); + + const displacementResults = page.locator('app-timeseries-results-menu'); + const seriesItems = displacementResults.locator('li.point-list-item'); + const initialSeriesCount = await seriesItems.count(); + + await expect(page.getByRole('switch', { name: 'Draw' })).toBeChecked(); + + await page.mouse.click(800, 600); + await expect(seriesItems).toHaveCount(initialSeriesCount + 1); + + await page.mouse.click(650, 400); + + await expect(seriesItems).toHaveCount(initialSeriesCount + 2); + await expect(displacementResults).toContainText(/Series 1\b/); + await expect(displacementResults).toContainText(/Series 2\b/); +}); diff --git a/e2e/displacement/velocity-layer.spec.ts b/e2e/displacement/velocity-layer.spec.ts new file mode 100644 index 000000000..5cb6f9d1f --- /dev/null +++ b/e2e/displacement/velocity-layer.spec.ts @@ -0,0 +1,23 @@ +import { test, expect } from 'e2e/fixtures'; + +test('Displacement: velocity layer is enabled by default and shows legend and opacity slider', async ({ + page, +}) => { + await page.goto('/'); + + await page.getByRole('button', { name: 'Geographic Search' }).click(); + await page + .getByRole('menuitem', { name: 'Displacement Displacement' }) + .click(); + + const displacementLayers = page.locator('app-displacement-layers'); + const velocityCheckbox = displacementLayers.getByRole('checkbox', { + name: /Velocity 2016-2024/i, + }); + + await expect(velocityCheckbox).toBeChecked(); + await expect(displacementLayers.locator('app-map-legend')).toBeVisible(); + await expect( + displacementLayers.locator('mat-slider input[matSliderThumb]'), + ).toBeVisible(); +}); From 54200d144ceece87577e17a9cc7ad784724ba3bb Mon Sep 17 00:00:00 2001 From: Princesa Yoreley Date: Fri, 15 May 2026 12:12:09 -0700 Subject: [PATCH 2/6] test: add profile specs for dark mode and login state sync --- e2e/profile/dark-mode.spec.ts | 27 +++++++ e2e/profile/login-state-sync.spec.ts | 102 +++++++++++++++++++++++++++ 2 files changed, 129 insertions(+) create mode 100644 e2e/profile/dark-mode.spec.ts create mode 100644 e2e/profile/login-state-sync.spec.ts diff --git a/e2e/profile/dark-mode.spec.ts b/e2e/profile/dark-mode.spec.ts new file mode 100644 index 000000000..84f5dbfc5 --- /dev/null +++ b/e2e/profile/dark-mode.spec.ts @@ -0,0 +1,27 @@ +import { test, expect } from 'e2e/pages/auth.page'; + +test( + 'Profile: Set dark mode', + { tag: '@auth' }, + async ({ loggedInPage }) => { + await loggedInPage.goto('/'); + + await loggedInPage + .getByRole('button', { name: 'automatedtesting_fullaccess' }) + .click(); + await loggedInPage.getByRole('menuitem', { name: 'Preferences' }).click(); + + const preferencesDialog = loggedInPage.getByRole('dialog', { + name: /Preferences for automatedtesting_fullaccess/i, + }); + + await preferencesDialog + .getByRole('combobox', { name: 'Theme', exact: true }) + .click(); + await loggedInPage.getByRole('option', { name: 'Dark' }).click(); + + await expect(loggedInPage.locator('body')).toHaveClass(/theme-dark/); + + await preferencesDialog.getByRole('button', { name: 'Done' }).click(); + }, +); diff --git a/e2e/profile/login-state-sync.spec.ts b/e2e/profile/login-state-sync.spec.ts new file mode 100644 index 000000000..bb4656ace --- /dev/null +++ b/e2e/profile/login-state-sync.spec.ts @@ -0,0 +1,102 @@ +import { test, expect } from 'e2e/fixtures'; + +test('Profile: login state is synced across instances', async ({ + browser, +}) => { + const context = await browser.newContext({ + viewport: { width: 1440, height: 900 }, + }); + + let loggedIn = false; + + await context.route('**/*', async (route) => { + const url = route.request().url(); + + if ( + url.includes('googletagmanager') || + url.includes('crazyegg') || + url.includes('earthdata.nasa.gov') || + url.includes('feedback.js') || + /\.(png|jpg|jpeg|webp|gif|pbf)(\?|$)/i.test(url) + ) { + return route.abort(); + } + + if ( + url.includes('/services/utils/mission_list') || + url.includes('banners.asf.alaska.edu/calendar') + ) { + return route.fulfill({ + status: 200, + contentType: 'application/json', + body: '[]', + }); + } + + if (url.includes('appdata') && url.includes('/Profile')) { + return route.fulfill({ + status: 200, + contentType: 'application/json', + body: JSON.stringify({ + defaultDataset: 'SENTINEL-1', + defaultFilterPresets: { + 'Baseline Search': '', + 'Geographic Search': '', + 'SBAS Search': '', + Displacement: '', + }, + defaultMaxConcurrentDownloads: 3, + hyp3BackendUrl: 'https://hyp3-api.asf.alaska.edu', + hyp3SavedUrls: ['https://hyp3-api.asf.alaska.edu'], + language: 'en', + mapLayer: 'Satellite', + maxResults: 250, + theme: 'light', + }), + }); + } + + if (url.includes('/info/cookie')) { + return route.fulfill({ + status: 200, + contentType: 'application/json', + body: JSON.stringify( + loggedIn + ? { + exp: 2978525424, + 'urs-access-token': + 'eyJhbGciOiJub25lIn0.eyJzdWIiOiIxMjM0NTY3ODkwIiwiaWF0IjoxNzc4MDExOTc4LCJleHAiOjk5OTk5OTk5OTl9.', + 'urs-groups': [], + 'urs-user-id': 'automatedtesting_fullaccess', + } + : {}, + ), + }); + } + + return route.continue(); + }); + + const pageOne = await context.newPage(); + const pageTwo = await context.newPage(); + + await pageOne.goto('/'); + await pageTwo.goto('/'); + + await expect(pageOne.getByRole('button', { name: 'Sign In' })).toBeVisible(); + await expect(pageTwo.getByRole('button', { name: 'Sign In' })).toBeVisible(); + + loggedIn = true; + + await pageOne.evaluate(() => { + const bc = new BroadcastChannel('asf-vertex'); + bc.postMessage({ event: 'login' }); + bc.close(); + }); + + await expect( + pageTwo.getByRole('button', { name: 'automatedtesting_fullaccess' }), + ).toBeVisible(); + + await context.close(); +}); From f3e898ac6931b33214340b9da0e6e4092706514f Mon Sep 17 00:00:00 2001 From: Princesa Yoreley Date: Fri, 15 May 2026 12:12:09 -0700 Subject: [PATCH 3/6] test: add profile for dark mode and login state sync --- e2e/profile/dark-mode.spec.ts | 27 +++++++ e2e/profile/login-state-sync.spec.ts | 102 +++++++++++++++++++++++++++ 2 files changed, 129 insertions(+) create mode 100644 e2e/profile/dark-mode.spec.ts create mode 100644 e2e/profile/login-state-sync.spec.ts diff --git a/e2e/profile/dark-mode.spec.ts b/e2e/profile/dark-mode.spec.ts new file mode 100644 index 000000000..84f5dbfc5 --- /dev/null +++ b/e2e/profile/dark-mode.spec.ts @@ -0,0 +1,27 @@ +import { test, expect } from 'e2e/pages/auth.page'; + +test( + 'Profile: Set dark mode', + { tag: '@auth' }, + async ({ loggedInPage }) => { + await loggedInPage.goto('/'); + + await loggedInPage + .getByRole('button', { name: 'automatedtesting_fullaccess' }) + .click(); + await loggedInPage.getByRole('menuitem', { name: 'Preferences' }).click(); + + const preferencesDialog = loggedInPage.getByRole('dialog', { + name: /Preferences for automatedtesting_fullaccess/i, + }); + + await preferencesDialog + .getByRole('combobox', { name: 'Theme', exact: true }) + .click(); + await loggedInPage.getByRole('option', { name: 'Dark' }).click(); + + await expect(loggedInPage.locator('body')).toHaveClass(/theme-dark/); + + await preferencesDialog.getByRole('button', { name: 'Done' }).click(); + }, +); diff --git a/e2e/profile/login-state-sync.spec.ts b/e2e/profile/login-state-sync.spec.ts new file mode 100644 index 000000000..bb4656ace --- /dev/null +++ b/e2e/profile/login-state-sync.spec.ts @@ -0,0 +1,102 @@ +import { test, expect } from 'e2e/fixtures'; + +test('Profile: login state is synced across instances', async ({ + browser, +}) => { + const context = await browser.newContext({ + viewport: { width: 1440, height: 900 }, + }); + + let loggedIn = false; + + await context.route('**/*', async (route) => { + const url = route.request().url(); + + if ( + url.includes('googletagmanager') || + url.includes('crazyegg') || + url.includes('earthdata.nasa.gov') || + url.includes('feedback.js') || + /\.(png|jpg|jpeg|webp|gif|pbf)(\?|$)/i.test(url) + ) { + return route.abort(); + } + + if ( + url.includes('/services/utils/mission_list') || + url.includes('banners.asf.alaska.edu/calendar') + ) { + return route.fulfill({ + status: 200, + contentType: 'application/json', + body: '[]', + }); + } + + if (url.includes('appdata') && url.includes('/Profile')) { + return route.fulfill({ + status: 200, + contentType: 'application/json', + body: JSON.stringify({ + defaultDataset: 'SENTINEL-1', + defaultFilterPresets: { + 'Baseline Search': '', + 'Geographic Search': '', + 'SBAS Search': '', + Displacement: '', + }, + defaultMaxConcurrentDownloads: 3, + hyp3BackendUrl: 'https://hyp3-api.asf.alaska.edu', + hyp3SavedUrls: ['https://hyp3-api.asf.alaska.edu'], + language: 'en', + mapLayer: 'Satellite', + maxResults: 250, + theme: 'light', + }), + }); + } + + if (url.includes('/info/cookie')) { + return route.fulfill({ + status: 200, + contentType: 'application/json', + body: JSON.stringify( + loggedIn + ? { + exp: 2978525424, + 'urs-access-token': + 'eyJhbGciOiJub25lIn0.eyJzdWIiOiIxMjM0NTY3ODkwIiwiaWF0IjoxNzc4MDExOTc4LCJleHAiOjk5OTk5OTk5OTl9.', + 'urs-groups': [], + 'urs-user-id': 'automatedtesting_fullaccess', + } + : {}, + ), + }); + } + + return route.continue(); + }); + + const pageOne = await context.newPage(); + const pageTwo = await context.newPage(); + + await pageOne.goto('/'); + await pageTwo.goto('/'); + + await expect(pageOne.getByRole('button', { name: 'Sign In' })).toBeVisible(); + await expect(pageTwo.getByRole('button', { name: 'Sign In' })).toBeVisible(); + + loggedIn = true; + + await pageOne.evaluate(() => { + const bc = new BroadcastChannel('asf-vertex'); + bc.postMessage({ event: 'login' }); + bc.close(); + }); + + await expect( + pageTwo.getByRole('button', { name: 'automatedtesting_fullaccess' }), + ).toBeVisible(); + + await context.close(); +}); From a6c893e35c143120a3e1ca16e53eeeb5c4dd8eff Mon Sep 17 00:00:00 2001 From: Princesa Yoreley Date: Fri, 15 May 2026 14:01:45 -0700 Subject: [PATCH 4/6] test: fix login state sync url matching --- e2e/profile/login-state-sync.spec.ts | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/e2e/profile/login-state-sync.spec.ts b/e2e/profile/login-state-sync.spec.ts index bb4656ace..4d753de27 100644 --- a/e2e/profile/login-state-sync.spec.ts +++ b/e2e/profile/login-state-sync.spec.ts @@ -11,11 +11,14 @@ test('Profile: login state is synced across instances', async ({ await context.route('**/*', async (route) => { const url = route.request().url(); + const parsedUrl = new URL(url); + const hostname = parsedUrl.hostname; + const pathname = parsedUrl.pathname; if ( url.includes('googletagmanager') || url.includes('crazyegg') || - url.includes('earthdata.nasa.gov') || + hostname === 'earthdata.nasa.gov' || url.includes('feedback.js') || /\.(png|jpg|jpeg|webp|gif|pbf)(\?|$)/i.test(url) ) { @@ -24,7 +27,7 @@ test('Profile: login state is synced across instances', async ({ if ( url.includes('/services/utils/mission_list') || - url.includes('banners.asf.alaska.edu/calendar') + (hostname === 'banners.asf.alaska.edu' && pathname === '/calendar') ) { return route.fulfill({ status: 200, From 6c424b89975f3c3f4030fd7133cff16ff902cf88 Mon Sep 17 00:00:00 2001 From: Princesa Yoreley Date: Mon, 18 May 2026 11:38:53 -0700 Subject: [PATCH 5/6] test: simplify login --- e2e/profile/login-state-sync.spec.ts | 16 ++++++---------- 1 file changed, 6 insertions(+), 10 deletions(-) diff --git a/e2e/profile/login-state-sync.spec.ts b/e2e/profile/login-state-sync.spec.ts index 4d753de27..661578a94 100644 --- a/e2e/profile/login-state-sync.spec.ts +++ b/e2e/profile/login-state-sync.spec.ts @@ -80,26 +80,22 @@ test('Profile: login state is synced across instances', async ({ return route.continue(); }); - const pageOne = await context.newPage(); - const pageTwo = await context.newPage(); + const page = await context.newPage(); - await pageOne.goto('/'); - await pageTwo.goto('/'); + await page.goto('/'); - await expect(pageOne.getByRole('button', { name: 'Sign In' })).toBeVisible(); - await expect(pageTwo.getByRole('button', { name: 'Sign In' })).toBeVisible(); + await expect(page.getByRole('button', { name: 'Sign In' })).toBeVisible(); loggedIn = true; - await pageOne.evaluate(() => { + await page.evaluate(() => { const bc = new BroadcastChannel('asf-vertex'); bc.postMessage({ event: 'login' }); bc.close(); }); - await expect( - pageTwo.getByRole('button', { name: 'automatedtesting_fullaccess' }), - ).toBeVisible(); + await expect(page.getByRole('button', { name: 'automatedtesting_fullaccess' })) + .toBeVisible(); await context.close(); }); From 845b433aeec268c9592fd0b60b03b782d2358ebf Mon Sep 17 00:00:00 2001 From: Princesa Yoreley Date: Wed, 20 May 2026 12:17:10 -0700 Subject: [PATCH 6/6] test: simplify login state --- e2e/profile/login-state-sync.spec.ts | 118 +++++++++------------------ 1 file changed, 39 insertions(+), 79 deletions(-) diff --git a/e2e/profile/login-state-sync.spec.ts b/e2e/profile/login-state-sync.spec.ts index 661578a94..924028677 100644 --- a/e2e/profile/login-state-sync.spec.ts +++ b/e2e/profile/login-state-sync.spec.ts @@ -1,86 +1,48 @@ import { test, expect } from 'e2e/fixtures'; -test('Profile: login state is synced across instances', async ({ - browser, -}) => { - const context = await browser.newContext({ - viewport: { width: 1440, height: 900 }, - }); - +test('Profile: login state is synced across instances', async ({ page }) => { let loggedIn = false; - await context.route('**/*', async (route) => { - const url = route.request().url(); - const parsedUrl = new URL(url); - const hostname = parsedUrl.hostname; - const pathname = parsedUrl.pathname; - - if ( - url.includes('googletagmanager') || - url.includes('crazyegg') || - hostname === 'earthdata.nasa.gov' || - url.includes('feedback.js') || - /\.(png|jpg|jpeg|webp|gif|pbf)(\?|$)/i.test(url) - ) { - return route.abort(); - } - - if ( - url.includes('/services/utils/mission_list') || - (hostname === 'banners.asf.alaska.edu' && pathname === '/calendar') - ) { - return route.fulfill({ - status: 200, - contentType: 'application/json', - body: '[]', - }); - } - - if (url.includes('appdata') && url.includes('/Profile')) { - return route.fulfill({ - status: 200, - contentType: 'application/json', - body: JSON.stringify({ - defaultDataset: 'SENTINEL-1', - defaultFilterPresets: { - 'Baseline Search': '', - 'Geographic Search': '', - 'SBAS Search': '', - Displacement: '', - }, - defaultMaxConcurrentDownloads: 3, - hyp3BackendUrl: 'https://hyp3-api.asf.alaska.edu', - hyp3SavedUrls: ['https://hyp3-api.asf.alaska.edu'], - language: 'en', - mapLayer: 'Satellite', - maxResults: 250, - theme: 'light', - }), - }); - } - - if (url.includes('/info/cookie')) { - return route.fulfill({ - status: 200, - contentType: 'application/json', - body: JSON.stringify( - loggedIn - ? { - exp: 2978525424, - 'urs-access-token': - 'eyJhbGciOiJub25lIn0.eyJzdWIiOiIxMjM0NTY3ODkwIiwiaWF0IjoxNzc4MDExOTc4LCJleHAiOjk5OTk5OTk5OTl9.', - 'urs-groups': [], - 'urs-user-id': 'automatedtesting_fullaccess', - } - : {}, - ), - }); - } - - return route.continue(); + await page.route('**appdata**/**/Profile', async (route) => { + await route.fulfill({ + status: 200, + contentType: 'application/json', + body: JSON.stringify({ + defaultDataset: 'SENTINEL-1', + defaultFilterPresets: { + 'Baseline Search': '', + 'Geographic Search': '', + 'SBAS Search': '', + Displacement: '', + }, + defaultMaxConcurrentDownloads: 3, + hyp3BackendUrl: 'https://hyp3-api.asf.alaska.edu', + hyp3SavedUrls: ['https://hyp3-api.asf.alaska.edu'], + language: 'en', + mapLayer: 'Satellite', + maxResults: 250, + theme: 'light', + }), + }); }); - const page = await context.newPage(); + await page.route('**appdata**/info/cookie', async (route) => { + await route.fulfill({ + status: 200, + contentType: 'application/json', + body: JSON.stringify( + loggedIn + ? { + exp: 2978525424, + 'urs-access-token': + 'eyJhbGciOiJub25lIn0.eyJzdWIiOiIxMjM0NTY3ODkwIiwiaWF0IjoxNzc4MDExOTc4LCJleHAiOjk5OTk5OTk5OTl9.', + 'urs-groups': [], + 'urs-user-id': 'automatedtesting_fullaccess', + } + : {}, + ), + }); + }); await page.goto('/'); @@ -96,6 +58,4 @@ test('Profile: login state is synced across instances', async ({ await expect(page.getByRole('button', { name: 'automatedtesting_fullaccess' })) .toBeVisible(); - - await context.close(); });