Steuerkram/scripts/e2e-user.php
fds2610-bot 7cea573ffc Fix #e2e: E2E-Tests ergänzt, /accounts/new und /assets/new lieferten HTTP 500
Steuerkram an den e2e-runner angebunden (tests/e2e/, 44 Playwright-Tests).
Der erste Smoke-Lauf fand zwei Seiten mit HTTP 500: AccountController::create
las $_GET['from'] ungeprüft, assets/form.php nutzte $testMode und
$defaultKontoId außerhalb des Bearbeiten-Zweigs. Beides war bis zur
Fehler-Härtung (#142) nur eine stille Warning.

Test 67 räumt sein Belegverzeichnis jetzt mit ab - es blieb als root-eigenes
Verzeichnis liegen und blockierte spätere echte Uploads mit HTTP 500.

Test 77 (neu) sichert die Löschsperre von Beleg::delete() ab.
2026-08-02 11:58:33 +02:00

84 lines
2.7 KiB
PHP
Raw 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.

#!/usr/bin/env php
<?php
declare(strict_types=1);
/**
* Legt den Testnutzer für die E2E-Tests an (idempotent).
*
* Die E2E-Tests (tests/e2e/) melden sich über das Login-Formular an und
* brauchen dafür einen eigenen Account – nicht den Arbeits-Account, dessen
* Passwort hier sonst überschrieben würde.
*
* Der Aufruf ist wiederholbar: Existiert der Nutzer schon, werden nur Passwort
* und Status zurückgesetzt (aktiv, keine Fehlversuche, nicht gesperrt).
*
* Verwendung:
* docker compose exec web php scripts/e2e-user.php
* docker compose exec web php scripts/e2e-user.php <username> <passwort>
* docker compose exec web php scripts/e2e-user.php --delete
*
* Die Defaults entsprechen tests/e2e/helpers/env.js.
*/
$projectRoot = dirname(__DIR__);
if (!file_exists($projectRoot . '/vendor/autoload.php')) {
fwrite(STDERR, "Fehler: vendor/autoload.php nicht gefunden. Bitte 'composer install' ausführen.\n");
exit(1);
}
require $projectRoot . '/vendor/autoload.php';
\Steuerkram\Config::load();
use Steuerkram\Database;
use Steuerkram\Models\User;
const E2E_DEFAULT_USER = 'e2e';
const E2E_DEFAULT_PASSWORD = 'e2e-test-Pass123!';
$args = array_slice($argv, 1);
$delete = in_array('--delete', $args, true);
$args = array_values(array_filter($args, static fn(string $a): bool => $a !== '--delete'));
$username = $args[0] ?? E2E_DEFAULT_USER;
$password = $args[1] ?? E2E_DEFAULT_PASSWORD;
$existing = User::findByUsername($username);
if ($delete) {
if (!$existing) {
echo "Testnutzer \"{$username}\" existiert nicht – nichts zu tun.\n";
exit(0);
}
User::delete((int)$existing['id']);
echo "Testnutzer \"{$username}\" gelöscht.\n";
exit(0);
}
if ($existing) {
$id = (int)$existing['id'];
User::update($id, $username, $password);
User::setActive($id, true);
User::resetFailedLogins($id);
echo "Testnutzer \"{$username}\" aktualisiert (Passwort neu gesetzt, aktiv, entsperrt).\n";
} else {
User::create($username, $password);
$created = User::findByUsername($username);
if (!$created) {
fwrite(STDERR, "Fehler: Testnutzer \"{$username}\" konnte nicht angelegt werden.\n");
exit(1);
}
echo "Testnutzer \"{$username}\" angelegt.\n";
}
// Gegenprobe: Das Passwort muss zum gespeicherten Hash passen, sonst läuft der
// E2E-Login in den Throttle und sperrt den Account.
$check = User::findByUsername($username);
if (!$check || !password_verify($password, $check['password_hash'])) {
fwrite(STDERR, "Fehler: Passwortprüfung für \"{$username}\" fehlgeschlagen.\n");
exit(1);
}
$anzahl = (int)(Database::fetchOne('SELECT COUNT(*) AS n FROM users')['n'] ?? 0);
echo "Benutzer in der Datenbank: {$anzahl}\n";
echo "E2E-Tests starten mit: tests/e2e/run.sh\n";