50 lines
2 KiB
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 ?? [];
|
|
}
|
|
}
|
|
}
|