1 user.test UserRoleAdminTestCase::testRoleAdministration()

Test adding, renaming and deleting roles.

File

core/modules/user/tests/user.test, line 2373
Tests for user.module.

Class

UserRoleAdminTestCase
Test case to test adding, editing and deleting roles.

Code

function testRoleAdministration() {
  $this->backdropLogin($this->admin_user);

  // Visit the main roles administration page.
  $this->backdropGet('admin/config/people/roles');

  // Ensure both submit buttons exist in the "Add role" form.
  $this->clickLink(t('Add role'));
  $this->assertUrl('admin/config/people/roles/add', array(), 'Redirected to correct URL after clicking the "+ Add role" link.');
  $this->assertTitle(t('Add role | Backdrop CMS'), 'The page title on the form page is "Add role".');
  $this->assertRaw(t('Save and set permissions'), '"Save and set permissions" button found on "Add role" form.');
  $this->assertRaw(t('Save role'), '"Save role" button found on "Add role" form.');
  $this->clickLink(t('Cancel'));
  $this->assertRaw(t('Add role'), 'Redirected to the main roles listing page.');

  // Test adding a role using the 'Save role' button.
  $role1_name = '123';
  $role1_description = 'Help text for 123 role.';
  $edit = array(
    'name' => $role1_name,
    'label' => $role1_name,
    'description' => $role1_description,
  );
  $this->backdropPost('admin/config/people/roles/add', $edit, t('Save role'));
  $this->assertText(t('The 123 role has been added.'), 'The role has been added.');
  $this->assertUrl('admin/config/people/roles', array(), 'Redirected to correct URL after clicking the "Save role" button.');
  backdrop_static_reset('user_roles');
  $role1 = user_role_load($role1_name);
  $this->assertTrue(is_object($role1), 'The role was successfully loaded from config.');

  // Ensure only one submit button exists in the "Edit role" form.
  $this->clickLink(t('Configure role'), 3);
  $this->assertUrl('admin/config/people/roles/configure/' . $role1_name, array(), 'Redirected to correct URL after clicking the "Configure role" operation.');
  $this->assertTitle(t('Configure role | Backdrop CMS'), 'The page title on the form is "Configure role".');
  $this->assertNoRaw(t('Save and set permissions'), '"Save and set permissions" button not found on "Configure role" form.');
  $this->assertRaw(t('Save role'), '"Save role" button found on "Configure role" form.');
  $this->clickLink(t('Cancel'));
  $this->assertRaw(t('Add role'), 'Redirected to the main roles listing page.');

  // Test adding a role using the 'Save and set permissions' button.
  $role2_name = '456';
  $role2_description = 'Description for 456 role.';
  $edit = array(
    'name' => $role2_name,
    'label' => $role2_name,
    'description' => $role2_description,
  );
  $this->backdropPost('admin/config/people/roles/add', $edit, t('Save and set permissions'));
  $this->assertText(t('The 456 role has been added.'), 'The role has been added.');
  $this->assertUrl('admin/config/people/permissions', array(), 'Redirected to correct URL after clicking the "Save and set permissions" button.');
  backdrop_static_reset('user_roles');
  $role2 = user_role_load($role2_name);
  $this->assertTrue(is_object($role2), 'The role was successfully loaded from config.');

  // Try adding a duplicate role.
  $duplicate_role_warning = t('The machine-readable name is already in use. It must be unique.');
  $this->backdropPost('admin/config/people/roles/add', $edit, t('Save and set permissions'));
  $this->assertRaw($duplicate_role_warning, 'Duplicate role warning displayed.');
  $this->backdropPost('admin/config/people/roles/add', $edit, t('Save role'));
  $this->assertRaw($duplicate_role_warning, 'Duplicate role warning displayed.');

  // Test renaming an existing role.
  $old_label = $role1->label;
  $new_label = '789';
  $new_description = 'Help text for 789 role. <strong>Bold text.</strong>. <xss>Stripped tag</xss>.';
  $edit = array(
    'label' => $new_label,
    'description' => $new_description,
  );
  $this->backdropPost("admin/config/people/roles/configure/$role1_name", $edit, t('Save role'));
  $this->assertText(t('The 789 role has been saved.'), 'The role has been renamed.');
  $this->assertUrl('admin/config/people/roles', array(), 'Redirected to correct URL after clicking the renaming the role.');
  backdrop_static_reset('user_roles');
  $role1 = user_role_load($role1_name);
  $this->assertFalse($role1->label === $old_label, 'The role has had its label changed.');
  $this->assertTrue($role1->label === $new_label, 'The role has the new label.');
  $this->assertTrue($role1->description === $new_description, 'The role has the new description (help text).');

  // Confirm description (help text) is shown editing a user.
  $this->backdropGet('user/' . $this->admin_user->uid . '/edit');
  $this->assertRaw(filter_xss_admin($new_description));

  // Make sure that the system-defined roles can still be edited, to adjust
  // their labels and descriptions.
  $this->backdropGet('admin/config/people/roles/configure/' . BACKDROP_ANONYMOUS_ROLE);
  $this->assertResponse(200, 'Access granted when trying to edit the built-in anonymous role.');
  $this->assertText(t('Description'));
  // Help text is hidden for the anonymous role, since it is never assigned.
  $this->assertNoText(t('Help text'));
  $this->backdropGet('admin/config/people/roles/configure/' . BACKDROP_AUTHENTICATED_ROLE);
  $this->assertText(t('Description'));
  $this->assertResponse(200, 'Access granted when trying to edit the built-in authenticated role.');

  // Create a default role for site administrators, with all available
  // permissions assigned.
  $admin_role = new stdClass();
  $admin_role->name = 'administrator';
  $admin_role->label = st('Administrator');
  $admin_role->weight = 2;
  $admin_role->permissions = array_keys(module_invoke_all('permission'));
  user_role_save($admin_role);
  // Set this as the administrator role.
  config_set('system.core', 'user_admin_role', $admin_role->name);

  $role_name = 'administrator';
  $role = user_role_load($role_name);

  // Test canceling the various actions that can be performed on user roles.
  $actions = array('configure', 'delete');
  foreach ($actions as $action) {
    $this->backdropGet("admin/config/people/roles/$action/$role_name");
    $this->clickLink(t('Cancel'));
    $this->assertResponse(200);
    $this->assertUrl('admin/config/people/roles', array(), "Redirected to correct URL after canceling $action role.");
  }

  // Test deleting the default administrator role.
  $this->backdropPost("admin/config/people/roles/delete/$role_name", array(), t('Delete'));
  $this->assertText(t('The administrator role has been deleted.'), 'The role has been deleted');
  $this->assertNoLinkByHref("admin/config/people/roles/configure/$role_name", 'Role edit link removed.');
  backdrop_static_reset('user_roles');
  $this->assertFalse(user_role_load($role_name), 'A deleted role can no longer be loaded.');
  // Since the administrator role that was previously set as admin has been
  // deleted, no role should be set as admin now.
  $this->assertFalse(config_get('system.core', 'user_admin_role'), 'No role is configured as the administrator role.');
}