Files
florian.wildeandClaude Opus 5.5 86b650e20a feat(server): Verbindungstest mit Fähigkeitserkennung
Der Test liest Version, Cluster, Nodes, Storages, Bridges, VNets und die
effektiven Rechte des Tokens und leitet daraus ab, welcher Vorgang per
API, per SSH oder gar nicht geht – je PVE-Version: Template-Bau per API
erst ab 8.4 mit import-Storage, Snippets und LXC-Exec nur per SSH.

Fehlende Rechte erscheinen einzeln mit Pfad und Zweck; die Rollenliste
in docs/proxmox-rechte.md prüft ein Test gegen den Code. SSH-Host-Keys
werden wie Zertifikate erst nach Bestätigung genutzt, und bestätigt
werden kann nur ein Schlüssel, den der letzte Test gesehen hat.

Statussymbole in der GUI sind jetzt gezeichnet: ◐ und ○ fehlen im
Web-Subset von JetBrains Mono.

Refs #003

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-12 09:44:27 +02:00

50 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 { MOCK_TOKEN_GEHEIMNIS, MOCK_TOKEN_ID } from "../proxmox-mock/mock";
import { MOCK_PORT } from "./global-setup";
import { anmelden, E2E_PRAEFIX, keinQuerscrollen } from "./helfer";
test("Server anlegen: Zertifikat pinnen, Verbindung prüfen, SSH-Schlüssel, löschen", async ({ page }) => {
const name = `${E2E_PRAEFIX}-${test.info().project.name}`;
await anmelden(page, "/server/neu");
await expect(page.getByRole("heading", { name: "Server anlegen" })).toBeVisible();
await keinQuerscrollen(page);
await page.getByLabel("Kurzname").fill(name);
await page.getByLabel("Anzeigename").fill("E2E-Testserver");
await page.getByLabel("Adresse").fill(`127.0.0.1:${MOCK_PORT}`);
await page.getByRole("button", { name: "Zertifikat holen" }).click();
await expect(page.getByText("Selbst signiertes Zertifikat")).toBeVisible();
await page.getByLabel("Fingerprint stimmt – Zertifikat pinnen").check();
await page.getByLabel("Token-ID").fill(MOCK_TOKEN_ID);
await page.getByLabel("Secret").fill(MOCK_TOKEN_GEHEIMNIS);
await page.getByRole("button", { name: "Verbindung prüfen" }).click();
await expect(page.getByText("Verbunden · Proxmox VE")).toBeVisible();
await expect(page.getByText("9.2.1")).toBeVisible();
await page.screenshot({ path: `test-results/server-neu-${test.info().project.name}.png`, fullPage: true });
await page.getByLabel("SSH zu den Nodes nutzen").check();
await page.getByRole("button", { name: "Server anlegen" }).click();
await expect(page).toHaveURL(new RegExp(`/server/${name}$`));
await expect(page.getByRole("heading", { name: "E2E-Testserver" })).toBeVisible();
await page.getByRole("button", { name: "Verbindung testen" }).click();
await expect(page.getByRole("heading", { name: "Was geht auf diesem Server" })).toBeVisible();
await expect(page.getByText("Alle nötigen Rechte vorhanden.")).toBeVisible();
await expect(page.getByText("vmbr0", { exact: true })).toBeVisible();
await page.screenshot({ path: `test-results/server-test-${test.info().project.name}.png`, fullPage: true });
await page.getByRole("button", { name: "Schlüssel erzeugen" }).click();
await expect(page.getByText(/ssh-ed25519 AAAA/)).toBeVisible();
await keinQuerscrollen(page);
await page.screenshot({
path: `test-results/server-detail-${test.info().project.name}.png`,
fullPage: true,
});
await page.getByRole("button", { name: "Server löschen" }).click();
await page.getByRole("button", { name: "Wirklich löschen" }).click();
await expect(page).toHaveURL(/\/server$/);
await expect(page.getByText(name)).toHaveCount(0);
});