From d9991f80527e1826228495dcf43745a0023821a7 Mon Sep 17 00:00:00 2001 From: eumalin Date: Tue, 19 May 2026 08:48:33 -0400 Subject: [PATCH 1/2] Add Playwright tests for toolbar zoom limits, share panel, and fix toBeVisible bug --- pt/web/firebird/tests/App.spec.js | 3 +- pt/web/firebird/tests/ViewerToolbar.spec.js | 32 +++++++++++++++++++++ pt/web/firebird/tests/sidebar.spec.js | 28 ++++++++++++++++++ 3 files changed, 61 insertions(+), 2 deletions(-) diff --git a/pt/web/firebird/tests/App.spec.js b/pt/web/firebird/tests/App.spec.js index 793cb3a57..f0178c9c6 100644 --- a/pt/web/firebird/tests/App.spec.js +++ b/pt/web/firebird/tests/App.spec.js @@ -10,8 +10,7 @@ test.describe('pt loads', () => { }); test('sidebar is visible', async ({ page }) => { - const sidebar = page.getByRole('complementary'); - await expect(sidebar).toBeVisible; + await expect(page.locator('aside')).toBeVisible(); }); test('has main element', async ({ page }) => { diff --git a/pt/web/firebird/tests/ViewerToolbar.spec.js b/pt/web/firebird/tests/ViewerToolbar.spec.js index c83ab8f6f..028a240d0 100644 --- a/pt/web/firebird/tests/ViewerToolbar.spec.js +++ b/pt/web/firebird/tests/ViewerToolbar.spec.js @@ -77,4 +77,36 @@ test.describe('reader toolbar actions', () => { await expect(page.getByRole('button', { name: 'Zoom In', exact: true })).toBeVisible(); await expect(page.getByLabel('Page scan 1').locator('details')).toBeVisible(); }); + + test.describe('zoom limits', () => { + test('zoom-in button is disabled at maximum zoom', async ({ page }) => { + const zoomIn = page.getByLabel('Zoom').getByRole('button', { name: 'Zoom In' }); + for (let i = 0; i < 20; i++) { + if (await zoomIn.isDisabled()) break; + await zoomIn.click(); + } + await expect(zoomIn).toBeDisabled(); + }); + + test('zoom-out button is disabled at minimum zoom', async ({ page }) => { + const zoomOut = page.getByLabel('Zoom').getByRole('button', { name: 'Zoom Out' }); + for (let i = 0; i < 20; i++) { + if (await zoomOut.isDisabled()) break; + await zoomOut.click(); + } + await expect(zoomOut).toBeDisabled(); + }); + + test('zoom-out re-enables after zooming back in from minimum', async ({ page }) => { + const zoomIn = page.getByLabel('Zoom').getByRole('button', { name: 'Zoom In' }); + const zoomOut = page.getByLabel('Zoom').getByRole('button', { name: 'Zoom Out' }); + for (let i = 0; i < 20; i++) { + if (await zoomOut.isDisabled()) break; + await zoomOut.click(); + } + await expect(zoomOut).toBeDisabled(); + await zoomIn.click(); + await expect(zoomOut).toBeEnabled(); + }); + }); }); diff --git a/pt/web/firebird/tests/sidebar.spec.js b/pt/web/firebird/tests/sidebar.spec.js index 5e27a86de..c038abb0c 100644 --- a/pt/web/firebird/tests/sidebar.spec.js +++ b/pt/web/firebird/tests/sidebar.spec.js @@ -259,6 +259,34 @@ test.describe('sidebar actions', () => { await page.getByRole('button', { name: 'Save Changes' }).click(); }); }); + test.describe('share panel', () => { + test.beforeEach(async ({ page }) => { + const shareButton = page.getByRole('button', { name: 'Share' }); + await shareButton.click(); + await expect(shareButton).toHaveAttribute('aria-expanded', 'true'); + }); + + test('shows permanent link to item', async ({ page }) => { + await expect(page.locator('#share-handle')).toHaveValue(/hdl\.handle\.net\/2027\/test\.pd_open/); + }); + + test('shows link to current page scan', async ({ page }) => { + await expect(page.locator('#share-handle-seq')).toHaveValue(/hdl\.handle\.net\/2027\/test\.pd_open.*seq=1/); + }); + + test('page scan link updates when navigating to a different page', async ({ page }) => { + await page.getByRole('button', { name: 'Next Page' }).click(); + await expect(page.locator('#share-handle-seq')).toHaveValue(/seq=2/); + }); + + test('embed button opens modal with iframe code', async ({ page }) => { + await page.getByRole('button', { name: 'Embed this item' }).click(); + await expect(page.getByRole('dialog')).toBeVisible(); + await expect(page.locator('#embed-codeblock')).toHaveValue(/iframe/); + await expect(page.locator('#embed-codeblock')).toHaveValue(/test\.pd_open/); + }); + }); + // close and expand sidebar test.describe('toggle sidebar visibility', () => { test('close sidebar', async ({ page }) => { From 43520ea87135d8f6c9f421458e6d3afe5a6d46f4 Mon Sep 17 00:00:00 2001 From: eumalin Date: Wed, 20 May 2026 15:35:32 -0400 Subject: [PATCH 2/2] use more idiomatic selectors --- pt/web/firebird/tests/sidebar.spec.js | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/pt/web/firebird/tests/sidebar.spec.js b/pt/web/firebird/tests/sidebar.spec.js index c038abb0c..9525d7a8d 100644 --- a/pt/web/firebird/tests/sidebar.spec.js +++ b/pt/web/firebird/tests/sidebar.spec.js @@ -267,23 +267,24 @@ test.describe('sidebar actions', () => { }); test('shows permanent link to item', async ({ page }) => { - await expect(page.locator('#share-handle')).toHaveValue(/hdl\.handle\.net\/2027\/test\.pd_open/); + await expect(page.getByLabel('Permanent link to this item')).toHaveValue(/hdl\.handle\.net\/2027\/test\.pd_open/); }); test('shows link to current page scan', async ({ page }) => { - await expect(page.locator('#share-handle-seq')).toHaveValue(/hdl\.handle\.net\/2027\/test\.pd_open.*seq=1/); + // getByRole needed because the nearby copy button's aria-label contains the same substring + await expect(page.getByRole('textbox', { name: 'Link to this page scan' })).toHaveValue(/hdl\.handle\.net\/2027\/test\.pd_open.*seq=1/); }); test('page scan link updates when navigating to a different page', async ({ page }) => { await page.getByRole('button', { name: 'Next Page' }).click(); - await expect(page.locator('#share-handle-seq')).toHaveValue(/seq=2/); + await expect(page.getByRole('textbox', { name: 'Link to this page scan' })).toHaveValue(/seq=2/); }); test('embed button opens modal with iframe code', async ({ page }) => { await page.getByRole('button', { name: 'Embed this item' }).click(); await expect(page.getByRole('dialog')).toBeVisible(); - await expect(page.locator('#embed-codeblock')).toHaveValue(/iframe/); - await expect(page.locator('#embed-codeblock')).toHaveValue(/test\.pd_open/); + await expect(page.getByLabel('Code Block')).toHaveValue(/iframe/); + await expect(page.getByLabel('Code Block')).toHaveValue(/test\.pd_open/); }); });