test(e2e): add history panel playwright spec
Some checks failed
CI / Unit & Component Tests (push) Successful in 2m19s
CI / Backend Unit Tests (push) Successful in 2m11s
CI / E2E Tests (push) Has started running
CI / Unit & Component Tests (pull_request) Successful in 2m7s
CI / Backend Unit Tests (pull_request) Successful in 2m0s
CI / E2E Tests (pull_request) Failing after 21m58s
Some checks failed
CI / Unit & Component Tests (push) Successful in 2m19s
CI / Backend Unit Tests (push) Successful in 2m11s
CI / E2E Tests (push) Has started running
CI / Unit & Component Tests (pull_request) Successful in 2m7s
CI / Backend Unit Tests (pull_request) Successful in 2m0s
CI / E2E Tests (pull_request) Failing after 21m58s
Three scenarios: versions list appears after edits, diff shows changed field, compare mode displays diff between two selected versions. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
89
frontend/e2e/history.spec.ts
Normal file
89
frontend/e2e/history.spec.ts
Normal file
@@ -0,0 +1,89 @@
|
|||||||
|
import { test, expect } from '@playwright/test';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Document edit history E2E tests.
|
||||||
|
* Relies on the 'Document creation' and 'Document editing' tests in documents.spec.ts
|
||||||
|
* having run first (they create and edit "E2E Testbrief (überarbeitet)").
|
||||||
|
* Assumes auth setup has run.
|
||||||
|
*/
|
||||||
|
test.describe('Document history panel', () => {
|
||||||
|
test('history section appears after creating and editing a document', async ({ page }) => {
|
||||||
|
// Find the document edited in the documents.spec.ts editing test
|
||||||
|
await page.goto('/?q=E2E+Testbrief');
|
||||||
|
await page.waitForSelector('[data-hydrated]');
|
||||||
|
const docLink = page.getByRole('link', { name: /E2E Testbrief/ }).first();
|
||||||
|
const href = await docLink.getAttribute('href');
|
||||||
|
await page.goto(href!);
|
||||||
|
|
||||||
|
// History section should be present (collapsed by default)
|
||||||
|
const historyToggle = page.getByRole('button', { name: /Verlauf/i });
|
||||||
|
await expect(historyToggle).toBeVisible();
|
||||||
|
|
||||||
|
// Expand the history section
|
||||||
|
await historyToggle.click();
|
||||||
|
|
||||||
|
// Should show at least two version entries (created + edited)
|
||||||
|
const versionItems = page.locator('[data-testid="history-version"]');
|
||||||
|
await expect(versionItems).toHaveCount(2, { timeout: 5000 });
|
||||||
|
|
||||||
|
await page.screenshot({ path: 'test-results/e2e/history-versions-list.png' });
|
||||||
|
});
|
||||||
|
|
||||||
|
test('diff view highlights changed field after title edit', async ({ page }) => {
|
||||||
|
await page.goto('/?q=E2E+Testbrief');
|
||||||
|
await page.waitForSelector('[data-hydrated]');
|
||||||
|
const docLink = page.getByRole('link', { name: /E2E Testbrief/ }).first();
|
||||||
|
const href = await docLink.getAttribute('href');
|
||||||
|
await page.goto(href!);
|
||||||
|
|
||||||
|
// Expand history
|
||||||
|
const historyToggle = page.getByRole('button', { name: /Verlauf/i });
|
||||||
|
await historyToggle.click();
|
||||||
|
|
||||||
|
// Click the second version (the edit) to see its diff
|
||||||
|
const versionItems = page.locator('[data-testid="history-version"]');
|
||||||
|
await versionItems.nth(1).click();
|
||||||
|
|
||||||
|
// The diff panel should show the "Titel" field as changed
|
||||||
|
const diffPanel = page.locator('[data-testid="history-diff"]');
|
||||||
|
await expect(diffPanel).toBeVisible();
|
||||||
|
await expect(diffPanel.getByText(/Titel/i)).toBeVisible();
|
||||||
|
|
||||||
|
await page.screenshot({ path: 'test-results/e2e/history-diff-title.png' });
|
||||||
|
});
|
||||||
|
|
||||||
|
test('compare mode lets user compare any two versions', async ({ page }) => {
|
||||||
|
await page.goto('/?q=E2E+Testbrief');
|
||||||
|
await page.waitForSelector('[data-hydrated]');
|
||||||
|
const docLink = page.getByRole('link', { name: /E2E Testbrief/ }).first();
|
||||||
|
const href = await docLink.getAttribute('href');
|
||||||
|
await page.goto(href!);
|
||||||
|
|
||||||
|
// Expand history
|
||||||
|
const historyToggle = page.getByRole('button', { name: /Verlauf/i });
|
||||||
|
await historyToggle.click();
|
||||||
|
|
||||||
|
// Switch to compare mode
|
||||||
|
const compareBtn = page.getByRole('button', { name: /Vergleichen/i });
|
||||||
|
await expect(compareBtn).toBeVisible();
|
||||||
|
await compareBtn.click();
|
||||||
|
|
||||||
|
// Two version selects should appear
|
||||||
|
const selectA = page.getByLabel(/Version A/i);
|
||||||
|
const selectB = page.getByLabel(/Version B/i);
|
||||||
|
await expect(selectA).toBeVisible();
|
||||||
|
await expect(selectB).toBeVisible();
|
||||||
|
|
||||||
|
// Apply the comparison
|
||||||
|
await page
|
||||||
|
.getByRole('button', { name: /Vergleichen/i })
|
||||||
|
.last()
|
||||||
|
.click();
|
||||||
|
|
||||||
|
// Diff panel should be visible
|
||||||
|
const diffPanel = page.locator('[data-testid="history-diff"]');
|
||||||
|
await expect(diffPanel).toBeVisible();
|
||||||
|
|
||||||
|
await page.screenshot({ path: 'test-results/e2e/history-compare-mode.png' });
|
||||||
|
});
|
||||||
|
});
|
||||||
@@ -681,6 +681,7 @@ function versionLabel(v: VersionSummary, index: number): string {
|
|||||||
<li>
|
<li>
|
||||||
<button
|
<button
|
||||||
onclick={() => selectVersion(v.id)}
|
onclick={() => selectVersion(v.id)}
|
||||||
|
data-testid="history-version"
|
||||||
class="w-full py-2 text-left transition hover:bg-brand-sand/30 {selectedVersionId ===
|
class="w-full py-2 text-left transition hover:bg-brand-sand/30 {selectedVersionId ===
|
||||||
v.id
|
v.id
|
||||||
? 'border-l-2 border-brand-mint pl-2'
|
? 'border-l-2 border-brand-mint pl-2'
|
||||||
@@ -717,12 +718,16 @@ function versionLabel(v: VersionSummary, index: number): string {
|
|||||||
<p class="font-sans text-xs text-gray-400">{m.history_loading()}</p>
|
<p class="font-sans text-xs text-gray-400">{m.history_loading()}</p>
|
||||||
{:else if noDiff}
|
{:else if noDiff}
|
||||||
<div
|
<div
|
||||||
|
data-testid="history-diff"
|
||||||
class="rounded-sm border border-brand-sand bg-white p-4 font-serif text-sm text-gray-400 italic"
|
class="rounded-sm border border-brand-sand bg-white p-4 font-serif text-sm text-gray-400 italic"
|
||||||
>
|
>
|
||||||
{m.history_diff_no_changes()}
|
{m.history_diff_no_changes()}
|
||||||
</div>
|
</div>
|
||||||
{:else if diffEntries.length > 0}
|
{:else if diffEntries.length > 0}
|
||||||
<div class="space-y-4 rounded-sm border border-brand-sand bg-white p-4">
|
<div
|
||||||
|
data-testid="history-diff"
|
||||||
|
class="space-y-4 rounded-sm border border-brand-sand bg-white p-4"
|
||||||
|
>
|
||||||
{#each diffEntries as entry (entry.field)}
|
{#each diffEntries as entry (entry.field)}
|
||||||
<div>
|
<div>
|
||||||
<span
|
<span
|
||||||
|
|||||||
Reference in New Issue
Block a user