presseportale/tests/Feature/BackfillPortalRoleTest.php
Kevin Adametz 7c5518dc97 Fix: rollenlose aktive Nutzer -> Backfill-Command + Import-Nachlauf
Problem: Ein eingeloggter Nutzer ohne admin/editor/customer-Rolle wird per
redirectUsersTo auf die Startseite geleitet und haengt dort fest. Ursache
sind Alt-Konten, deren Rollen-Zuweisung nie lief (frueher Import bzw. ein
nach dem User-Insert fehlgeschlagener Rollen-Sync).

- Neues Command users:backfill-portal-role (--role, --dry-run): weist aktiven,
  komplett rollenlosen Nutzern die customer-Rolle zu. api-only-Konten haben
  bereits eine Rolle und bleiben unangetastet; inaktive werden uebersprungen.
- legacy:import ruft den Backfill nach dem User-Schritt automatisch auf
  (self-heal, da updateOrCreate + Rollen-Sync nicht atomar sind).

Analyse-Ergebnis nebenbei: In der aktuellen DB war nur genau 1 echter Fall
(bereits gefixt); die zuvor genannten ~167 waren fast alle api-only (gewollt
ohne Portal-Zugriff). Command laeuft daher jetzt sauber auf 0.

Test: BackfillPortalRoleTest (customer-Zuweisung, Rollen-Erhalt bei
customer/api-only, Ueberspringen Inaktiver, dry-run).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-02 09:23:56 +00:00

46 lines
1.5 KiB
PHP

<?php
use App\Models\User;
use Database\Seeders\RolesAndPermissionsSeeder;
use Tests\TestCase;
beforeEach(function (): void {
/** @var TestCase $this */
$this->seed(RolesAndPermissionsSeeder::class);
});
test('assigns customer role to active roleless users', function () {
$stuck = User::factory()->create(['is_active' => true]);
$this->artisan('users:backfill-portal-role')->assertSuccessful();
expect($stuck->fresh()->hasRole('customer'))->toBeTrue();
});
test('leaves users that already have a role untouched', function () {
$customer = User::factory()->create(['is_active' => true]);
$customer->assignRole('customer');
$apiOnly = User::factory()->create(['is_active' => true]);
$apiOnly->assignRole('api-only');
$this->artisan('users:backfill-portal-role')->assertSuccessful();
expect($customer->fresh()->getRoleNames()->all())->toBe(['customer'])
->and($apiOnly->fresh()->getRoleNames()->all())->toBe(['api-only']);
});
test('skips inactive roleless users', function () {
$inactive = User::factory()->create(['is_active' => false]);
$this->artisan('users:backfill-portal-role')->assertSuccessful();
expect($inactive->fresh()->roles()->exists())->toBeFalse();
});
test('dry-run assigns nothing', function () {
$stuck = User::factory()->create(['is_active' => true]);
$this->artisan('users:backfill-portal-role', ['--dry-run' => true])->assertSuccessful();
expect($stuck->fresh()->roles()->exists())->toBeFalse();
});