diff --git project.test project.test index bee2cd5..73c0cf1 100644 --- project.test +++ project.test @@ -310,3 +310,103 @@ class ProjectDrupalOrgWebTestCase extends ProjectWebTestCase { } } } + +class ProjectMaintainersTestCase extends ProjectWebTestCase { + public static function getInfo() { + return array( + 'name' => 'Project maintainers functionality', + 'description' => 'Test Project module maintainers access control system.', + 'group' => 'Project' + ); + } + + function setUp() { + parent::setUp('path'); + + $perms = array('maintain projects', 'access user profiles'); + + $this->owner = $this->drupalCreateUser($perms); + $this->drupalLogin($this->owner); + + $this->maintainer = $this->drupalCreateUser($perms); + } + + function assertFieldDisabled($name, $message = '') { + $elements = $this->xpath('//input[@name="' . $name . '"]'); + return $this->assertTrue(isset($elements[0]) && !empty($elements[0]['disabled']), $message ? $message : t('Field @name is disabled.', array('@name' => $name))); + } + + function assertFieldNotDisabled($name, $message = '') { + $elements = $this->xpath('//input[@name="' . $name . '"]'); + return $this->assertTrue(isset($elements[0]) && empty($elements[0]['disabled']), $message ? $message : t('Field @name is disabled.', array('@name' => $name))); + } + + /** + * Test maintainer permissions. + */ + function testProjectMaintainerPermissiosn() { + // Create project, make sure Maintainers link is shown + $project = $this->createProject(); + + // Check that owner can access + $this->drupalGet("node/$project->nid/edit"); + $this->assertResponse(200, 'Project owner can edit project.'); + + // Check the maintainers tab is shown and owner is included correctly + $this->drupalGet("node/$project->nid"); + $this->assertLink(t('Maintainers'), 0, ('Maintainers tab is shown.')); + $this->drupalGet("node/$project->nid/maintainers"); + $this->assertLink($this->owner->name, 0, ('Project owner is displayed on form.')); + $this->assertFieldDisabled("maintainers[{$this->owner->uid}][permissions][administer project]", 'Checkbox is disabled for project owner'); + $this->assertFieldDisabled("maintainers[{$this->owner->uid}][permissions][administer project maintainers]", 'Checkbox is disabled for project owner'); + $this->assertNoRaw("node/$project->nid/maintainers/delete/{$this->owner->uid}", 'No delete link is displayed for the project owner.'); + + // Verify that other users do not have access + $this->drupalLogin($this->maintainer); + $this->drupalGet("node/$project->nid/edit"); + $this->assertResponse(403, 'Project edit form is protected.'); + $this->drupalGet("node/$project->nid/maintainers"); + $this->assertResponse(403, 'Project maintainers form is protected.'); + + // Add a new user and verify that they are added: + // Login as owner + $this->drupalLogin($this->owner); + // Add new user + $edit = array(); + $edit['new_maintainer[user]'] = $this->maintainer->name; + $this->drupalPost("node/$project->nid/maintainers", $edit, t('Update')); + $this->assertLink($this->maintainer->name, 0, 'New user is displayed on form correctly.'); + // Add permissions to user + $edit = array(); + $edit["maintainers[{$this->maintainer->uid}][permissions][administer project]"] = TRUE; + $this->drupalPost("node/$project->nid/maintainers", $edit, t('Update')); + // Login as maintainer and check access + $this->drupalLogin($this->maintainer); + $this->drupalGet("node/$project->nid/edit"); + $this->assertResponse(200, 'User is correctly granted access to project edit form.'); + + // Have owner grant administer maintainers permission + $this->drupalLogin($this->owner); + // Add permissions to user + $edit = array(); + $edit["maintainers[{$this->maintainer->uid}][permissions][administer project maintainers]"] = TRUE; + $this->drupalPost("node/$project->nid/maintainers", $edit, t('Update')); + // Login as maintainer and check access + $this->drupalLogin($this->maintainer); + $this->drupalGet("node/$project->nid/maintainers"); + $this->assertResponse(200, 'User is correctly granted access to project edit form.'); + + // Remove the user from the project + $this->drupalLogin($this->owner); + $this->drupalGet("node/$project->nid/maintainers/delete/{$this->maintainer->uid}"); + $this->assertText("Are you sure you want to delete {$this->maintainer->name} as a maintainer of {$project->title}?", 'Deletion page is displayed properly.'); + $this->drupalPost(NULL, array(), t('Delete')); + $this->assertText("Removed {$this->maintainer->name} as a maintainer.", 'Project maintainer successfully deleted.'); + // Verify that access has been removed + $this->drupalLogin($this->maintainer); + $this->drupalGet("node/$project->nid/edit"); + $this->assertResponse(403, 'Project edit form is protected.'); + $this->drupalGet("node/$project->nid/maintainers"); + $this->assertResponse(403, 'Project maintainers form is protected.'); + } +}