forum_access.test in Forum Access 6
Test file for forum_access.module.
File
forum_access.testView source
<?php
/**
* @file
* Test file for forum_access.module.
*/
/**
* This is the base class for forum access testing.
*/
class ForumAccessTestCase extends DrupalWebTestCase {
/**
* Implements setUp().
*/
public function setUp() {
$this->timeLimit = 600;
//$this->testForumAccessUseDNA = module_exists('devel_node_access');
if ($this->testForumAccessUseDNA) {
parent::setUp('forum_access', 'forum', 'comment', 'acl', 'devel_node_access');
}
else {
parent::setUp('forum_access', 'forum', 'comment', 'acl');
}
}
/**
* This variable holds the current forum Id.
*/
private $testForumAccessCurrentForumId = 0;
/**
* This variable holds the admin user account.
*/
private $testForumAccessAdminUser;
/**
* This variable is an array with user objects.
*/
private $testForumAccessUsers = array();
/**
* This variable is an array with user permissions (also in an array).
*/
private $testForumAccessPermissions = array();
/**
* This variable is an array with the permissions of the anonymous userrole.
*/
private $testForumAccessPermissionsAnonymous = array();
/**
* This variable is an array with uids to forum access test username
* (NOT $user->name).
*/
private $testForumAccessUidToName = array();
/**
* This variable is the forum access test username of the logged in
* user (NOT $user->name).
*/
private $testForumAccessCurrentUsername = '';
/**
* This variable is the forum access users with moderator status in an
* array with uids.
*/
private $testForumAccessModerators = array();
/**
* This variable is the forum grants of the tested forum configuration
* in an array.
*/
private $testForumAccessGrants = array(
'anonymous_view' => TRUE,
'anonymous_create' => TRUE,
'anonymous_update' => TRUE,
'anonymous_delete' => TRUE,
'authenticated_view' => TRUE,
'authenticated_create' => TRUE,
'authenticated_update' => TRUE,
'authenticated_delete' => TRUE,
);
/**
* This variable determines whether the Devel Node Access module is
* active; it's set in setUp().
*/
private $testForumAccessUseDNA = FALSE;
/**
* The main function which is used to start testing a specific forum
* configuration.
*
* You can add new users with specific permissions.
* You can also remove users with permissions who are not important to you,
* please do NOT remove the admin_user!
*/
protected function testForumAccessRun($grants = array()) {
if (is_array($grants) && isset($grants['anonymous_view']) && isset($grants['anonymous_create']) && isset($grants['anonymous_update']) && isset($grants['anonymous_delete']) && isset($grants['authenticated_view']) && isset($grants['authenticated_create']) && isset($grants['authenticated_update']) && isset($grants['authenticated_delete'])) {
// permissions for default roles
$this
->testForumAccessSetPermissionsAnonymousRole();
$this
->testForumAccessSetPermissionsAuthenticatedRole();
$this
->testForumAccessCreateUser('admin_user', array(
'administer site configuration',
'access administration pages',
'administer nodes',
'administer blocks',
'administer comments',
'administer forums',
'create forum topics',
'post comments',
'post comments without approval',
'access content',
'access comments',
));
// view
$this
->testForumAccessCreateUser('normal_user_1');
// no permissions
//$this->testForumAccessCreateUser('normal_user_2', array('access content'));
//$this->testForumAccessCreateUser('normal_user_3', array('access comments'));
$this
->testForumAccessCreateUser('normal_user_4', array(
'access content',
'access comments',
));
// create
$this
->testForumAccessCreateUser('normal_user_5', array(
'access content',
'access comments',
'post comments',
'post comments without approval',
));
$this
->testForumAccessCreateUser('normal_user_6', array(
'access content',
'access comments',
'post comments',
'post comments without approval',
'create forum topics',
));
// edit & delete
$this
->testForumAccessCreateUser('normal_user_7', array(
'access content',
'access comments',
'post comments',
'post comments without approval',
'create forum topics',
'edit own forum topics',
'delete own forum topics',
));
$this
->testForumAccessCreateUser('normal_user_8', array(
'access content',
'access comments',
'post comments',
'post comments without approval',
'create forum topics',
'edit any forum topic',
'delete any forum topic',
));
$this
->testForumAccessCreateUser('normal_user_9', array(
'access content',
'access comments',
'post comments',
'post comments without approval',
'create forum topics',
'delete own forum topics',
'delete any forum topic',
));
// You can create extra users here.
//$this->testForumAccessCreateUser('unique_name', array('permissions'));
$this
->testForumAccessLogin('admin_user');
// Disable clean URLs (on qa.d.o they are disabled!).
//$this->drupalPost('admin/settings/clean-urls', array('clean_url' => 0), t('Save configuration'));
if ($this->testForumAccessUseDNA) {
// Enable Devel Node Access verbose mode.
$this
->drupalPost('admin/settings/devel', array(
'devel_node_access_debug_mode' => 1,
), t('Save configuration'));
$this
->drupalPost('admin/build/block/list/garland', array(
'devel_node_access_1[region]' => 'footer',
), t('Save blocks'));
}
// Rebuild permissions.
$this
->drupalPost('admin/content/node-settings/rebuild', array(), t('Rebuild permissions'));
// Delete all cached permissions.
user_access(NULL, NULL, TRUE);
// Create the forum with the appropriate grants.
$this->testForumAccessCurrentForumId = $this
->testForumAccessCreateForum($grants);
if ($this->testForumAccessCurrentForumId == 0) {
$this
->pass(t('There was a problem creating a forum for this test.'), 'Debug');
return;
}
// Save the grants.
$this->testForumAccessGrants = $grants;
// for every user except the admin_user
foreach ($this->testForumAccessUsers as $forumAccessUser) {
// Do the loop 3 times, once as an anonymous user and once as an
// authenticated user and once as moderator, all with the same permissions.
for ($i = 0; $i < 3; $i++) {
// admin makes default content to start.
if ($this->testForumAccessCurrentUsername != 'admin_user') {
$this
->testForumAccessLogin('admin_user');
}
$admin_topic_id = $this
->testForumAccessCreateTopic();
$admin_comment_id = $this
->testForumAccessCreateComment($admin_topic_id);
$this
->testForumAccessLogout();
switch ($i) {
case 0:
// anonymous user with the same permissions
$this
->testForumAccessSetPermissionsAnonymousRole($this->testForumAccessPermissions[$this->testForumAccessUidToName[$forumAccessUser->uid]]);
break;
case 1:
// authenticated user
$this
->testForumAccessLogin($this->testForumAccessUidToName[$forumAccessUser->uid]);
break;
case 2:
// upgrade authenticated user to moderator
$this
->testForumAccessLogin('admin_user');
$this
->testForumAccessAddModerator($forumAccessUser->uid);
$this
->testForumAccessLogin($this->testForumAccessUidToName[$forumAccessUser->uid]);
break;
}
// view
$this
->testForumAccessViewForum();
$this
->testForumAccessViewTopic($admin_topic_id);
$this
->testForumAccessViewComment($admin_topic_id, $admin_comment_id);
// create
$user_topic_id = $this
->testForumAccessCreateTopic();
if (intval($user_topic_id) == 0) {
$user_topic_id = $admin_topic_id;
}
$user_comment_id = $this
->testForumAccessCreateComment($user_topic_id);
if (intval($user_comment_id) == 0) {
$user_comment_id = $admin_comment_id;
}
$user_reply_id = 0;
if ($this
->testForumAccessCreateReply($user_topic_id, $user_comment_id)) {
$user_reply_id = $user_comment_id + 1;
}
// edit
if ($user_topic_id != $admin_topic_id) {
$this
->testForumAccessUpdateTopic($user_topic_id);
}
if ($user_comment_id != $admin_comment_id) {
$this
->testForumAccessUpdateComment($user_topic_id, $user_comment_id);
}
if ($user_reply_id) {
$this
->testForumAccessUpdateComment($user_topic_id, $user_reply_id);
}
$this
->testForumAccessUpdateTopic($admin_topic_id);
$this
->testForumAccessUpdateComment($admin_topic_id, $admin_comment_id);
// delete
if ($user_comment_id != $admin_comment_id) {
$this
->testForumAccessDeleteComment($user_topic_id, $user_comment_id);
}
if ($user_topic_id != $admin_topic_id) {
$this
->testForumAccessDeleteTopic($user_topic_id);
}
$this
->testForumAccessDeleteComment($admin_topic_id, $admin_comment_id);
$this
->testForumAccessDeleteTopic($admin_topic_id);
}
}
}
}
/**
* This function calculates if a user is allowed to perform a certain action
*/
private function testForumAccessAllowed($type = '', $content_id = 0) {
/**
* The rules according to forum_access
*
* the 'access content' and 'access comments' permissions AND View to be able to see this forum and its content at all,
* the 'create forum topics' (and similar) permissions AND Post to be able to create forum content, and
* the 'post comments' and (probably) 'post comments without approval' permission AND Post to be able to post comments/replies;
*
* the 'edit own forum topics' or 'edit any forum topic' (and similar) permissions (OR Edit) can be added if desired, plus
* the 'delete own forum topics' or 'delete any forum topic' (and similar) permissions (OR Delete) if desired;
*
* the 'administer comments' (global!) permission OR Edit/Delete to be able to edit/delete comments;
* the 'administer forums' permission AND View to be able to administer forums (and change access!).
*
* content permissions: 'access content'
* comment permissions: 'access comments', 'administer comments', 'post comments', 'post comments without approval'
* forum permissions: 'create forum topics', 'delete any forum topic', 'delete own forum topics', 'edit any forum topic', 'edit own forum topics'
*/
global $user;
$current_user_is_content_owner = FALSE;
if (!$this->loggedInUser) {
if ($type == 'topic_update' || $type == 'topic_delete') {
$topic = node_load($content_id);
if ($topic && empty($topic->uid)) {
$current_user_is_content_owner = TRUE;
$this
->pass(t('Anonymous is the topic owner'), 'Debug');
}
else {
$this
->pass(t('Anonymous is NOT the topic owner'), 'Debug');
}
}
if ($type == 'comment_update' || $type == 'comment_delete') {
$comment = _comment_load($content_id);
if ($comment && empty($comment->uid)) {
$current_user_is_content_owner = TRUE;
$this
->pass(t('Anonymous is the comment owner'), 'Debug');
}
else {
$this
->pass(t('Anonymous is NOT the comment owner'), 'Debug');
}
}
$anonymous_permissions = $this->testForumAccessPermissionsAnonymous;
}
else {
if ($this->testForumAccessCurrentUsername != 'admin_user' && in_array($this->testForumAccessUsers[$this->testForumAccessCurrentUsername]->uid, $this->testForumAccessModerators)) {
$current_user_is_moderator = TRUE;
}
else {
$current_user_is_moderator = FALSE;
}
if ($type == 'topic_update' || $type == 'topic_delete') {
$topic = node_load($content_id);
if ($topic && $this->testForumAccessUidToName[$topic->uid] == $this->testForumAccessCurrentUsername) {
$current_user_is_content_owner = TRUE;
$this
->pass(t('The current user is the topic owner'), 'Debug');
}
else {
$this
->pass(t('The current user is NOT the topic owner'), 'Debug');
}
}
if ($type == 'comment_update' || $type == 'comment_delete') {
$comment = _comment_load($content_id);
if ($comment && $this->testForumAccessUidToName[$comment->uid] == $this->testForumAccessCurrentUsername) {
$current_user_is_content_owner = TRUE;
$this
->pass(t('The current user is the comment owner'), 'Debug');
}
else {
$this
->pass(t('The current user is NOT the comment owner'), 'Debug');
}
}
$user_permissions = $this->testForumAccessPermissions[$this->testForumAccessCurrentUsername];
}
switch ($type) {
case 'forum_view':
case 'topic_view':
if (!$this->loggedInUser) {
if (in_array('access content', $anonymous_permissions) && $this->testForumAccessGrants['anonymous_view']) {
return TRUE;
}
else {
return FALSE;
}
}
else {
if (in_array('access content', $user_permissions) && ($this->testForumAccessGrants['authenticated_view'] || $current_user_is_moderator)) {
return TRUE;
}
else {
return FALSE;
}
}
break;
case 'comment_view':
if (!$this->loggedInUser) {
if (in_array('access content', $anonymous_permissions) && in_array('access comments', $anonymous_permissions) && $this->testForumAccessGrants['anonymous_view']) {
return TRUE;
}
else {
return FALSE;
}
}
else {
if (in_array('access content', $user_permissions) && in_array('access comments', $user_permissions) && ($this->testForumAccessGrants['authenticated_view'] || $current_user_is_moderator)) {
return TRUE;
}
else {
return FALSE;
}
}
break;
case 'topic_create':
if (!$this->loggedInUser) {
if (in_array('create forum topics', $anonymous_permissions) && $this->testForumAccessGrants['anonymous_create']) {
return TRUE;
}
else {
return FALSE;
}
}
else {
if (in_array('create forum topics', $user_permissions) && ($this->testForumAccessGrants['authenticated_create'] || $current_user_is_moderator)) {
return TRUE;
}
else {
return FALSE;
}
}
break;
case 'comment_create':
if (!$this->loggedInUser) {
if (in_array('post comments', $anonymous_permissions) && $this->testForumAccessGrants['anonymous_create']) {
return TRUE;
}
else {
return FALSE;
}
}
else {
if (in_array('post comments', $user_permissions) && ($this->testForumAccessGrants['authenticated_create'] || $current_user_is_moderator)) {
return TRUE;
}
else {
return FALSE;
}
}
break;
case 'topic_update':
if (!$this
->testForumAccessAllowed('topic_view', $content_id)) {
return FALSE;
}
// check ownership
if (!$this->loggedInUser) {
if (in_array('edit any forum topic', $anonymous_permissions) || in_array('administer nodes', $anonymous_permissions) || $this->testForumAccessGrants['anonymous_update'] || in_array('edit own forum topics', $anonymous_permissions) && $current_user_is_content_owner) {
if (in_array('access content', $anonymous_permissions)) {
return TRUE;
}
}
return FALSE;
}
else {
if (in_array('edit any forum topic', $user_permissions) || in_array('administer nodes', $user_permissions) || $this->testForumAccessGrants['authenticated_update'] || in_array('edit own forum topics', $user_permissions) && $current_user_is_content_owner || $current_user_is_moderator) {
if (in_array('access content', $user_permissions)) {
return TRUE;
}
}
return FALSE;
}
break;
case 'comment_update':
if (!$this
->testForumAccessAllowed('comment_view', $content_id)) {
return FALSE;
}
// check ownership
if (!$this->loggedInUser) {
if (in_array('administer comments', $anonymous_permissions) || $this->testForumAccessGrants['anonymous_update']) {
if (in_array('access content', $anonymous_permissions) && in_array('access comments', $anonymous_permissions)) {
return TRUE;
}
}
return FALSE;
}
else {
if (in_array('administer comments', $user_permissions) || $this->testForumAccessGrants['authenticated_update'] || $current_user_is_moderator) {
if (in_array('access content', $user_permissions) && in_array('access comments', $user_permissions)) {
return TRUE;
}
}
elseif ($current_user_is_content_owner) {
session_save_session(FALSE);
$user_saved = $user;
$user = user_load($comment->uid);
$allow_editing_own_comment = comment_access('edit', $comment);
$user = $user_saved;
session_save_session(TRUE);
if ($allow_editing_own_comment) {
return TRUE;
}
}
return FALSE;
}
break;
case 'topic_delete':
if (!$this
->testForumAccessAllowed('topic_view', $content_id)) {
return FALSE;
}
// check ownership
if (!$this->loggedInUser) {
if (in_array('delete any forum topic', $anonymous_permissions) || in_array('administer nodes', $anonymous_permissions) || $this->testForumAccessGrants['anonymous_delete'] || in_array('delete own forum topics', $anonymous_permissions) && $current_user_is_content_owner) {
if (in_array('access content', $anonymous_permissions)) {
return TRUE;
}
}
return FALSE;
}
else {
if (in_array('delete any forum topic', $user_permissions) || in_array('administer nodes', $user_permissions) || $this->testForumAccessGrants['authenticated_delete'] || in_array('delete own forum topics', $user_permissions) && $current_user_is_content_owner || $current_user_is_moderator) {
if (in_array('access content', $user_permissions)) {
return TRUE;
}
}
return FALSE;
}
break;
case 'comment_delete':
if (!$this
->testForumAccessAllowed('comment_view', $content_id)) {
return FALSE;
}
// check ownership
if (!$this->loggedInUser) {
if (in_array('administer comments', $anonymous_permissions) || $this->testForumAccessGrants['anonymous_delete']) {
if (in_array('access content', $anonymous_permissions) && in_array('access comments', $anonymous_permissions)) {
return TRUE;
}
}
return FALSE;
}
else {
if (in_array('administer comments', $user_permissions) || $this->testForumAccessGrants['authenticated_delete'] || $current_user_is_moderator) {
if (in_array('access content', $user_permissions) && in_array('access comments', $user_permissions)) {
return TRUE;
}
}
return FALSE;
}
break;
}
return FALSE;
}
/**
* This function test if the user can view a forum
*/
private function testForumAccessViewForum() {
if (intval($this->testForumAccessCurrentForumId) > 0) {
$allowed = $this
->testForumAccessAllowed('forum_view');
// Check to see if the user/anonymous is allowed to view forum
$this
->drupalGet('forum/' . $this->testForumAccessCurrentForumId);
if ($allowed) {
if (!$this
->assertNoText("not authorized", t('@user should be allowed to view this forum: @page', array(
'@user' => $this->loggedInUser ? t('The user') : t('Anonymous'),
'@page' => $this
->getUrl(),
)))) {
$this
->testForumAccessDumpDebugInfo();
}
}
else {
if (!$this
->assertText("not authorized", t('@user should NOT be allowed to view this forum: @page', array(
'@user' => $this->loggedInUser ? t('The user') : t('Anonymous'),
'@page' => $this
->getUrl(),
)))) {
$this
->testForumAccessDumpDebugInfo();
}
}
}
}
/**
* This function creates a new forum (must be used by the admin user!)
*/
private function testForumAccessCreateForum($options = array()) {
if (is_array($options) && isset($options['anonymous_view']) && isset($options['anonymous_create']) && isset($options['anonymous_update']) && isset($options['anonymous_delete']) && isset($options['authenticated_view']) && isset($options['authenticated_create']) && isset($options['authenticated_update']) && isset($options['authenticated_delete'])) {
$forum_options = array(
'name' => 'Forum name: ' . $this
->randomName(32),
'description' => 'Forum description: ' . $this
->randomName(64),
'forum_access[view][1]' => $options['anonymous_view'],
'forum_access[create][1]' => $options['anonymous_create'],
'forum_access[update][1]' => $options['anonymous_update'],
'forum_access[delete][1]' => $options['anonymous_delete'],
'forum_access[view][2]' => $options['authenticated_view'],
'forum_access[create][2]' => $options['authenticated_create'],
'forum_access[update][2]' => $options['authenticated_update'],
'forum_access[delete][2]' => $options['authenticated_delete'],
);
$html = $this
->drupalPost('admin/content/forum/add/forum', $forum_options, t('Save'));
if ($this
->assertNoText("not authorized", t('@user should be allowed to create new forum: @page', array(
'@user' => $this->loggedInUser ? t('The user') : t('Anonymous'),
'@page' => $this
->getUrl(),
)))) {
$position = strpos($html, $forum_options['name']);
$matches = array();
if ($this
->assert(intval($position) > 0, t("Found 'edit forum' link."))) {
preg_match('/admin\\/content\\/forum\\/edit\\/forum\\/(?<forum_id>\\d+)/', $html, $matches, 0, $position);
$forum_tid = array_key_exists('forum_id', $matches) ? intval($matches['forum_id']) : 0;
if (!$this
->assert($forum_tid > 0, t("Found tid in 'edit forum' link."))) {
$this
->testForumAccessDumpDebugInfo();
}
return $forum_tid;
}
else {
$this
->testForumAccessDumpDebugInfo();
}
}
else {
$this
->testForumAccessDumpDebugInfo();
}
}
return 0;
}
/**
* This function test if the user can view a certain topic
*/
private function testForumAccessViewTopic($topic_id = 0) {
if (intval($topic_id) > 0) {
$allowed = $this
->testForumAccessAllowed('topic_view');
// Check to see if the user/anonymous is allowed to view topic
$this
->drupalGet('node/' . $topic_id);
if ($allowed) {
if (!$this
->assertNoText("not authorized", t('@user should be allowed to view this topic: @page', array(
'@user' => $this->loggedInUser ? t('The user') : t('Anonymous'),
'@page' => $this
->getUrl(),
)))) {
$this
->testForumAccessDumpDebugInfo('topic', $topic_id);
}
}
else {
if (!$this
->assertText("not authorized", t('@user should NOT be allowed to view this topic: @page', array(
'@user' => $this->loggedInUser ? t('The user') : t('Anonymous'),
'@page' => $this
->getUrl(),
)))) {
$this
->testForumAccessDumpDebugInfo('topic', $topic_id);
}
}
}
}
/**
* This function test if the user can create a topic
* Three steps: is there a create link, does the create topic page opens and can the new topic be saved
*/
private function testForumAccessCreateTopic() {
if (intval($this->testForumAccessCurrentForumId) > 0) {
$allowed = $this
->testForumAccessAllowed('topic_create');
// Check to see if the reply link is on the view page
$this
->drupalGet('forum/' . $this->testForumAccessCurrentForumId);
if ($allowed) {
if (!$this
->assertPattern("/node\\/add\\/forum\\/{$this->testForumAccessCurrentForumId}/", t('For @user there should be an post-new-topic-link on this page: @page', array(
'@user' => $this->loggedInUser ? t('this user') : t('anonymous'),
'@page' => $this
->getUrl(),
)))) {
$this
->testForumAccessDumpDebugInfo();
}
}
else {
if (!$this
->assertNoPattern("/node\\/add\\/forum\\/{$this->testForumAccessCurrentForumId}/", t('For @user there should NOT be any post-new-topic-link on this page: @page', array(
'@user' => $this->loggedInUser ? t('this user') : t('anonymous'),
'@page' => $this
->getUrl(),
)))) {
$this
->testForumAccessDumpDebugInfo();
}
}
// Check to see if the user/anonymous is allowed to open the reply page
$page_opened = FALSE;
$this
->drupalGet('node/add/forum/' . $this->testForumAccessCurrentForumId);
// Can the user select a forum from the selectbox
$selectbox_has_forum = (bool) preg_match('/<option value="">.*<\\/option><option value="\\d+"(>| selected="selected">).*<\\/option><\\/select>/', $this
->drupalGetContent(), $matches);
// Does the text "not authorized" exists on the page
$not_authorized_exists = strpos(filter_xss($this
->drupalGetContent(), array()), "not authorized") !== FALSE;
if ($allowed) {
if (!$this
->assert($selectbox_has_forum && !$not_authorized_exists, t('@user should be allowed to open the post new topic page for this forum: @page', array(
'@user' => $this->loggedInUser ? t('The user') : t('Anonymous'),
'@page' => $this
->getUrl(),
)))) {
// if (!$this->assertNoText("not authorized", t('@user should be allowed to open the post new topic page for this forum: @page', array('@user' => ($this->loggedInUser ? t('The user') : t('Anonymous')), '@page' => $this->getUrl())))) {
$this
->testForumAccessDumpDebugInfo();
}
else {
$page_opened = TRUE;
}
}
else {
if (!$this
->assert(!$selectbox_has_forum || $not_authorized_exists, t('@user should NOT be allowed to open the post new topic page for this forum: @page', array(
'@user' => $this->loggedInUser ? t('The user') : t('Anonymous'),
'@page' => $this
->getUrl(),
)))) {
// if (!$this->assertText("not authorized", t('@user should NOT be allowed to open the post new topic page for this forum: @page', array('@user' => ($this->loggedInUser ? t('The user') : t('Anonymous')), '@page' => $this->getUrl())))) {
$this
->testForumAccessDumpDebugInfo();
$page_opened = TRUE;
}
}
if ($page_opened) {
// Check to see if the user/anonymous is allowed to create a new topic
$topic_options = array(
'title' => 'Topic title: ' . $this
->randomName(32),
'body' => 'Topic body: ' . $this
->randomName(64),
);
$this
->drupalPost('node/add/forum/' . $this->testForumAccessCurrentForumId, $topic_options, t('Save'));
if ($allowed) {
if ($this
->assertNoText("not authorized", t('@user should be allowed to create a new topic on this forum: @page', array(
'@user' => $this->loggedInUser ? t('The user') : t('Anonymous'),
'@page' => $this
->getUrl(),
)))) {
$topic = node_load(array(
'title' => $topic_options['title'],
));
return $topic ? $topic->nid : 0;
}
else {
$this
->testForumAccessDumpDebugInfo();
}
}
else {
if (!$this
->assertText("not authorized", t('@user should NOT be allowed to create a new topic on this forum: @page', array(
'@user' => $this->loggedInUser ? t('The user') : t('Anonymous'),
'@page' => $this
->getUrl(),
)))) {
$this
->testForumAccessDumpDebugInfo();
$topic = node_load(array(
'title' => $topic_options['title'],
));
return $topic ? $topic->nid : 0;
}
}
}
}
return 0;
}
/**
* This function test if the user can update a topic
* Three steps: is there a edit link, does the edit page opens and can the edited topic be saved
*/
private function testForumAccessUpdateTopic($topic_id = 0) {
if (intval($topic_id) > 0) {
$allowed = $this
->testForumAccessAllowed('topic_update', $topic_id);
// Check to see if there is an edit link on the page
$this
->drupalGet('node/' . $topic_id);
if ($allowed) {
if (!$this
->assertPattern("/node\\/{$topic_id}\\/edit/", t('For @user there should be an edit-this-topic-link on the page: @page', array(
'@user' => $this->loggedInUser ? t('this user') : t('anonymous'),
'@page' => $this
->getUrl(),
)))) {
$this
->testForumAccessDumpDebugInfo('topic', $topic_id);
}
}
else {
if (!$this
->assertNoPattern("/node\\/{$topic_id}\\/edit/", t('For @user there should NOT be an edit-this-topic-link on the page: @page', array(
'@user' => $this->loggedInUser ? t('this user') : t('anonymous'),
'@page' => $this
->getUrl(),
)))) {
$this
->testForumAccessDumpDebugInfo('topic', $topic_id);
}
}
// Check to see if the user/anonymous is allowed to open the reply page
$page_opened = FALSE;
$this
->drupalGet('node/' . $topic_id . '/edit/');
if ($allowed) {
if (!$this
->assertNoText("not authorized", t('@user should be allowed to open the edit page for this topic: @page', array(
'@user' => $this->loggedInUser ? t('The user') : t('Anonymous'),
'@page' => $this
->getUrl(),
)))) {
$this
->testForumAccessDumpDebugInfo('topic', $topic_id);
}
else {
$page_opened = TRUE;
}
}
else {
if (!$this
->assertText("not authorized", t('@user should NOT be allowed to open the edit page for this topic: @page', array(
'@user' => $this->loggedInUser ? t('The user') : t('Anonymous'),
'@page' => $this
->getUrl(),
)))) {
$this
->testForumAccessDumpDebugInfo('topic', $topic_id);
$page_opened = TRUE;
}
}
if ($page_opened) {
// Check to see if the user/anonymous is allowed to edit the topic
$topic_options = array(
'title' => 'Topic title: ' . $this
->randomName(32),
'body' => 'Topic body: ' . $this
->randomName(64),
);
$this
->drupalPost('node/' . $topic_id . '/edit', $topic_options, t('Save'));
if ($allowed) {
if (!$this
->assertNoText("not authorized", t('@user should be allowed to edit this topic: @page', array(
'@user' => $this->loggedInUser ? t('The user') : t('Anonymous'),
'@page' => $this
->getUrl(),
)))) {
$this
->testForumAccessDumpDebugInfo('topic', $topic_id);
}
}
else {
if (!$this
->assertText("not authorized", t('@user should NOT be allowed to edit this topic: @page', array(
'@user' => $this->loggedInUser ? t('The user') : t('Anonymous'),
'@page' => $this
->getUrl(),
)))) {
$this
->testForumAccessDumpDebugInfo('topic', $topic_id);
}
}
}
}
}
/**
* This function test if the user can delete a topic
* Four steps: is there a edit link, does the edit page opens, is there a delete link on the edit page and can the topic be deleted
*/
private function testForumAccessDeleteTopic($topic_id = 0) {
if (intval($topic_id) > 0) {
$allowed_edit = $this
->testForumAccessAllowed('topic_update', $topic_id);
$allowed_delete = $this
->testForumAccessAllowed('topic_delete', $topic_id);
// Check to see if there is an edit link on the page
$this
->drupalGet('node/' . $topic_id);
if ($allowed_edit) {
if (!$this
->assertPattern("/node\\/{$topic_id}\\/edit/", t('For @user there should be an edit-this-topic-link on the page: @page', array(
'@user' => $this->loggedInUser ? t('this user') : t('anonymous'),
'@page' => $this
->getUrl(),
)))) {
$this
->testForumAccessDumpDebugInfo('topic', $topic_id);
}
}
else {
if (!$this
->assertNoPattern("/node\\/{$topic_id}\\/edit/", t('For @user there should NOT be an edit-this-topic-link on the page: @page', array(
'@user' => $this->loggedInUser ? t('this user') : t('anonymous'),
'@page' => $this
->getUrl(),
)))) {
$this
->testForumAccessDumpDebugInfo('topic', $topic_id);
}
}
// Check to see if the user/anonymous is allowed to open the edit page
$page_opened = FALSE;
$this
->drupalGet('node/' . $topic_id . '/edit/');
if ($allowed_edit) {
if (!$this
->assertNoText("not authorized", t('@user should be allowed to open the edit page on this topic: @page', array(
'@user' => $this->loggedInUser ? t('The user') : t('Anonymous'),
'@page' => $this
->getUrl(),
)))) {
$this
->testForumAccessDumpDebugInfo('topic', $topic_id);
}
else {
$page_opened = TRUE;
}
}
else {
if (!$this
->assertText("not authorized", t('@user should NOT be allowed to open the edit page on this topic: @page', array(
'@user' => $this->loggedInUser ? t('The user') : t('Anonymous'),
'@page' => $this
->getUrl(),
)))) {
$this
->testForumAccessDumpDebugInfo('topic', $topic_id);
$page_opened = TRUE;
}
}
$page_has_delete_button = $test_direct_link = FALSE;
if ($page_opened) {
// Check to see if there is an delete link on the edit page
$this
->drupalGet('node/' . $topic_id . '/edit');
if ($allowed_delete) {
if (!$this
->assertFieldById('edit-delete', 'Delete', t('For @user there should be a delete-link on the edit page for this topic: @page', array(
'@user' => $this->loggedInUser ? t('this user') : t('anonymous'),
'@page' => $this
->getUrl(),
)))) {
$this
->testForumAccessDumpDebugInfo('topic', $topic_id);
}
else {
$page_has_delete_button = TRUE;
}
}
else {
if (!$this
->assertNoFieldById('edit-delete', 'Delete', t('For @user there should NOT be a delete-link on the edit page for this topic: @page', array(
'@user' => $this->loggedInUser ? t('this user') : t('anonymous'),
'@page' => $this
->getUrl(),
)))) {
$this
->testForumAccessDumpDebugInfo('topic', $topic_id);
$page_has_delete_button = TRUE;
}
}
if ($page_has_delete_button) {
// Check to see if the user/anonymous is allowed to delete the topic
$this
->drupalPost('node/' . $topic_id . '/edit', array(), t('Delete'));
}
}
else {
$this
->drupalGet('node/' . $topic_id . '/delete');
$test_direct_link = TRUE;
}
if ($page_has_delete_button || $test_direct_link) {
if ($allowed_delete) {
if (!$this
->assertNoText("not authorized", t('@user should be allowed to delete this topic: @page', array(
'@user' => $this->loggedInUser ? t('The user') : t('Anonymous'),
'@page' => $this
->getUrl(),
)))) {
$this
->testForumAccessDumpDebugInfo('topic', $topic_id);
}
}
else {
if (!$this
->assertText("not authorized", t('@user should NOT be allowed to delete this topic: @page', array(
'@user' => $this->loggedInUser ? t('The user') : t('Anonymous'),
'@page' => $this
->getUrl(),
)))) {
$this
->testForumAccessDumpDebugInfo('topic', $topic_id);
}
}
}
}
}
/**
* This function test if the user can view a certain comment
*/
private function testForumAccessViewComment($topic_id = 0, $comment_id = 0) {
if (intval($topic_id) > 0 && intval($comment_id) > 0) {
$allowed = $this
->testForumAccessAllowed('comment_view');
// Check to see if the user/anonymous is allowed to view comment
$this
->drupalGet('node/' . $topic_id, array(
'fragment' => 'comment-' . $comment_id,
));
if ($allowed) {
if (!$this
->assertText("Comment comment", t('@user should be allowed to view this comment: @page', array(
'@user' => $this->loggedInUser ? t('The user') : t('Anonymous'),
'@page' => $this
->getUrl(),
)))) {
$this
->testForumAccessDumpDebugInfo('comment', $comment_id);
}
}
else {
if (!$this
->assertNoText("Comment comment", t('@user should NOT be allowed to view this comment: @page', array(
'@user' => $this->loggedInUser ? t('The user') : t('Anonymous'),
'@page' => $this
->getUrl(),
)))) {
$this
->testForumAccessDumpDebugInfo('comment', $comment_id);
}
}
}
}
/**
* This function test if the user can create a comment
* Three steps: is there a create link, does the create comment page opens and can the new comment be saved
*/
private function testForumAccessCreateComment($topic_id = 0) {
if (intval($topic_id) > 0) {
$allowed = $this
->testForumAccessAllowed('comment_create');
// Check to see if the reply link is on the view page
$this
->drupalGet('node/' . $topic_id);
if ($allowed) {
if (!$this
->assertPattern("/comment\\/reply\\/{$topic_id}/", t('For @user there should be a reply link on this page for a new comment: @page', array(
'@user' => $this->loggedInUser ? t('this user') : t('anonymous'),
'@page' => $this
->getUrl(),
)))) {
$this
->testForumAccessDumpDebugInfo('topic', $topic_id);
}
}
else {
if (!$this
->assertNoPattern("/comment\\/reply\\/{$topic_id}/", t('For @user there should NOT be any reply link on this page for a new comment: @page', array(
'@user' => $this->loggedInUser ? t('this user') : t('anonymous'),
'@page' => $this
->getUrl(),
)))) {
$this
->testForumAccessDumpDebugInfo('topic', $topic_id);
}
}
// Check to see if the user/anonymous is allowed to open the reply page
$page_opened = FALSE;
$this
->drupalGet('comment/reply/' . $topic_id);
if ($allowed) {
if (!$this
->assertNoText("not authorized", t('@user should be allowed to open the reply page for this topic: @page', array(
'@user' => $this->loggedInUser ? t('The user') : t('Anonymous'),
'@page' => $this
->getUrl(),
)))) {
$this
->testForumAccessDumpDebugInfo('topic', $topic_id);
}
else {
$page_opened = TRUE;
}
}
else {
if (!$this
->assertText("not authorized", t('@user should NOT be allowed to open the reply page for this topic: @page', array(
'@user' => $this->loggedInUser ? t('The user') : t('Anonymous'),
'@page' => $this
->getUrl(),
)))) {
$this
->testForumAccessDumpDebugInfo('topic', $topic_id);
$page_opened = TRUE;
}
}
if ($page_opened) {
// Check to see if the user/anonymous is allowed to create a new comment
$comment_options = array(
'subject' => 'Comment subject: ' . $this
->randomName(32),
'comment' => 'Comment comment: ' . $this
->randomName(64),
);
$this
->drupalPost('comment/reply/' . $topic_id, $comment_options, t('Preview'));
$html = $this
->drupalPost(NULL, $comment_options, t('Save'));
if ($allowed) {
if ($this
->assertNoText("not authorized", t('@user should be allowed to reply on this topic: @page', array(
'@user' => $this->loggedInUser ? t('The user') : t('Anonymous'),
'@page' => $this
->getUrl(),
)))) {
preg_match('/node\\/(?<topic_id>\\d+)#comment-(?<comment_id>\\d+)/', $this->url, $matches);
return array_key_exists('comment_id', $matches) ? intval($matches['comment_id']) : 0;
}
else {
$this
->testForumAccessDumpDebugInfo('topic', $topic_id);
}
}
else {
if (!$this
->assertText("not authorized", t('@user should NOT be allowed to reply on this topic: @page', array(
'@user' => $this->loggedInUser ? t('The user') : t('Anonymous'),
'@page' => $this
->getUrl(),
)))) {
$this
->testForumAccessDumpDebugInfo('topic', $topic_id);
preg_match('/node\\/(?<topic_id>\\d+)#comment-(?<comment_id>\\d+)/', $this->url, $matches);
return array_key_exists('comment_id', $matches) ? intval($matches['comment_id']) : 0;
}
}
}
}
return 0;
}
/**
* This function test if the user can create a reply on a comment
* Three steps: is there a create link, does the create reply page opens and can the new reply on a comment be saved
*/
private function testForumAccessCreateReply($topic_id = 0, $comment_id = 0) {
if (intval($topic_id) > 0 && intval($comment_id) > 0) {
$allowed = $this
->testForumAccessAllowed('comment_create');
// Check to see if the reply link is on the view page
$this
->drupalGet('node/' . $topic_id, array(
'fragment' => 'comment-' . $comment_id,
));
if ($allowed) {
if (!$this
->assertPattern("/comment\\/reply\\/{$topic_id}\\/{$comment_id}/", t('For @user there should be a reply link on this comment on the page: @page', array(
'@user' => $this->loggedInUser ? t('this user') : t('anonymous'),
'@page' => $this
->getUrl(),
)))) {
$this
->testForumAccessDumpDebugInfo('comment', $comment_id);
}
}
else {
if (!$this
->assertNoPattern("/comment\\/reply\\/{$topic_id}\\/{$comment_id}/", t('For @user there should NOT be any reply link on this comment on the page: @page', array(
'@user' => $this->loggedInUser ? t('this user') : t('anonymous'),
'@page' => $this
->getUrl(),
)))) {
$this
->testForumAccessDumpDebugInfo('comment', $comment_id);
}
}
// Check to see if the user/anonymous is allowed to open the reply page
$page_opened = FALSE;
$this
->drupalGet('comment/reply/' . $topic_id . '/' . $comment_id);
if ($allowed) {
if (!$this
->assertNoTextArray(array(
"not authorized",
"not exist",
), t('@user should be allowed to open the reply page for this comment: @page', array(
'@user' => $this->loggedInUser ? t('The user') : t('Anonymous'),
'@page' => $this
->getUrl(),
)))) {
$this
->testForumAccessDumpDebugInfo('comment', $comment_id);
}
else {
$page_opened = TRUE;
}
}
else {
if (!$this
->assertTextArray(array(
"not authorized",
"not exist",
), t('@user should NOT be allowed to open the reply page for this comment: @page', array(
'@user' => $this->loggedInUser ? t('The user') : t('Anonymous'),
'@page' => $this
->getUrl(),
)))) {
$this
->testForumAccessDumpDebugInfo('comment', $comment_id);
$page_opened = TRUE;
}
}
if ($page_opened) {
// Check to see if the user/anonymous is allowed to reply the comment
$comment_options = array(
'subject' => 'Comment subject: ' . $this
->randomName(32),
'comment' => 'Comment comment: ' . $this
->randomName(64),
);
$this
->drupalPost('comment/reply/' . $topic_id . '/' . $comment_id, $comment_options, t('Preview'));
$this
->drupalPost(NULL, $comment_options, t('Save'));
if ($allowed) {
if ($this
->assertNoText("not authorized", t('@user should be allowed to reply on this comment: @page', array(
'@user' => $this->loggedInUser ? t('The user') : t('Anonymous'),
'@page' => $this
->getUrl(),
)))) {
//preg_match_all('/node\/(?<topic_id>\d+)#comment-(?<comment_id>\d+)/', $this->url, $matches);
//return (array_key_exists('comment_id', $matches) ? intval($matches['comment_id']) : 0);
return TRUE;
}
else {
$this
->testForumAccessDumpDebugInfo('comment', $comment_id);
}
}
else {
if (!$this
->assertText("not authorized", t('@user should NOT be allowed to reply on this comment: @page', array(
'@user' => $this->loggedInUser ? t('The user') : t('Anonymous'),
'@page' => $this
->getUrl(),
)))) {
$this
->testForumAccessDumpDebugInfo('comment', $comment_id);
//preg_match_all('/node\/(?<topic_id>\d+)#comment-(?<comment_id>\d+)/', $this->url, $matches);
//return (array_key_exists('comment_id', $matches) ? intval($matches['comment_id']) : 0);
}
}
}
}
return FALSE;
}
/**
* This function test if the user can update a comment
* Three steps: is there a edit link, does the edit page opens and can the edited comment be saved
*/
private function testForumAccessUpdateComment($topic_id = 0, $comment_id = 0) {
if (intval($topic_id) > 0 && intval($comment_id) > 0) {
$allowed = $this
->testForumAccessAllowed('comment_update', $comment_id);
// Check to see if the edit link is on the view page
$this
->drupalGet('node/' . $topic_id, array(
'fragment' => 'comment-' . $comment_id,
));
if ($allowed) {
if (!$this
->assertPattern("/comment\\/edit\\/{$comment_id}/", t('For @user there should be an edit this comment-link on the page: @page', array(
'@user' => $this->loggedInUser ? t('this user') : t('anonymous'),
'@page' => $this
->getUrl(),
)))) {
$this
->testForumAccessDumpDebugInfo('comment', $comment_id);
}
}
else {
if (!$this
->assertNoPattern("/comment\\/edit\\/{$comment_id}/", t('For @user there should NOT be an edit this comment-link on the page: @page', array(
'@user' => $this->loggedInUser ? t('this user') : t('anonymous'),
'@page' => $this
->getUrl(),
)))) {
$this
->testForumAccessDumpDebugInfo('comment', $comment_id);
}
}
// Check to see if the user/anonymous is allowed to open the reply page
$page_opened = FALSE;
$this
->drupalGet('comment/edit/' . $comment_id);
if ($allowed) {
if (!$this
->assertNoText("not authorized", t('@user should be allowed to open the edit page for this comment: @page', array(
'@user' => $this->loggedInUser ? t('The user') : t('Anonymous'),
'@page' => $this
->getUrl(),
)))) {
$this
->testForumAccessDumpDebugInfo('comment', $comment_id);
}
else {
$page_opened = TRUE;
}
}
else {
if (!$this
->assertText("not authorized", t('@user should NOT be allowed to open the edit page for this comment: @page', array(
'@user' => $this->loggedInUser ? t('The user') : t('Anonymous'),
'@page' => $this
->getUrl(),
)))) {
$this
->testForumAccessDumpDebugInfo('comment', $comment_id);
$page_opened = TRUE;
}
}
if ($page_opened) {
// Check to see if the user/anonymous is allowed to edit the comment
$comment_options = array(
'subject' => 'Comment subject: ' . $this
->randomName(32),
'comment' => 'Comment comment: ' . $this
->randomName(64),
);
$this
->drupalPost('comment/edit/' . $comment_id, $comment_options, t('Preview'));
$this
->drupalPost(NULL, $comment_options, t('Save'));
if ($allowed) {
if (!$this
->assertNoText("not authorized", t('@user should be allowed to edit this comment: @page', array(
'@user' => $this->loggedInUser ? t('The user') : t('Anonymous'),
'@page' => $this
->getUrl(),
)))) {
$this
->testForumAccessDumpDebugInfo('comment', $comment_id);
}
}
else {
if (!$this
->assertText("not authorized", t('@user should NOT be allowed to edit this comment: @page', array(
'@user' => $this->loggedInUser ? t('The user') : t('Anonymous'),
'@page' => $this
->getUrl(),
)))) {
$this
->testForumAccessDumpDebugInfo('comment', $comment_id);
}
}
}
}
}
/**
* This function test if the user can delete a comment
* Three steps: is there a delete link, does the delete page opens and can the comment be deleted
*/
private function testForumAccessDeleteComment($topic_id = 0, $comment_id = 0) {
if (intval($topic_id) > 0 && intval($comment_id) > 0) {
$allowed = $this
->testForumAccessAllowed('comment_delete', $comment_id);
// Check to see if the delete link is on the view page
$this
->drupalGet('node/' . $topic_id, array(
'fragment' => 'comment-' . $comment_id,
));
if ($allowed) {
if (!$this
->assertPattern("/comment\\/delete\\/{$comment_id}/", t('For @user there should be a delete-this-comment-link on the page: @page', array(
'@user' => $this->loggedInUser ? t('this user') : t('anonymous'),
'@page' => $this
->getUrl(),
)))) {
$this
->testForumAccessDumpDebugInfo('comment', $comment_id);
}
}
else {
if (!$this
->assertNoPattern("/comment\\/delete\\/{$comment_id}/", t('For @user there should NOT be a delete-this-comment-link on the page: @page', array(
'@user' => $this->loggedInUser ? t('this user') : t('anonymous'),
'@page' => $this
->getUrl(),
)))) {
$this
->testForumAccessDumpDebugInfo('comment', $comment_id);
}
}
// Check to see if the user/anonymous is allowed to open the delete page
$page_opened = FALSE;
$this
->drupalGet('comment/delete/' . $comment_id);
if ($allowed) {
if (!$this
->assertNoText("not authorized", t('@user should be allowed to open the delete page for this comment: @page', array(
'@user' => $this->loggedInUser ? t('The user') : t('Anonymous'),
'@page' => $this
->getUrl(),
)))) {
$this
->testForumAccessDumpDebugInfo('comment', $comment_id);
}
else {
$page_opened = TRUE;
}
}
else {
if (!$this
->assertText("not authorized", t('@user should NOT be allowed to open the delete page for this comment: @page', array(
'@user' => $this->loggedInUser ? t('The user') : t('Anonymous'),
'@page' => $this
->getUrl(),
)))) {
$this
->testForumAccessDumpDebugInfo('comment', $comment_id);
$page_opened = TRUE;
}
}
if ($page_opened) {
// Check to see if the user/anonymous is allowed to edit the comment
$this
->drupalPost('comment/delete/' . $comment_id, array(), t('Delete'));
if ($allowed) {
if (!$this
->assertNoText("not authorized", t('@user should be allowed to delete this comment: @page', array(
'@user' => $this->loggedInUser ? t('The user') : t('Anonymous'),
'@page' => $this
->getUrl(),
)))) {
$this
->testForumAccessDumpDebugInfo('comment', $comment_id);
}
}
else {
if (!$this
->assertText("not authorized", t('@user should NOT be allowed to delete this comment: @page', array(
'@user' => $this->loggedInUser ? t('The user') : t('Anonymous'),
'@page' => $this
->getUrl(),
)))) {
$this
->testForumAccessDumpDebugInfo('comment', $comment_id);
}
}
}
}
}
/**
* Wrapper function for drupalCreateUser
*/
private function testForumAccessCreateUser($name = '', $permissions = array()) {
if (empty($name)) {
$name = 'User name: ' . $this
->randomName(16);
}
$delete_permissions = FALSE;
if (count($permissions) == 0) {
$delete_permissions = TRUE;
$permissions = array(
'access comments',
'access content',
'post comments',
'post comments without approval',
);
// default permissions
}
if ($this->testForumAccessUseDNA) {
$permissions[] = 'view devel_node_access information';
}
if ($name == 'admin_user') {
$this->testForumAccessAdminUser = $this
->drupalCreateUser($permissions);
}
else {
$this->testForumAccessUsers[$name] = $this
->drupalCreateUser($permissions);
}
if ($delete_permissions) {
$permissions = array();
if ($name == 'admin_user') {
$this
->testForumAccessDeletePermissionsUser($this->testForumAccessAdminUser->uid);
}
else {
$this
->testForumAccessDeletePermissionsUser($this->testForumAccessUsers[$name]->uid);
}
$this
->pass('The permissions are deleted for user: ' . $name, 'Debug');
}
$this->testForumAccessPermissions[$name] = $permissions;
if ($name == 'admin_user') {
$this->testForumAccessUidToName[$this->testForumAccessAdminUser->uid] = $name;
}
else {
$this->testForumAccessUidToName[$this->testForumAccessUsers[$name]->uid] = $name;
}
}
/**
* Wrapper function for drupalLogin
*/
private function testForumAccessLogin($name = '') {
if (array_key_exists($name, $this->testForumAccessUsers)) {
$this
->drupalLogin($this->testForumAccessUsers[$name]);
$this->testForumAccessCurrentUsername = $name;
}
elseif ($name == 'admin_user') {
$this
->drupalLogin($this->testForumAccessAdminUser);
$this->testForumAccessCurrentUsername = 'admin_user';
}
else {
$this
->drupalLogout();
$this->testForumAccessCurrentUsername = '';
}
}
/**
* Wrapper function for drupalLogout
*/
private function testForumAccessLogout() {
$this
->drupalLogout();
$this->testForumAccessCurrentUsername = '';
}
/**
* This function adds a user as a moderator to a forum (must be used by the admin user!)
*/
private function testForumAccessAddModerator($uid = 0) {
if ($this->testForumAccessCurrentUsername == 'admin_user' && intval($this->testForumAccessCurrentForumId) > 0 && intval($uid) > 0) {
if ($uid > 0) {
$forum_options = array(
'forum_access[acl][add]' => $this->testForumAccessUsers[$this->testForumAccessUidToName[$uid]]->name,
);
$this
->drupalPost('admin/content/forum/edit/forum/' . $this->testForumAccessCurrentForumId, $forum_options, t('Add User'));
$this
->drupalPost(NULL, $forum_options, t('Save'));
if (!$this
->assertNoText("not authorized", t('@user should be allowed to add moderators to a forum: @page', array(
'@user' => $this->loggedInUser ? t('The user') : t('Anonymous'),
'@page' => $this
->getUrl(),
)))) {
$this
->testForumAccessDumpDebugInfo();
}
else {
array_push($this->testForumAccessModerators, $uid);
}
}
}
}
/**
* This function adds a user as a moderator to a forum (must be used by the admin user!)
*/
private function testForumAccessGetModeratorStatus($uid = 0) {
if (intval($this->testForumAccessCurrentForumId) > 0 && intval($uid) > 0) {
$result = db_fetch_object(db_query("SELECT uid FROM {acl_user} WHERE uid = %d AND acl_id = (SELECT acl_id FROM {acl} WHERE module = 'forum_access' AND (name = '%s' OR number = %d))", $uid, $this->testForumAccessCurrentForumId, $this->testForumAccessCurrentForumId));
if (isset($result->uid) && intval($result->uid) > 0 && $uid == $result->uid) {
return TRUE;
}
else {
return FALSE;
}
}
}
/**
* This function is called when the program detects an error. It gives extra information so that the error can be fixed. hopefully :)
*/
private function testForumAccessDumpDebugInfo($content_type = '', $content_id = 0) {
if ($content_type == 'comment' && intval($content_id) > 0) {
$comment = _comment_load($content_id);
if ($comment && $comment->cid > 0) {
$this
->pass('The comment owner is: ' . ($comment->uid > 0 ? $this->testForumAccessUidToName[$comment->uid] : t('Anonymous')), 'Debug');
$topic = node_load($comment->nid);
if ($topic && $topic->nid > 0) {
$this
->pass('The topic owner is: ' . ($topic->uid > 0 ? $this->testForumAccessUidToName[$topic->uid] : t('Anonymous')), 'Debug');
}
}
}
if ($content_type == 'topic' && intval($content_id) > 0) {
$topic = node_load($content_id);
if ($topic && $topic->nid > 0) {
$this
->pass('The topic owner is: ' . ($topic->uid > 0 ? $this->testForumAccessUidToName[$topic->uid] : t('Anonymous')), 'Debug');
}
}
$this
->pass('The current user is: ' . (empty($this->testForumAccessCurrentUsername) ? 'anonymous' : $this->testForumAccessCurrentUsername), 'Debug');
if ($this->loggedInUser) {
// Check the moderator status.
$moderator_status_set = $this->testForumAccessCurrentUsername != 'admin_user' && in_array($this->testForumAccessUsers[$this->testForumAccessCurrentUsername]->uid, $this->testForumAccessModerators) ? TRUE : FALSE;
$moderator_status_database = $this->testForumAccessCurrentUsername != 'admin_user' && $this
->testForumAccessGetModeratorStatus($this->testForumAccessUsers[$this->testForumAccessCurrentUsername]->uid) ? TRUE : FALSE;
if ($moderator_status_set == $moderator_status_database) {
$this
->pass('The moderator status is: ' . ($moderator_status_set ? 'TRUE' : 'FALSE'), 'Debug');
}
else {
$this
->pass('Set moderator status is: ' . ($moderator_status_set ? 'TRUE' : 'FALSE'), 'Debug');
$this
->pass('Database moderator status is: ' . ($moderator_status_database ? 'TRUE' : 'FALSE'), 'Debug');
}
// Check the permissions of the logged-in user.
$permissions_set = count($this->testForumAccessPermissions[$this->testForumAccessCurrentUsername]) > 0 ? $this->testForumAccessPermissions[$this->testForumAccessCurrentUsername] : array(
t('none'),
);
if ($this->testForumAccessCurrentUsername == 'admin_user') {
$permissions_database = $this
->testForumAccessGetPermissionsUser($this->testForumAccessAdminUser->uid, TRUE);
}
else {
$permissions_database = $this
->testForumAccessGetPermissionsUser($this->testForumAccessUsers[$this->testForumAccessCurrentUsername]->uid, TRUE);
}
$permissions_error = FALSE;
foreach ($permissions_set as $perm) {
if (!in_array($perm, $permissions_database)) {
$permissions_error = TRUE;
}
}
foreach ($permissions_database as $perm) {
if (!in_array($perm, $permissions_set)) {
$permissions_error = TRUE;
}
}
if (!$permissions_error) {
$this
->pass('The permissions are: ' . implode(', ', $permissions_set), 'Debug');
}
else {
$this
->pass('Set permissions are: ' . implode(', ', $permissions_set), 'Debug');
if ($this->testForumAccessCurrentUsername == 'admin_user') {
$this
->pass('Database permissions are: ' . implode(', ', $this
->testForumAccessGetPermissionsUser($this->testForumAccessAdminUser->uid, TRUE)), 'Debug');
}
else {
$this
->pass('Database permissions are: ' . implode(', ', $this
->testForumAccessGetPermissionsUser($this->testForumAccessUsers[$this->testForumAccessCurrentUsername]->uid, TRUE)), 'Debug');
}
}
}
else {
// Check the permissions for anonymous.
$permissions_set = count($this->testForumAccessPermissionsAnonymous) > 0 ? $this->testForumAccessPermissionsAnonymous : array(
t('none'),
);
$permissions_database = $this
->testForumAccessGetPermissionsAnonymousUser(TRUE);
$permissions_error = FALSE;
foreach ($permissions_set as $perm) {
if (!in_array($perm, $permissions_database)) {
$permissions_error = TRUE;
}
}
foreach ($permissions_database as $perm) {
if (!in_array($perm, $permissions_set)) {
$permissions_error = TRUE;
}
}
if (!$permissions_error) {
$this
->pass('The permissions are: ' . implode(', ', $permissions_set), 'Debug');
}
else {
$this
->pass('Set permissions are: ' . implode(', ', $permissions_set), 'Debug');
$this
->pass('Database permissions are: ' . implode(', ', $permissions_database), 'Debug');
}
}
// Check the forum grants.
$forum_grants_set = array_keys(array_filter($this->testForumAccessGrants, create_function('$grant', 'return $grant;')));
$forum_grants_database = array_keys(array_filter($this
->testForumAccessGetForumGrants(), create_function('$grant', 'return $grant;')));
$forum_grants_error = FALSE;
foreach ($forum_grants_set as $grant) {
if (!in_array($grant, $forum_grants_database)) {
$forum_grants_error = TRUE;
}
}
foreach ($forum_grants_database as $grant) {
if (!in_array($grant, $forum_grants_set)) {
$forum_grants_error = TRUE;
}
}
if (!$forum_grants_error) {
$this
->pass('The forum grants are: ' . implode(', ', $forum_grants_set), 'Debug');
}
else {
$this
->pass('Set forum grants are: ' . implode(', ', $forum_grants_set), 'Debug');
$this
->pass('Database forum grants are: ' . implode(', ', $forum_grants_database), 'Debug');
}
$this
->verbose('URL: ' . $this
->getUrl() . '<hr />' . $this
->drupalGetContent(), 'Debug');
}
/**
* This function sets the permissions for the anonymous userrole in the database
*/
private function testForumAccessSetPermissionsAnonymousRole($permissions = array()) {
if ($this
->checkPermissions($permissions)) {
$this->testForumAccessPermissionsAnonymous = $permissions;
db_query("UPDATE {permission} SET perm = '%s' WHERE rid = %d", implode(', ', $permissions), DRUPAL_ANONYMOUS_RID);
}
}
/**
* This function gets the permissions for the authenticated userrole from the database
*/
private function testForumAccessSetPermissionsAuthenticatedRole($permissions = array()) {
if ($this
->checkPermissions($permissions)) {
db_query("UPDATE {permission} SET perm = '%s' WHERE rid = %d", implode(', ', $permissions), DRUPAL_AUTHENTICATED_RID);
}
}
/**
* This function deletes the user permissions for a specific from the database
*/
private function testForumAccessDeletePermissionsUser($uid = 0) {
if ($uid > 0) {
db_query("UPDATE {permission} SET perm = '' WHERE rid IN (SELECT rid FROM {users_roles} WHERE uid = %d)", $uid);
}
}
/**
* This function gets the permissions for the anonymous userrole from the database
*/
private function testForumAccessGetPermissionsAnonymousUser($if_empty_return_none = FALSE) {
$result = db_fetch_object(db_query("SELECT perm FROM {permission} WHERE rid = %d", DRUPAL_ANONYMOUS_RID));
if (!empty($result->perm)) {
return explode(', ', $result->perm);
}
elseif ($if_empty_return_none) {
return array(
t('none'),
);
}
return array();
}
/**
* This function gets the user permissions for a specific from the database
*/
private function testForumAccessGetPermissionsUser($uid = 0, $if_empty_return_none = FALSE) {
if ($uid > 0) {
$result_authenticated = db_fetch_object(db_query("SELECT perm FROM {permission} WHERE rid = %d", DRUPAL_AUTHENTICATED_RID));
$result_user = db_fetch_object(db_query("SELECT p.perm as perm FROM {users_roles} u JOIN {permission} p ON u.rid = p.rid where u.uid = %d", $uid));
if (!empty($result_authenticated->perm) && !empty($result_user->perm)) {
return array_merge(explode(', ', $result_authenticated->perm), explode(', ', $result_user->perm));
}
elseif (!empty($result_authenticated->perm)) {
return explode(', ', $result_authenticated->perm);
}
elseif (!empty($result_user->perm)) {
return explode(', ', $result_user->perm);
}
elseif ($if_empty_return_none) {
return array(
t('none'),
);
}
}
return array();
}
/**
* This function gets the forum grants from the database
*/
private function testForumAccessGetForumGrants() {
$grants = array();
$grants_anonymous = db_fetch_object(db_query("SELECT * FROM {forum_access} WHERE rid = %d", DRUPAL_ANONYMOUS_RID));
$grants['anonymous_view'] = $grants_anonymous->grant_view ? TRUE : FALSE;
$grants['anonymous_create'] = $grants_anonymous->grant_create ? TRUE : FALSE;
$grants['anonymous_update'] = $grants_anonymous->grant_update ? TRUE : FALSE;
$grants['anonymous_delete'] = $grants_anonymous->grant_delete ? TRUE : FALSE;
$grants_authenticated = db_fetch_object(db_query("SELECT * FROM {forum_access} WHERE rid = %d", DRUPAL_AUTHENTICATED_RID));
$grants['authenticated_view'] = $grants_authenticated->grant_view ? TRUE : FALSE;
$grants['authenticated_create'] = $grants_authenticated->grant_create ? TRUE : FALSE;
$grants['authenticated_update'] = $grants_authenticated->grant_update ? TRUE : FALSE;
$grants['authenticated_delete'] = $grants_authenticated->grant_delete ? TRUE : FALSE;
return $grants;
}
/**
* This function gets the forum grants from the input string
*/
protected function testForumAccessGetGrants($grants_string = '') {
$grants = array();
$grants['anonymous_view'] = stristr($grants_string, 'anonymous_view') === FALSE ? FALSE : TRUE;
$grants['anonymous_create'] = stristr($grants_string, 'anonymous_create') === FALSE ? FALSE : TRUE;
$grants['anonymous_update'] = stristr($grants_string, 'anonymous_update') === FALSE ? FALSE : TRUE;
$grants['anonymous_delete'] = stristr($grants_string, 'anonymous_delete') === FALSE ? FALSE : TRUE;
$grants['authenticated_view'] = stristr($grants_string, 'authenticated_view') === FALSE ? FALSE : TRUE;
$grants['authenticated_create'] = stristr($grants_string, 'authenticated_create') === FALSE ? FALSE : TRUE;
$grants['authenticated_update'] = stristr($grants_string, 'authenticated_update') === FALSE ? FALSE : TRUE;
$grants['authenticated_delete'] = stristr($grants_string, 'authenticated_delete') === FALSE ? FALSE : TRUE;
return $grants;
}
/**
* The array version of the function assertText
*/
private function assertTextArray($text, $message = '', $group = 'Other') {
return $this
->assertTextArrayHelper($text, $message, $group, FALSE);
}
/**
* The array version of the function assertNoText
*/
private function assertNoTextArray($text, $message = '', $group = 'Other') {
return $this
->assertTextArrayHelper($text, $message, $group, TRUE);
}
/**
* The array version of the function assertTextHelper
*/
private function assertTextArrayHelper($text, $message, $group, $not_exists) {
if ($this->plainTextContent === FALSE) {
$this->plainTextContent = filter_xss($this->content, array());
}
if (!$message) {
$message = !$not_exists ? t('"@text" found', array(
'@text' => $text,
)) : t('"@text" not found', array(
'@text' => $text,
));
}
return $this
->assert($not_exists == ($this
->strpos_array($this->plainTextContent, $text) === FALSE), $message, $group);
}
/**
* The array version of the function strpos
*/
private function strpos_array($haystack, $needles) {
foreach ($needles as $needle) {
$pos = strpos($haystack, $needle);
if ($pos !== FALSE) {
return $pos;
}
}
return FALSE;
}
}
class ForumAccessTestCase1 extends ForumAccessTestCase {
/**
* Implements getInfo().
*
* Change the grants to your wishes
*/
public function getInfo() {
$grants = array(
'anonymous_view' => TRUE,
'anonymous_create' => TRUE,
'anonymous_update' => TRUE,
'anonymous_delete' => TRUE,
'authenticated_view' => TRUE,
'authenticated_create' => TRUE,
'authenticated_update' => TRUE,
'authenticated_delete' => TRUE,
);
$grants_string = implode(', ', array_keys(array_filter($grants, create_function('$grant', 'return $grant;'))));
if (empty($grants_string)) {
$grants_string = t('none');
}
return array(
'name' => t('Forum access functionality #1'),
'description' => t('Test forum access with the following grants: @grants_string', array(
'@grants_string' => $grants_string,
)),
'group' => t('Forum access'),
);
}
/**
* Implements setUp().
*/
public function setUp() {
parent::setUp();
}
/**
* Implements the Forum Access testing.
*/
function testForumAccess() {
$getinfo = $this
->getInfo();
$this
->testForumAccessRun($this
->testForumAccessGetGrants($getinfo['description']));
}
}
class ForumAccessTestCase2 extends ForumAccessTestCase {
/**
* Implements getInfo().
*
* Change the grants to your wishes
*/
public function getInfo() {
$grants = array(
'anonymous_view' => TRUE,
'anonymous_create' => TRUE,
'anonymous_update' => FALSE,
'anonymous_delete' => FALSE,
'authenticated_view' => TRUE,
'authenticated_create' => TRUE,
'authenticated_update' => TRUE,
'authenticated_delete' => TRUE,
);
$grants_string = implode(', ', array_keys(array_filter($grants, create_function('$grant', 'return $grant;'))));
if (empty($grants_string)) {
$grants_string = t('none');
}
return array(
'name' => t('Forum access functionality #2'),
'description' => t('Test forum access with the following grants: @grants_string', array(
'@grants_string' => $grants_string,
)),
'group' => t('Forum access'),
);
}
/**
* Implements setUp().
*/
public function setUp() {
parent::setUp();
}
/**
* Implements the Forum Access testing.
*/
function testForumAccess() {
$getinfo = $this
->getInfo();
$this
->testForumAccessRun($this
->testForumAccessGetGrants($getinfo['description']));
}
}
class ForumAccessTestCase3 extends ForumAccessTestCase {
/**
* Implements getInfo().
*
* Change the grants to your wishes
*/
public function getInfo() {
$grants = array(
'anonymous_view' => FALSE,
'anonymous_create' => FALSE,
'anonymous_update' => FALSE,
'anonymous_delete' => FALSE,
'authenticated_view' => TRUE,
'authenticated_create' => TRUE,
'authenticated_update' => TRUE,
'authenticated_delete' => TRUE,
);
$grants_string = implode(', ', array_keys(array_filter($grants, create_function('$grant', 'return $grant;'))));
if (empty($grants_string)) {
$grants_string = t('none');
}
return array(
'name' => t('Forum access functionality #3'),
'description' => t('Test forum access with the following grants: @grants_string', array(
'@grants_string' => $grants_string,
)),
'group' => t('Forum access'),
);
}
/**
* Implements setUp().
*/
public function setUp() {
parent::setUp();
}
/**
* Implements the Forum Access testing.
*/
function testForumAccess() {
$getinfo = $this
->getInfo();
$this
->testForumAccessRun($this
->testForumAccessGetGrants($getinfo['description']));
}
}
class ForumAccessTestCase4 extends ForumAccessTestCase {
/**
* Implements getInfo().
*
* Change the grants to your wishes
*/
public function getInfo() {
$grants = array(
'anonymous_view' => TRUE,
'anonymous_create' => FALSE,
'anonymous_update' => FALSE,
'anonymous_delete' => FALSE,
'authenticated_view' => TRUE,
'authenticated_create' => TRUE,
'authenticated_update' => FALSE,
'authenticated_delete' => FALSE,
);
$grants_string = implode(', ', array_keys(array_filter($grants, create_function('$grant', 'return $grant;'))));
if (empty($grants_string)) {
$grants_string = t('none');
}
return array(
'name' => t('Forum access functionality #4'),
'description' => t('Test forum access with the following grants: @grants_string', array(
'@grants_string' => $grants_string,
)),
'group' => t('Forum access'),
);
}
/**
* Implements setUp().
*/
public function setUp() {
parent::setUp();
}
/**
* Implements the Forum Access testing.
*/
function testForumAccess() {
$getinfo = $this
->getInfo();
$this
->testForumAccessRun($this
->testForumAccessGetGrants($getinfo['description']));
}
}
class ForumAccessTestCase5 extends ForumAccessTestCase {
/**
* Implements getInfo().
*
* Change the grants to your wishes
*/
public function getInfo() {
$grants = array(
'anonymous_view' => FALSE,
'anonymous_create' => FALSE,
'anonymous_update' => FALSE,
'anonymous_delete' => FALSE,
'authenticated_view' => TRUE,
'authenticated_create' => TRUE,
'authenticated_update' => TRUE,
'authenticated_delete' => FALSE,
);
$grants_string = implode(', ', array_keys(array_filter($grants, create_function('$grant', 'return $grant;'))));
if (empty($grants_string)) {
$grants_string = t('none');
}
return array(
'name' => t('Forum access functionality #5'),
'description' => t('Test forum access with the following grants: @grants_string', array(
'@grants_string' => $grants_string,
)),
'group' => t('Forum access'),
);
}
/**
* Implements setUp().
*/
public function setUp() {
parent::setUp();
}
/**
* Implements the Forum Access testing.
*/
function testForumAccess() {
$getinfo = $this
->getInfo();
$this
->testForumAccessRun($this
->testForumAccessGetGrants($getinfo['description']));
}
}
class ForumAccessTestCase6 extends ForumAccessTestCase {
/**
* Implements getInfo().
*
* Change the grants to your wishes
*/
public function getInfo() {
$grants = array(
'anonymous_view' => FALSE,
'anonymous_create' => FALSE,
'anonymous_update' => FALSE,
'anonymous_delete' => FALSE,
'authenticated_view' => TRUE,
'authenticated_create' => TRUE,
'authenticated_update' => FALSE,
'authenticated_delete' => FALSE,
);
$grants_string = implode(', ', array_keys(array_filter($grants, create_function('$grant', 'return $grant;'))));
if (empty($grants_string)) {
$grants_string = t('none');
}
return array(
'name' => t('Forum access functionality #6'),
'description' => t('Test forum access with the following grants: @grants_string', array(
'@grants_string' => $grants_string,
)),
'group' => t('Forum access'),
);
}
/**
* Implements setUp().
*/
public function setUp() {
parent::setUp();
}
/**
* Implements the Forum Access testing.
*/
function testForumAccess() {
$getinfo = $this
->getInfo();
$this
->testForumAccessRun($this
->testForumAccessGetGrants($getinfo['description']));
}
}
class ForumAccessTestCase7 extends ForumAccessTestCase {
/**
* Implements getInfo().
*
* Change the grants to your wishes
*/
public function getInfo() {
$grants = array(
'anonymous_view' => FALSE,
'anonymous_create' => FALSE,
'anonymous_update' => FALSE,
'anonymous_delete' => FALSE,
'authenticated_view' => TRUE,
'authenticated_create' => FALSE,
'authenticated_update' => FALSE,
'authenticated_delete' => FALSE,
);
$grants_string = implode(', ', array_keys(array_filter($grants, create_function('$grant', 'return $grant;'))));
if (empty($grants_string)) {
$grants_string = t('none');
}
return array(
'name' => t('Forum access functionality #7'),
'description' => t('Test forum access with the following grants: @grants_string', array(
'@grants_string' => $grants_string,
)),
'group' => t('Forum access'),
);
}
/**
* Implements setUp().
*/
public function setUp() {
parent::setUp();
}
/**
* Implements the Forum Access testing.
*/
function testForumAccess() {
$getinfo = $this
->getInfo();
$this
->testForumAccessRun($this
->testForumAccessGetGrants($getinfo['description']));
}
}
Classes
Name![]() |
Description |
---|---|
ForumAccessTestCase | This is the base class for forum access testing. |
ForumAccessTestCase1 | |
ForumAccessTestCase2 | |
ForumAccessTestCase3 | |
ForumAccessTestCase4 | |
ForumAccessTestCase5 | |
ForumAccessTestCase6 | |
ForumAccessTestCase7 |