Release 0.5.8
This commit is contained in:
1 parent
22ae3a68d6
commit
2851c7d936
33 files changed
+1263
-272
No files matched your search
+93
-68
@@ -306,8 +306,14 @@ test('desktop fundus is a compact, filterable list with persistent themes', asyn
|
||||
await expect(page.locator('.mobile-navigation')).toBeHidden();
|
||||
await expect(page.locator('.utility-navigation a')).toHaveText('Verwaltung');
|
||||
await expect(page.locator('.piece-card')).toHaveCount(1);
|
||||
await page
|
||||
.locator('.filter-picker')
|
||||
.evaluate((element) => ((element as HTMLDetailsElement).open = true));
|
||||
await page.getByLabel('Auch eingeplante Inhalte zeigen').check();
|
||||
await expect(page.locator('.piece-card')).toHaveCount(4);
|
||||
await page
|
||||
.locator('.filter-picker')
|
||||
.evaluate((element) => ((element as HTMLDetailsElement).open = true));
|
||||
|
||||
const firstRow = await page.locator('.piece-card').nth(0).boundingBox();
|
||||
const secondRow = await page.locator('.piece-card').nth(1).boundingBox();
|
||||
@@ -319,11 +325,17 @@ test('desktop fundus is a compact, filterable list with persistent themes', asyn
|
||||
expect(searchBox?.height).toBe(statusBox?.height);
|
||||
|
||||
await page.getByRole('searchbox', { name: 'Fundus durchsuchen' }).fill('Pixelart');
|
||||
await page.getByRole('button', { name: 'Anwenden' }).click();
|
||||
await page.getByRole('button', { name: 'Filter anwenden' }).click();
|
||||
await expect(page.locator('.piece-card')).toHaveCount(1);
|
||||
await page
|
||||
.locator('.filter-picker')
|
||||
.evaluate((element) => ((element as HTMLDetailsElement).open = true));
|
||||
await page.getByLabel('Status').selectOption('preparing');
|
||||
await page.getByRole('button', { name: 'Anwenden' }).click();
|
||||
await page.getByRole('button', { name: 'Filter anwenden' }).click();
|
||||
await expect(page.getByRole('heading', { name: 'Kein passendes Piece' })).toBeVisible();
|
||||
await page
|
||||
.locator('.filter-picker')
|
||||
.evaluate((element) => ((element as HTMLDetailsElement).open = true));
|
||||
await page.getByRole('button', { name: 'Zurücksetzen' }).click();
|
||||
await expect(page.locator('.piece-card')).toHaveCount(1);
|
||||
|
||||
@@ -346,7 +358,13 @@ test('sent and planned source filters stay independent and removing the last usa
|
||||
page.getByRole('heading', { name: 'Warum praktische Effekte wieder auffallen' })
|
||||
).toHaveCount(0);
|
||||
await page.evaluate(() => (document.body.dataset.filterDocument = 'stable'));
|
||||
await page
|
||||
.locator('.filter-picker')
|
||||
.evaluate((element) => ((element as HTMLDetailsElement).open = true));
|
||||
await page.getByLabel('Auch verwendete Inhalte zeigen').check();
|
||||
await page
|
||||
.locator('.filter-picker')
|
||||
.evaluate((element) => ((element as HTMLDetailsElement).open = true));
|
||||
await expect(
|
||||
page.getByRole('heading', { name: 'Warum praktische Effekte wieder auffallen' })
|
||||
).toHaveCount(0);
|
||||
@@ -365,7 +383,7 @@ test('sent and planned source filters stay independent and removing the last usa
|
||||
await expect(usedPiece.locator('.piece-usage-history li')).toHaveCount(2);
|
||||
await expect(page.locator('body')).toHaveAttribute('data-filter-document', 'stable');
|
||||
await page.getByRole('searchbox', { name: 'Fundus durchsuchen' }).fill('praktische Effekte');
|
||||
await page.getByRole('button', { name: 'Anwenden' }).click();
|
||||
await page.getByRole('button', { name: 'Filter anwenden' }).click();
|
||||
await expect(page.getByLabel('Auch verwendete Inhalte zeigen')).toBeChecked();
|
||||
await expect(usedPiece).toBeVisible();
|
||||
await page.screenshot({
|
||||
@@ -374,7 +392,7 @@ test('sent and planned source filters stay independent and removing the last usa
|
||||
});
|
||||
|
||||
await page.goto('/sendungen');
|
||||
await page.getByLabel('Titel').fill('E2E Filterprüfung');
|
||||
await page.getByLabel('Titel', { exact: true }).fill('E2E Filterprüfung');
|
||||
await page.getByLabel('Ausgangspunkt').selectOption('template-default');
|
||||
await page.getByRole('button', { name: 'Sendung anlegen' }).click();
|
||||
await page.getByPlaceholder('Fundus durchsuchen').fill('kleine Konsole');
|
||||
@@ -426,9 +444,10 @@ test('sent and planned source filters stay independent and removing the last usa
|
||||
fullPage: true
|
||||
});
|
||||
|
||||
page.once('dialog', (dialog) => dialog.accept());
|
||||
await page
|
||||
.locator('.reserve-usage')
|
||||
.getByRole('button', { name: /aus Reserve entfernen/ })
|
||||
.getByRole('button', { name: /aus Sendung entfernen/ })
|
||||
.click();
|
||||
await page.getByLabel('Auch verwendete Inhalte zeigen').uncheck();
|
||||
await expect(
|
||||
@@ -521,9 +540,10 @@ test('mobile and tablet navigation do not obscure switchable content', async ({
|
||||
test('a show can be planned from a template with independent usages and reserve', async ({
|
||||
page
|
||||
}, testInfo) => {
|
||||
test.slow();
|
||||
await page.setViewportSize({ width: 1440, height: 1000 });
|
||||
await page.goto('/sendungen');
|
||||
await page.getByLabel('Titel').fill('E2E Planung Spiele und JC');
|
||||
await page.getByLabel('Titel', { exact: true }).fill('E2E Planung Spiele und JC');
|
||||
await page.getByLabel('Ausgangspunkt').selectOption('template-default');
|
||||
await page.getByRole('button', { name: 'Sendung anlegen' }).click();
|
||||
await expect(page).toHaveURL(/\/sendungen\/[a-f0-9-]+$/);
|
||||
@@ -584,16 +604,9 @@ test('a show can be planned from a template with independent usages and reserve'
|
||||
name: 'Die kleine Konsole mit dem großen Dreh bearbeiten und verschieben'
|
||||
})
|
||||
.click();
|
||||
await expect(page.locator('dialog[open]')).toContainText('Sendungsspezifische Kopie');
|
||||
const desktopEditorItems = await page
|
||||
.locator('dialog[open] .usage-dialog-editor')
|
||||
.evaluate((element) =>
|
||||
Array.from(element.children)
|
||||
.filter((child) => child.matches('section, button'))
|
||||
.map((child) => child.getBoundingClientRect().top)
|
||||
);
|
||||
expect(Math.abs(desktopEditorItems[0] - desktopEditorItems[1])).toBeLessThan(2);
|
||||
expect(desktopEditorItems[2]).toBeGreaterThan(desktopEditorItems[1]);
|
||||
await expect(page.locator('dialog[open]')).toContainText('Sendungsfassung');
|
||||
await expect(page.locator('dialog[open] .piece-dialog-workspace')).toBeVisible();
|
||||
await expectNoHorizontalOverflow(page);
|
||||
await page.screenshot({
|
||||
path: testInfo.outputPath('verwendungseditor-desktop.png'),
|
||||
fullPage: true
|
||||
@@ -613,9 +626,14 @@ test('a show can be planned from a template with independent usages and reserve'
|
||||
name: 'Die kleine Konsole mit dem großen Dreh bearbeiten und verschieben'
|
||||
})
|
||||
.click();
|
||||
await usages.nth(0).getByLabel('Titel').fill('Konsole als Auftakt');
|
||||
await usages.nth(0).getByLabel('Titel', { exact: true }).fill('Konsole als Auftakt');
|
||||
await usages.nth(0).locator('.piece-meta-details > summary').click();
|
||||
await usages.nth(0).getByLabel('Dauer in Minuten').fill('5');
|
||||
await usages.nth(0).getByLabel('Eigene Notizen').fill('Kurbel zuerst zeigen');
|
||||
await usages.nth(0).getByRole('button', { name: 'Recherche & Quellen' }).click();
|
||||
await usages
|
||||
.nth(0)
|
||||
.getByRole('textbox', { name: 'Interne Notizen zu dieser Verwendung', exact: true })
|
||||
.fill('Kurbel zuerst zeigen');
|
||||
await usages.nth(0).getByRole('button', { name: 'Verwendung speichern' }).click();
|
||||
await expect(reactionSection).toContainText('Konsole als Auftakt');
|
||||
|
||||
@@ -629,9 +647,14 @@ test('a show can be planned from a template with independent usages and reserve'
|
||||
name: 'Die kleine Konsole mit dem großen Dreh bearbeiten und verschieben'
|
||||
})
|
||||
.click();
|
||||
await usages.nth(1).getByLabel('Titel').fill('Konsole als Rückblick');
|
||||
await usages.nth(1).getByLabel('Titel', { exact: true }).fill('Konsole als Rückblick');
|
||||
await usages.nth(1).locator('.piece-meta-details > summary').click();
|
||||
await usages.nth(1).getByLabel('Dauer in Minuten').fill('15');
|
||||
await usages.nth(1).getByLabel('Eigene Notizen').fill('Andere Perspektive');
|
||||
await usages.nth(1).getByRole('button', { name: 'Recherche & Quellen' }).click();
|
||||
await usages
|
||||
.nth(1)
|
||||
.getByRole('textbox', { name: 'Interne Notizen zu dieser Verwendung', exact: true })
|
||||
.fill('Andere Perspektive');
|
||||
await usages.nth(1).getByRole('button', { name: 'Verwendung speichern' }).click();
|
||||
await expect(page.locator('.show-summary')).toContainText('2 Std. 25 Min.');
|
||||
|
||||
@@ -661,7 +684,7 @@ test('a show can be planned from a template with independent usages and reserve'
|
||||
name: 'Die kleine Konsole mit dem großen Dreh bearbeiten und verschieben'
|
||||
})
|
||||
.click();
|
||||
await expect(page.locator('dialog[open]')).toContainText('Sendungsspezifische Kopie');
|
||||
await expect(page.locator('dialog[open]')).toContainText('Sendungsfassung');
|
||||
await expect(
|
||||
page.locator('dialog[open]').getByRole('button', { name: 'Duplizieren' })
|
||||
).toBeVisible();
|
||||
@@ -689,7 +712,6 @@ test('a show can be planned from a template with independent usages and reserve'
|
||||
);
|
||||
await expect(reserveUsage).toHaveClass(/is-dragging/);
|
||||
await finalSectionTarget.dispatchEvent('drop', { dataTransfer: reserveTransfer });
|
||||
await reserveHandle.dispatchEvent('dragend', { dataTransfer: reserveTransfer });
|
||||
await reserveTransfer.dispose();
|
||||
await expect(page.locator('.reserve-usage')).toHaveCount(0);
|
||||
await expect(page.locator('body')).toHaveAttribute('data-builder-document', 'stable');
|
||||
@@ -699,7 +721,7 @@ test('a show can be planned from a template with independent usages and reserve'
|
||||
await savedUsage
|
||||
.getByRole('button', { name: 'Konsole als Auftakt bearbeiten und verschieben' })
|
||||
.click();
|
||||
await expect(savedUsage.getByLabel('Eigene Notizen')).toHaveValue('Kurbel zuerst zeigen');
|
||||
await expect(savedUsage.locator('textarea[name="ownNotes"]')).toHaveValue('Kurbel zuerst zeigen');
|
||||
await page.locator('dialog[open]').getByRole('button', { name: 'Editor schließen' }).click();
|
||||
const duplicatedUsage = page
|
||||
.locator('.editable-usage')
|
||||
@@ -710,7 +732,7 @@ test('a show can be planned from a template with independent usages and reserve'
|
||||
.getByRole('button', { name: 'Konsole als Rückblick bearbeiten und verschieben' })
|
||||
.click();
|
||||
await expect(duplicatedUsage.nth(1).getByLabel('Dauer in Minuten')).toHaveValue('15');
|
||||
await expect(duplicatedUsage.nth(1).getByLabel('Eigene Notizen')).toHaveValue(
|
||||
await expect(duplicatedUsage.nth(1).locator('textarea[name="ownNotes"]')).toHaveValue(
|
||||
'Andere Perspektive'
|
||||
);
|
||||
await page.locator('dialog[open]').getByRole('button', { name: 'Editor schließen' }).click();
|
||||
@@ -719,15 +741,7 @@ test('a show can be planned from a template with independent usages and reserve'
|
||||
await savedUsage
|
||||
.getByRole('button', { name: 'Konsole als Auftakt bearbeiten und verschieben' })
|
||||
.click();
|
||||
const mobileEditorItems = await page
|
||||
.locator('dialog[open] .usage-dialog-editor')
|
||||
.evaluate((element) =>
|
||||
Array.from(element.children)
|
||||
.filter((child) => child.matches('section, button'))
|
||||
.map((child) => child.getBoundingClientRect().top)
|
||||
);
|
||||
expect(mobileEditorItems[1]).toBeGreaterThan(mobileEditorItems[0]);
|
||||
expect(mobileEditorItems[2]).toBeGreaterThan(mobileEditorItems[1]);
|
||||
await expect(page.locator('dialog[open] .piece-dialog-workspace')).toBeVisible();
|
||||
await expectNoHorizontalOverflow(page);
|
||||
await page.screenshot({
|
||||
path: testInfo.outputPath('verwendungseditor-mobile.png'),
|
||||
@@ -735,18 +749,16 @@ test('a show can be planned from a template with independent usages and reserve'
|
||||
});
|
||||
await page
|
||||
.locator('dialog[open]')
|
||||
.getByRole('button', { name: 'Entfernen' })
|
||||
.getByRole('button', { name: 'Aus Sendung entfernen' })
|
||||
.scrollIntoViewIfNeeded();
|
||||
await expect(
|
||||
page.locator('dialog[open]').getByRole('button', { name: 'Entfernen' })
|
||||
page.locator('dialog[open]').getByRole('button', { name: 'Aus Sendung entfernen' })
|
||||
).toBeVisible();
|
||||
await page
|
||||
.locator('dialog[open] form[action="?/updateUsage"] input[name="revision"]')
|
||||
.evaluate((element) => ((element as HTMLInputElement).value = '1'));
|
||||
await page.locator('dialog[open]').getByRole('button', { name: 'Verwendung speichern' }).click();
|
||||
await expect(page.locator('dialog[open]').getByRole('alert')).toContainText(
|
||||
'inzwischen geändert'
|
||||
);
|
||||
await expect(page.getByRole('alert')).toContainText('inzwischen geändert');
|
||||
await page.locator('dialog[open]').getByRole('button', { name: 'Editor schließen' }).click();
|
||||
await page.getByRole('button', { name: 'Ablauf', exact: true }).click();
|
||||
await page.getByPlaceholder('Neuer Abschnitt').fill('Finales Spiel');
|
||||
@@ -863,9 +875,8 @@ test('validated YouTube and TikTok players switch without exposing private field
|
||||
);
|
||||
await page.goto('/live?show=e2e-presentation');
|
||||
const popupPromise = page.waitForEvent('popup');
|
||||
await page.getByRole('button', { name: 'Präsentationsfenster öffnen' }).click();
|
||||
await page.getByRole('button', { name: 'Ausgabe verbinden und öffnen' }).click();
|
||||
const output = await popupPromise;
|
||||
await output.waitForLoadState('networkidle');
|
||||
await expect(output.getByText('Bereit für den nächsten Inhalt')).toBeVisible();
|
||||
|
||||
await page.getByRole('button', { name: 'YouTube Kurzlink präsentieren' }).click();
|
||||
@@ -910,6 +921,7 @@ test('live control persists state and exposes only explicit presentation data',
|
||||
await page.setViewportSize({ width: 1280, height: 900 });
|
||||
await page.goto('/fundus?q=kleine+Konsole&includePlanned=1');
|
||||
await page.getByRole('heading', { name: 'Die kleine Konsole mit dem großen Dreh' }).click();
|
||||
await page.getByRole('button', { name: 'Recherche & Quellen' }).click();
|
||||
const png = Buffer.from(
|
||||
'iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mNk+A8AAQUBAScY42YAAAAASUVORK5CYII=',
|
||||
'base64'
|
||||
@@ -944,9 +956,9 @@ test('live control persists state and exposes only explicit presentation data',
|
||||
|
||||
const [popup] = await Promise.all([
|
||||
page.waitForEvent('popup'),
|
||||
page.getByRole('button', { name: 'Präsentationsfenster öffnen' }).click()
|
||||
page.getByRole('button', { name: 'Ausgabe verbinden und öffnen' }).click()
|
||||
]);
|
||||
await popup.waitForURL(/\/heinzlive\/[A-Za-z0-9_-]+$/);
|
||||
await popup.waitForURL(/\/heinzlive\/default#/);
|
||||
const outputUrl = popup.url();
|
||||
const anonymous = await browser.newContext();
|
||||
const output = await anonymous.newPage();
|
||||
@@ -962,14 +974,17 @@ test('live control persists state and exposes only explicit presentation data',
|
||||
timeout: 10_000
|
||||
});
|
||||
await expect(output.getByText('Weniger Leistung, mehr Idee.')).toBeVisible();
|
||||
await expect(output.getByAltText('Kleine Konsole im Live-Bild')).toBeVisible();
|
||||
await expect(output.getByAltText('Kleine Konsole im Live-Bild')).toHaveCount(0);
|
||||
await output.screenshot({ path: testInfo.outputPath('heinzlive-output.png'), fullPage: true });
|
||||
const outputHtml = await output.content();
|
||||
expect(outputHtml).not.toContain('Herstellerangaben');
|
||||
expect(outputHtml).not.toContain('Erst Formfaktor zeigen');
|
||||
expect(outputHtml).not.toContain(adminEmail);
|
||||
expect(outputHtml).not.toContain('live-konsole.png');
|
||||
const outputState = await anonymous.request.get(`${outputUrl}/state`);
|
||||
const stateUrl = new URL(outputUrl);
|
||||
stateUrl.hash = '';
|
||||
stateUrl.pathname += '/state';
|
||||
const outputState = await anonymous.request.get(stateUrl.toString());
|
||||
expect(outputState.status()).toBe(200);
|
||||
const outputJson = await outputState.text();
|
||||
expect(outputJson).toContain('Weniger Leistung');
|
||||
@@ -999,9 +1014,11 @@ test('live control persists state and exposes only explicit presentation data',
|
||||
await page.evaluate(() => {
|
||||
window.open = () => null;
|
||||
});
|
||||
await page.getByRole('button', { name: 'Präsentationsfenster öffnen' }).click();
|
||||
await page.getByRole('button', { name: 'Ausgabe verbinden und öffnen' }).click();
|
||||
await expect(
|
||||
page.getByText('Popup blockiert. Bitte Popups erlauben und erneut öffnen.')
|
||||
page
|
||||
.getByRole('status')
|
||||
.filter({ hasText: 'Präsentationsfenster konnte nicht geöffnet werden' })
|
||||
).toBeVisible();
|
||||
await anonymous.close();
|
||||
await popup.close();
|
||||
@@ -1014,13 +1031,14 @@ test('pieces autosave safely, detect conflicts and protect uploaded images', asy
|
||||
}, testInfo) => {
|
||||
await page.setViewportSize({ width: 1280, height: 1000 });
|
||||
await page.goto('/fundus');
|
||||
await page.getByText('Neues Piece anlegen').click();
|
||||
await page.locator('.template-picker > summary').click();
|
||||
await page.getByRole('button', { name: /Reaction \/ Fundstück/ }).click();
|
||||
await expect(page).toHaveURL(/\/fundus\/[a-f0-9-]+$/);
|
||||
const pieceUrl = page.url();
|
||||
|
||||
await page.getByLabel('Titel').fill('E2E Fundstück mit Markdown');
|
||||
await page.getByRole('link', { name: '← Fundus', exact: true }).click();
|
||||
await page.getByLabel('Titel', { exact: true }).fill('E2E Fundstück mit Markdown');
|
||||
await expect(page.locator('.save-indicator')).toContainText('Gespeichert', { timeout: 10_000 });
|
||||
await page.getByRole('button', { name: 'Editor schließen' }).click();
|
||||
await expect(page).toHaveURL(/\/fundus$/);
|
||||
await page.getByRole('heading', { name: 'E2E Fundstück mit Markdown' }).click();
|
||||
await expect(page).toHaveURL(pieceUrl);
|
||||
@@ -1032,16 +1050,20 @@ test('pieces autosave safely, detect conflicts and protect uploaded images', asy
|
||||
await page.getByLabel('Dauer in Minuten').fill('10.25');
|
||||
await page.getByLabel('Gaming').check();
|
||||
await openEditorialField(page, 'Private Recherche');
|
||||
await page.getByLabel('Private Recherche').fill('Nur intern: **Hintergrund prüfen**.');
|
||||
await page
|
||||
.getByRole('textbox', { name: 'Private Recherche', exact: true })
|
||||
.fill('Nur intern: **Hintergrund prüfen**.');
|
||||
await openEditorialField(page, 'Moderationsstichpunkte');
|
||||
await page.getByLabel('Moderationsstichpunkte').fill('Den Kern in zwei Sätzen erklären.');
|
||||
await page
|
||||
.getByRole('textbox', { name: 'Moderationsstichpunkte', exact: true })
|
||||
.fill('Den Kern in zwei Sätzen erklären.');
|
||||
await openEditorialField(page, 'Private Recherche');
|
||||
await expect(page.getByLabel('Private Recherche')).toHaveValue(
|
||||
await expect(page.getByRole('textbox', { name: 'Private Recherche', exact: true })).toHaveValue(
|
||||
'Nur intern: **Hintergrund prüfen**.'
|
||||
);
|
||||
await openEditorialField(page, 'Präsentationstext');
|
||||
await page
|
||||
.getByLabel('Öffentlicher Text')
|
||||
.getByRole('textbox', { name: 'Öffentlicher Text', exact: true })
|
||||
.fill('## Sichere Vorschau\n\n<script>globalThis.e2eXss = true</script> **sichtbar**');
|
||||
await openEditorialField(page, 'Private Recherche');
|
||||
await page.getByRole('button', { name: 'Quelle hinzufügen' }).click();
|
||||
@@ -1056,11 +1078,11 @@ test('pieces autosave safely, detect conflicts and protect uploaded images', asy
|
||||
await expect(page.locator('.piece-presentation-preview script')).toHaveCount(0);
|
||||
await expect(page.locator('.piece-presentation-preview')).toContainText('Sichere Vorschau');
|
||||
await page.reload();
|
||||
await expect(page.getByLabel('Titel')).toHaveValue('E2E Fundstück mit Markdown');
|
||||
await expect(page.getByLabel('Titel', { exact: true })).toHaveValue('E2E Fundstück mit Markdown');
|
||||
await page.getByText('Status, Dauer und Einordnung').click();
|
||||
await expect(page.getByLabel('Dauer in Minuten')).toHaveValue('10.25');
|
||||
await openEditorialField(page, 'Private Recherche');
|
||||
await expect(page.getByLabel('Private Recherche')).toHaveValue(
|
||||
await expect(page.getByRole('textbox', { name: 'Private Recherche', exact: true })).toHaveValue(
|
||||
'Nur intern: **Hintergrund prüfen**.'
|
||||
);
|
||||
|
||||
@@ -1088,7 +1110,7 @@ test('pieces autosave safely, detect conflicts and protect uploaded images', asy
|
||||
|
||||
const concurrent = await page.context().newPage();
|
||||
await concurrent.goto(pieceUrl);
|
||||
await page.getByLabel('Titel').fill('E2E Fundstück, extern aktualisiert');
|
||||
await page.getByLabel('Titel', { exact: true }).fill('E2E Fundstück, extern aktualisiert');
|
||||
await expect(page.locator('.save-indicator')).toContainText('Gespeichert', { timeout: 10_000 });
|
||||
await concurrent.getByText('Status, Dauer und Einordnung').click();
|
||||
await concurrent
|
||||
@@ -1098,7 +1120,9 @@ test('pieces autosave safely, detect conflicts and protect uploaded images', asy
|
||||
timeout: 10_000
|
||||
});
|
||||
await concurrent.reload();
|
||||
await expect(concurrent.getByLabel('Titel')).toHaveValue('E2E Fundstück, extern aktualisiert');
|
||||
await expect(concurrent.getByLabel('Titel', { exact: true })).toHaveValue(
|
||||
'E2E Fundstück, extern aktualisiert'
|
||||
);
|
||||
await concurrent.getByText('Status, Dauer und Einordnung').click();
|
||||
await expect(concurrent.getByLabel('Kurzbeschreibung')).not.toHaveValue(
|
||||
'Diese veraltete Änderung darf nicht gewinnen.'
|
||||
@@ -1110,7 +1134,7 @@ test('pieces autosave safely, detect conflicts and protect uploaded images', asy
|
||||
await expect(
|
||||
page.getByRole('heading', { name: 'E2E Fundstück, extern aktualisiert' })
|
||||
).toBeVisible();
|
||||
await page.getByRole('link', { name: 'Bearbeiten' }).click();
|
||||
await page.getByRole('heading', { name: 'E2E Fundstück, extern aktualisiert' }).click();
|
||||
await page.getByRole('button', { name: 'Piece archivieren' }).click();
|
||||
await expect(page).toHaveURL(/\/archiv$/);
|
||||
const archived = page.locator('.archive-list article').filter({ hasText: 'extern aktualisiert' });
|
||||
@@ -1119,18 +1143,19 @@ test('pieces autosave safely, detect conflicts and protect uploaded images', asy
|
||||
await expect(archived).toHaveCount(0);
|
||||
await page.goto('/fundus?q=extern+aktualisiert');
|
||||
await expect(page.locator('.piece-card')).toHaveCount(1);
|
||||
await page.locator('.piece-card .piece-actions > summary').click();
|
||||
await page.locator('.piece-card').getByRole('button', { name: 'Duplizieren' }).click();
|
||||
await expect(page.getByLabel('Titel')).toHaveValue(
|
||||
await expect(page.getByLabel('Titel', { exact: true })).toHaveValue(
|
||||
'Kopie von E2E Fundstück, extern aktualisiert'
|
||||
);
|
||||
|
||||
await page.context().setOffline(true);
|
||||
await page.getByLabel('Titel').fill('Kopie mit unterbrochener Verbindung');
|
||||
await page.getByLabel('Titel', { exact: true }).fill('Kopie mit unterbrochener Verbindung');
|
||||
await expect(page.locator('.save-indicator')).toContainText('Speichern fehlgeschlagen', {
|
||||
timeout: 10_000
|
||||
});
|
||||
await page.context().setOffline(false);
|
||||
await page.getByRole('button', { name: 'Jetzt speichern' }).click();
|
||||
await page.getByRole('button', { name: 'Erneut speichern' }).click();
|
||||
await expect(page.locator('.save-indicator')).toContainText('Gespeichert', { timeout: 10_000 });
|
||||
|
||||
await page.setViewportSize({ width: 390, height: 844 });
|
||||
@@ -1168,15 +1193,15 @@ test('a quickly captured video can be written and previewed before classificatio
|
||||
|
||||
await openEditorialField(page, 'Private Recherche');
|
||||
await page
|
||||
.getByLabel('Private Recherche')
|
||||
.getByRole('textbox', { name: 'Private Recherche', exact: true })
|
||||
.fill('Warum funktioniert der Einstieg so unmittelbar?');
|
||||
await openEditorialField(page, 'Moderationsstichpunkte');
|
||||
await page
|
||||
.getByLabel('Moderationsstichpunkte')
|
||||
.getByRole('textbox', { name: 'Moderationsstichpunkte', exact: true })
|
||||
.fill('Erst Clip zeigen, dann die Beobachtung öffnen.');
|
||||
|
||||
await page.getByRole('button', { name: 'Präsentation', exact: true }).click();
|
||||
await page.getByLabel('Video').check();
|
||||
await page.getByRole('radio', { name: 'Video', exact: true }).check();
|
||||
await page.getByRole('combobox', { name: 'Quelle', exact: true }).selectOption('0');
|
||||
await expect(page.locator('.save-indicator')).toContainText('Gespeichert', { timeout: 10_000 });
|
||||
|
||||
@@ -1191,9 +1216,9 @@ test('a quickly captured video can be written and previewed before classificatio
|
||||
|
||||
await page.setViewportSize({ width: 390, height: 844 });
|
||||
await page.getByRole('button', { name: 'Präsentation', exact: true }).click();
|
||||
await expect(page.getByLabel('Video')).toBeVisible();
|
||||
await expect(page.getByRole('radio', { name: 'Video', exact: true })).toBeVisible();
|
||||
await page.getByRole('button', { name: 'Recherche & Quellen' }).click();
|
||||
await expect(page.getByLabel('Private Recherche')).toBeVisible();
|
||||
await expect(page.getByRole('textbox', { name: 'Private Recherche', exact: true })).toBeVisible();
|
||||
await expectNoHorizontalOverflow(page);
|
||||
});
|
||||
|
||||
@@ -1202,14 +1227,14 @@ test('link preview uses one existing source, persists manual fields and isolates
|
||||
}, testInfo) => {
|
||||
await page.goto('/fundus/piece-console');
|
||||
await page.getByRole('button', { name: 'Präsentation', exact: true }).click();
|
||||
await page.getByLabel('Linkvorschau').check();
|
||||
await page.getByRole('radio', { name: 'Linkvorschau', exact: true }).check();
|
||||
await page.getByRole('combobox', { name: 'Quelle', exact: true }).selectOption('0');
|
||||
await page.getByLabel('Titel', { exact: true }).last().fill('Manuell korrigierte Linkvorschau');
|
||||
await page.getByLabel('Anreißer').fill('Ein kurzer manueller Anreißer ohne Vorschaubild.');
|
||||
await expect(page.locator('.save-indicator')).toContainText('Gespeichert', { timeout: 10_000 });
|
||||
await page.reload();
|
||||
await page.getByRole('button', { name: 'Präsentation', exact: true }).click();
|
||||
await expect(page.getByLabel('Linkvorschau')).toBeChecked();
|
||||
await expect(page.getByRole('radio', { name: 'Linkvorschau', exact: true })).toBeChecked();
|
||||
await expect(page.getByLabel('Titel', { exact: true }).last()).toHaveValue(
|
||||
'Manuell korrigierte Linkvorschau'
|
||||
);
|
||||
|
||||
Reference in new issue
Block a user