Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
61 changes: 61 additions & 0 deletions pt/web/firebird/tests/views.spec.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
import { expect, test } from '@playwright/test';

test.describe('reader view modes', () => {
test.beforeEach(async ({ page }) => {
await page.goto('/cgi/pt?id=test.pd_open');
await page.getByRole('button', { name: 'Close banner', exact: true }).click();
});

test.describe('2up (flip) view', () => {
test('toolbar switch to 2up updates URL', async ({ page }) => {
await page.getByRole('button', { name: 'View' }).click();
await page.getByRole('button', { name: 'Flip' }).click();
await expect(page).toHaveURL('/cgi/pt?id=test.pd_open&seq=1&view=2up');
});

test('loads directly via URL parameter', async ({ page }) => {
await page.goto('/cgi/pt?id=test.pd_open&view=2up');
await expect(page).toHaveURL(/view=2up/);
await expect(page.getByLabel('Page scan 1')).toBeVisible();
});

test('shows both pages side by side for a 2-page item', async ({ page }) => {
await page.goto('/cgi/pt?id=test.pd_open&view=2up');
await expect(page.getByLabel('Page scan 1')).toBeVisible();
await expect(page.getByLabel('Page scan 2')).toBeVisible();
});

test('switching back to 1up updates URL', async ({ page }) => {
await page.goto('/cgi/pt?id=test.pd_open&view=2up');
await page.getByRole('button', { name: 'View' }).click();
await page.getByRole('button', { name: 'Scroll' }).click();
await expect(page).toHaveURL(/view=1up/);
});
});

test.describe('thumbnail (grid) view', () => {
test('toolbar switch to thumbnails updates URL', async ({ page }) => {
await page.getByRole('button', { name: 'View' }).click();
await page.getByRole('button', { name: 'Thumbnails' }).click();
await expect(page).toHaveURL('/cgi/pt?id=test.pd_open&seq=1&view=thumb');
});

test('loads directly via URL parameter', async ({ page }) => {
await page.goto('/cgi/pt?id=test.pd_open&view=thumb');
await expect(page).toHaveURL(/view=thumb/);
});

test('shows a selectable button for each page', async ({ page }) => {
await page.goto('/cgi/pt?id=test.pd_open&view=thumb');
await expect(page.locator('button[aria-label="Select scan #1"]')).toBeVisible();
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I can see that I used this locator previously in sidebar.spec.js so I'm about to contradict my own test, but I should've used getByRole('button', {name: 'Select scan #1'}). I need to go back and fix that.

These are kind of nitpicky and pedantic, but the testing philosophy of playwright is to test what the user will use, not underlying details like CSS class names. It's not incorrect or wrong to do that, but I like to to try to use the accessible names whenever possible, even though I obviously haven't kept to that in the past. Sometimes it's unavoidable because our markup isn't as accessible as it could be, like with the sidebar/complimentary role or the search results alert that doesn't have a role or name.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It does not seem to work with getByRole. I think I know why because there is aria-hidden={!focused}.

That means scan #2 is always aria-hidden in this view, so it's invisible to getByRole which queries the accessibility tree.

And it means the element is absent from the accessibility tree, which is itself an a11y gap worth noting.

For now we might need to use CSS selectors to query the raw DOM - what do you think?

await expect(page.locator('button[aria-label="Select scan #2"]')).toBeVisible();
});

test('switching back to 1up from thumbnails updates URL', async ({ page }) => {
await page.goto('/cgi/pt?id=test.pd_open&view=thumb');
await page.getByRole('button', { name: 'View' }).click();
await page.getByRole('button', { name: 'Scroll' }).click();
await expect(page).toHaveURL(/view=1up/);
});
});
});
Loading