diff --git a/pt/web/firebird/tests/restricted_view.spec.js b/pt/web/firebird/tests/restricted_view.spec.js new file mode 100644 index 000000000..0715974dd --- /dev/null +++ b/pt/web/firebird/tests/restricted_view.spec.js @@ -0,0 +1,45 @@ +import { expect, test } from '@playwright/test'; + +// These tests run as an anonymous (not-logged-in) user. +// The auth specs cover the same items under authenticated access. +test.describe('restricted view', () => { + test.describe('ic_currently_held', () => { + test.beforeEach(async ({ page }) => { + await page.goto('/cgi/pt?id=test.ic_currently_held'); + }); + + test('shows "not available online" warning', async ({ page }) => { + await expect(page.getByText('not available online')).toBeVisible(); + }); + + test('shows "Limited - search only" label', async ({ page }) => { + await expect(page.getByText('Limited - search only')).toBeVisible(); + }); + + test('does not render any page scan images', async ({ page }) => { + await expect(page.getByRole('figure')).toHaveCount(0); + }); + + test('does not render the reader toolbar', async ({ page }) => { + await expect(page.locator('.view--toolbar')).toHaveCount(0); + }); + + test('shows a search form so users can still search the text', async ({ page }) => { + await expect(page.getByLabel('Search in this text')).toBeVisible(); + }); + }); + + test.describe('ic_not_held', () => { + test.beforeEach(async ({ page }) => { + await page.goto('/cgi/pt?id=test.ic_not_held'); + }); + + test('shows "not available online" warning', async ({ page }) => { + await expect(page.getByText('not available online')).toBeVisible(); + }); + + test('does not render any page scan images', async ({ page }) => { + await expect(page.getByRole('figure')).toHaveCount(0); + }); + }); +}); diff --git a/pt/web/firebird/tests/search.spec.js b/pt/web/firebird/tests/search.spec.js new file mode 100644 index 000000000..f80e14afa --- /dev/null +++ b/pt/web/firebird/tests/search.spec.js @@ -0,0 +1,42 @@ +import { expect, test } from '@playwright/test'; + +test.describe('search in this text', () => { + test.beforeEach(async ({ page }) => { + await page.goto('/cgi/pt?id=test.pd_open'); + await page.getByRole('button', { name: 'Allow all cookies' }).click(); + const panelButton = page.getByRole('button', { name: 'Search in This Text' }); + await panelButton.click(); + await expect(panelButton).toHaveAttribute('aria-expanded', 'true'); + }); + + test('search input is visible when panel is open', async ({ page }) => { + await expect(page.getByLabel('Search in this text')).toBeVisible(); + }); + + test('submitting a query updates the URL with q1 param', async ({ page }) => { + await page.getByLabel('Search in this text').fill('the'); + await page.getByRole('button', { name: 'Submit search' }).click(); + await expect(page).toHaveURL(/q1=the/); + }); + + test('search shows a result count message', async ({ page }) => { + await page.getByLabel('Search in this text').fill('the'); + await page.getByRole('button', { name: 'Submit search' }).click(); + await expect(page.getByText(/results.*for/i)).toBeVisible({ timeout: 10_000 }); + }); + + test('clearing search removes the q1 param from URL', async ({ page }) => { + await page.getByLabel('Search in this text').fill('the'); + await page.getByRole('button', { name: 'Submit search' }).click(); + await expect(page.getByText(/results.*for/i)).toBeVisible({ timeout: 10_000 }); + + await page.getByRole('button', { name: 'Clear search' }).click(); + await expect(page).not.toHaveURL(/q1=the/); + await expect(page.getByLabel('Search in this text')).toHaveValue(''); + }); + + test('loading the page with q1 param pre-fills the search input', async ({ page }) => { + await page.goto('/cgi/pt?id=test.pd_open&q1=hello'); + await expect(page.getByLabel('Search in this text')).toHaveValue('hello'); + }); +});