The spec's E2E section requires that a created link shows its address in the table, but the test that creates one filled a throwaway address and never asserted the cell. The address is now kept in a variable and asserted on the row after creation, using it to locate the row's own cell rather than any other row's. Not run: the local stack is down and Playwright was explicitly out of bounds for this pass, per the task instructions. This is written and verified by inspection and lint only. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
89 lines
3.9 KiB
TypeScript
89 lines
3.9 KiB
TypeScript
import { test, expect, uniqueSuffix } from './fixtures';
|
|
|
|
/**
|
|
* Issuing and revoking upload links from the admin (#222).
|
|
*
|
|
* Every link is labelled with a fresh run id and every assertion is scoped to
|
|
* that row. The suite is fullyParallel against one shared database, so an
|
|
* assertion on the table as a whole would be an assertion on whatever other
|
|
* specs happen to be doing (#241).
|
|
*/
|
|
|
|
test.describe('Managing upload links', () => {
|
|
test('issues a link, shows its token once, and lists it bounded', async ({ page, admin }) => {
|
|
const label = `Sarah ${uniqueSuffix()}`;
|
|
const email = `${uniqueSuffix()}@example.com`;
|
|
|
|
await admin.goto();
|
|
await page.getByRole('tab', { name: 'Upload links' }).click();
|
|
|
|
await page.getByLabel('Link label').fill(label);
|
|
await page.getByLabel('Contributor email').fill(email);
|
|
await page.getByRole('button', { name: 'Create link' }).click();
|
|
|
|
// Shown exactly once. The server keeps only a digest, so there is no
|
|
// reveal to come back to — the copy has to say so.
|
|
await expect(page.getByText('Copy this link now')).toBeVisible();
|
|
await expect(page.getByText(/\/submit\//)).toBeVisible();
|
|
await expect(page.getByText(/cannot be shown again/)).toBeVisible();
|
|
|
|
const row = page.getByRole('row', { name: new RegExp(label) });
|
|
await expect(row).toBeVisible();
|
|
// A created link shows its address in the table.
|
|
await expect(row.getByText(email)).toBeVisible();
|
|
// The default cap, not unlimited. An unbounded link should be asked for.
|
|
await expect(row.getByText('0 of 25')).toBeVisible();
|
|
await expect(row.getByText('Active')).toBeVisible();
|
|
});
|
|
|
|
test('revokes a link, naming the action on the confirm', async ({ page, admin }) => {
|
|
const label = `Temporary ${uniqueSuffix()}`;
|
|
|
|
await admin.goto();
|
|
await page.getByRole('tab', { name: 'Upload links' }).click();
|
|
await page.getByLabel('Link label').fill(label);
|
|
await page.getByLabel('Contributor email').fill(`${uniqueSuffix()}@example.com`);
|
|
await page.getByRole('button', { name: 'Create link' }).click();
|
|
|
|
const row = page.getByRole('row', { name: new RegExp(label) });
|
|
await row.getByRole('button', { name: 'Revoke' }).click();
|
|
|
|
// The confirm names what it does rather than saying OK, which is what the
|
|
// rest of this admin's destructive actions do.
|
|
await page.getByRole('tooltip').getByRole('button', { name: 'Revoke' }).click();
|
|
|
|
await expect(row.getByText('Revoked')).toBeVisible();
|
|
// The row stays: what arrived through the link is kept, and the record of
|
|
// where it came from with it.
|
|
await expect(row).toBeVisible();
|
|
});
|
|
|
|
// Blank-means-unlimited would make the least deliberate action produce the
|
|
// least bounded link, so unlimited is a checkbox rather than an empty field.
|
|
test('makes unlimited a deliberate choice', async ({ page, admin }) => {
|
|
const label = `Always on ${uniqueSuffix()}`;
|
|
|
|
await admin.goto();
|
|
await page.getByRole('tab', { name: 'Upload links' }).click();
|
|
await page.getByLabel('Link label').fill(label);
|
|
await page.getByLabel('Contributor email').fill(`${uniqueSuffix()}@example.com`);
|
|
await page.getByText('No limit').click();
|
|
await page.getByRole('button', { name: 'Create link' }).click();
|
|
|
|
const row = page.getByRole('row', { name: new RegExp(label) });
|
|
await expect(row).toBeVisible();
|
|
// A bare count rather than "0 of N".
|
|
await expect(row.getByText('0 of', { exact: false })).toHaveCount(0);
|
|
});
|
|
|
|
// The address is the point of the change: a link nobody can be sent is the
|
|
// thing this replaced.
|
|
test('will not create a link without an address', async ({ page, admin }) => {
|
|
await admin.goto();
|
|
await page.getByRole('tab', { name: 'Upload links' }).click();
|
|
await page.getByLabel('Link label').fill(`Nameless ${uniqueSuffix()}`);
|
|
|
|
await expect(page.getByRole('button', { name: 'Create link' })).toBeDisabled();
|
|
});
|
|
});
|