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>
46 lines
1.5 KiB
PHP
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();
|
|
});
|