Steuerkram/tests/83_UserRoleTest.php

50 lines
2 KiB
PHP

<?php
declare(strict_types=1);
use Steuerkram\Auth;
use Steuerkram\Models\User;
class UserRoleTest extends TestCase
{
protected string $testName = 'Test 83: Rollen-Feld und Auth::isAdmin() (Fix #147)';
public function run(): void
{
User::create('roletest-user', 'password123');
$normalUser = User::findByUsername('roletest-user');
$this->assertEquals('user', $normalUser['role'], 'Ohne Angabe wird ein Benutzer mit Rolle "user" angelegt');
User::create('roletest-admin', 'password123', 'admin');
$admin = User::findByUsername('roletest-admin');
$this->assertEquals('admin', $admin['role'], 'Explizit angelegter Benutzer erhält die Rolle "admin"');
User::setRole((int)$normalUser['id'], 'admin');
$promoted = User::find((int)$normalUser['id']);
$this->assertEquals('admin', $promoted['role'], 'setRole() befördert einen Benutzer nachträglich zum Admin');
$listed = User::all();
$found = null;
foreach ($listed as $u) {
if ($u['id'] === $admin['id']) { $found = $u; break; }
}
$this->assertNotEmpty($found, 'User::all() liefert den angelegten Admin-Benutzer');
$this->assertEquals('admin', $found['role'] ?? null, 'User::all() liefert das Rollen-Feld mit');
// Auth::isAdmin() liest ausschließlich aus der Session (kein DB-Zugriff),
// damit sich die Prüfung ohne echten Request isoliert testen lässt.
$backup = $_SESSION ?? null;
try {
$_SESSION = [];
$this->assert(!Auth::isAdmin(), 'Ohne Session-Rolle gilt der Benutzer nicht als Admin');
$_SESSION['role'] = 'user';
$this->assert(!Auth::isAdmin(), 'Rolle "user" in der Session ist kein Admin');
$_SESSION['role'] = 'admin';
$this->assert(Auth::isAdmin(), 'Rolle "admin" in der Session wird als Admin erkannt');
} finally {
$_SESSION = $backup ?? [];
}
}
}