87 lines
2.9 KiB
PHP
87 lines
2.9 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/container/e2e-user.php
|
||
* docker compose exec web php scripts/container/e2e-user.php <username> <passwort>
|
||
* docker compose exec web php scripts/container/e2e-user.php --delete
|
||
*
|
||
* Die Defaults entsprechen tests/e2e/helpers/env.js.
|
||
*/
|
||
|
||
$projectRoot = dirname(__DIR__, 2);
|
||
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::setRole($id, 'admin');
|
||
User::resetFailedLogins($id);
|
||
echo "Testnutzer \"{$username}\" aktualisiert (Passwort neu gesetzt, aktiv, entsperrt, Rolle admin).\n";
|
||
} else {
|
||
// Rolle admin, damit die E2E-Suite auch die Benutzerverwaltung
|
||
// (/useradmin) erreichen kann (Fix #147).
|
||
User::create($username, $password, 'admin');
|
||
$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";
|