+ $resp = $this->get('/settings/roles/' . $role->id);
+ $this->withHtml($resp)->assertElementContains('a[href="' . url("/settings/roles/delete/$role->id") . '"]', 'Delete Role');
+
+ $resp = $this->get("/settings/roles/delete/$role->id");
+ $resp->assertSee($testRoleUpdateName);
+ $this->withHtml($resp)->assertElementContains('form[action="' . url("/settings/roles/delete/$role->id") . '"]', 'Confirm');
+
+ $resp = $this->delete("/settings/roles/delete/$role->id");
+ $resp->assertRedirect('/settings/roles');
+ $this->get('/settings/roles')->assertSee('Role successfully deleted');
+ $this->assertActivityExists(ActivityType::ROLE_DELETE);
+ }
+
+ public function test_admin_role_cannot_be_removed_if_user_last_admin()
+ {
+ /** @var Role $adminRole */
+ $adminRole = Role::query()->where('system_name', '=', 'admin')->first();
+ $adminUser = $this->getAdmin();
+ $adminRole->users()->where('id', '!=', $adminUser->id)->delete();
+ $this->assertEquals(1, $adminRole->users()->count());
+
+ $viewerRole = $this->getViewer()->roles()->first();
+
+ $editUrl = '/settings/users/' . $adminUser->id;
+ $resp = $this->actingAs($adminUser)->put($editUrl, [
+ 'name' => $adminUser->name,
+ 'email' => $adminUser->email,
+ 'roles' => [
+ 'viewer' => strval($viewerRole->id),
+ ],
+ ]);
+
+ $resp->assertRedirect($editUrl);
+
+ $resp = $this->get($editUrl);
+ $resp->assertSee('This user is the only user assigned to the administrator role');
+ }
+
+ public function test_migrate_users_on_delete_works()
+ {
+ /** @var Role $roleA */
+ $roleA = Role::query()->create(['display_name' => 'Delete Test A']);
+ /** @var Role $roleB */
+ $roleB = Role::query()->create(['display_name' => 'Delete Test B']);
+ $this->user->attachRole($roleB);
+
+ $this->assertCount(0, $roleA->users()->get());
+ $this->assertCount(1, $roleB->users()->get());
+
+ $deletePage = $this->asAdmin()->get("/settings/roles/delete/$roleB->id");
+ $this->withHtml($deletePage)->assertElementExists('select[name=migrate_role_id]');
+ $this->asAdmin()->delete("/settings/roles/delete/$roleB->id", [
+ 'migrate_role_id' => $roleA->id,
+ ]);
+
+ $this->assertCount(1, $roleA->users()->get());
+ $this->assertEquals($this->user->id, $roleA->users()->first()->id);
+ }
+
+ public function test_copy_role_button_shown()
+ {
+ /** @var Role $role */
+ $role = Role::query()->first();
+ $resp = $this->asAdmin()->get("/settings/roles/{$role->id}");
+ $this->withHtml($resp)->assertElementContains('a[href$="/roles/new?copy_from=' . $role->id . '"]', 'Copy');
+ }
+
+ public function test_copy_from_param_on_create_prefills_with_other_role_data()
+ {
+ /** @var Role $role */
+ $role = Role::query()->first();
+ $resp = $this->asAdmin()->get("/settings/roles/new?copy_from={$role->id}");
+ $resp->assertOk();
+ $this->withHtml($resp)->assertElementExists('input[name="display_name"][value="' . ($role->display_name . ' (Copy)') . '"]');