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>
50 lines
2.6 KiB
TypeScript
50 lines
2.6 KiB
TypeScript
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);
|
||
});
|