Steuerkram/scripts/e2e-user.php

87 lines
2.9 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::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";