'amministratore', 'guard_name' => 'web']); Role::create(['name' => 'assistente', 'guard_name' => 'web']); $this->admin = User::create(['name' => 'Admin', 'email' => 'admin@example.test', 'password' => 'password']); $this->admin->assignRole('amministratore'); $this->actingAs($this->admin); } public function test_non_si_toglie_a_se_stessi_il_ruolo_di_amministratore(): void { // Anche con un secondo amministratore: il declassamento di sé stessi // va chiesto a un altro. User::create(['name' => 'Altro', 'email' => 'altro@example.test', 'password' => 'password']) ->assignRole('amministratore'); $this->modificaRuolo($this->admin, 'assistente')->assertHasErrors('editSelectedRole'); $this->assertTrue($this->admin->fresh()->hasRole('amministratore')); } public function test_non_si_declassa_l_ultimo_amministratore(): void { // Chi modifica non è l'amministratore stesso, così la regola su sé // stessi non entra in gioco: si prova solo quella sull'ultimo. Il // permesso della pagina sta nel middleware della rotta, che // Livewire::test non attraversa. $operatore = User::create(['name' => 'Operatore', 'email' => 'op@example.test', 'password' => 'password']); $operatore->assignRole('assistente'); $this->actingAs($operatore); $this->modificaRuolo($this->admin, 'assistente')->assertHasErrors('editSelectedRole'); $this->assertTrue($this->admin->fresh()->hasRole('amministratore')); } public function test_un_amministratore_ne_declassa_un_altro_se_non_e_l_ultimo(): void { $altro = User::create(['name' => 'Altro', 'email' => 'altro@example.test', 'password' => 'password']); $altro->assignRole('amministratore'); $this->modificaRuolo($altro, 'assistente')->assertHasNoErrors(); $this->assertTrue($altro->fresh()->hasRole('assistente')); $this->assertFalse($altro->fresh()->hasRole('amministratore')); } private function modificaRuolo(User $utente, string $ruolo) { return Livewire::test(UsersIndex::class) ->set('editingUserId', $utente->id) ->set('editName', $utente->name) ->set('editEmail', $utente->email) ->set('editSelectedRole', $ruolo) ->call('updateUser'); } }