Files
florian.wildeandClaude Opus 5.5 420aca3994 fix(sicherheit): Next 16.4.2 und Prisma 7.10.1
Next.js bis 16.4.0 hat zwei kritische Lücken (RCE in der Bildoptimierung mit SVG und in use cache) und eine hohe (DoS über Server Actions). Prisma 7.10.1 hebt mysql2 und deepmerge-ts über bekannte Lücken. Volle Prüfung grün; dazu der Vorlagen-Ablauf mit mehr Zeit, weil sein Dry-Run wirklich gegen den Testhost plant.

Refs #020

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-23 14:06:57 +02:00

52 lines
2.6 KiB
TypeScript
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
import { expect, test } from "@playwright/test";
import { anmelden, E2E_PRAEFIX, keinQuerscrollen } from "./helfer";
/**
* Braucht einen Server mit Verbindungstest (der Assistent zeigt sonst nur einen Hinweis). Gibt es
* keinen, wird der Ablauf übersprungen und sagt das.
*/
test("Vorlage im Assistenten anwenden und als neue Vorlage speichern", async ({ page }) => {
// Der Dry-Run plant wirklich gegen den Proxmox-Host – auf dem langsamen Testhost dauert das.
test.setTimeout(120_000);
const name = `${E2E_PRAEFIX}-${test.info().project.name}`;
await anmelden(page, "/vorlagen");
await expect(page.getByText("Docker-Host klein")).toBeVisible();
await keinQuerscrollen(page);
await page.getByRole("link", { name: "Ausrollen mit dieser Vorlage" }).first().click();
if (await page.getByText("Erst einen Server anlegen").isVisible())
test.skip(true, "Kein getesteter Server vorhanden");
await expect(page.getByLabel("Vorlage")).toHaveValue("docker-host-klein");
// Vorbelegung: Ressourcen aus der Vorlage
for (let i = 0; i < 3; i++) await page.getByRole("button", { name: "Weiter" }).click();
await page.getByLabel("Name (Hostname)").fill("pd-vorlage");
await page.getByRole("button", { name: "Weiter" }).click();
await expect(page.getByLabel("RAM (MB)")).toHaveValue("4096");
await expect(page.getByLabel("Disk (GB)")).toHaveValue("40");
// Zur Zusammenfassung springen geht nicht ohne Schlüssel – Schritt 7 ausfüllen.
await page.getByRole("button", { name: /07 Zugang/ }).click();
await page
.getByLabel("Öffentliche SSH-Schlüssel")
.fill("ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIEFTdkCuqQ6mF7I8QzmkNaQpKj7S/I2+yuxWeYasJjLd e2e@test");
await page.getByRole("button", { name: "Weiter" }).click();
await expect(page.getByLabel("Docker CE")).toBeChecked();
await page.getByRole("button", { name: "Weiter" }).click();
await expect(page.getByText(/--preset docker-host-klein/)).toBeVisible({ timeout: 90_000 });
await page.getByRole("button", { name: "Als Vorlage speichern" }).click();
await page.getByLabel("Kurzname (für --preset)").fill(name);
await page.getByLabel("Titel").fill(`E2E ${test.info().project.name}`);
await page.getByRole("button", { name: "Speichern" }).click();
await expect(page.getByText(/gespeichert/)).toBeVisible();
await page.goto("/vorlagen");
await expect(page.getByText(`--preset ${name}`)).toBeVisible();
page.once("dialog", (d) => void d.accept());
await page
.locator("li", { hasText: `--preset ${name}` })
.getByRole("button", { name: "Löschen" })
.click();
await expect(page.getByText(`--preset ${name}`)).toHaveCount(0);
});