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.
84 lines
2.7 KiB
PHP
84 lines
2.7 KiB
PHP
#!/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";
|