t('Comment functionality'), 'desc' => t('...'), 'group' => t('Comment Tests'), ); } function setUp() { parent::setUp(); $this->drupalModuleEnable('comment'); } function tearDown() { parent::tearDown(); } function testComment() { // Create users. $admin_user = $this->drupalCreateUserRolePerm(array('administer content types', 'administer comments', 'administer permissions')); $web_user = $this->drupalCreateUserRolePerm(array('access comments', 'post comments', 'create story content')); // Set comments to not have subject. $this->drupalLoginUser($admin_user); $this->set_comment_preview(TRUE); $this->set_comment_subject(FALSE); $this->drupalGet('logout'); // Create test node. $this->drupalLoginUser($web_user); $node = $this->drupalCreateNode(array('type' => 'story')); $this->assertTrue($node, 'Story node created.'); // Post comment without subject $this->drupalGet('comment/reply/'. $node->nid); $this->assertNoPattern('/(input)(.*?)(name="subject")/', 'Subject field not found.'); // Set comments to have subject and preview to required. $this->drupalGet('logout'); $this->drupalLoginUser($admin_user); $this->set_comment_subject(true); $this->set_comment_preview(true); $this->drupalGet('logout'); // Create comment that requires preview. $this->drupalLoginUser($web_user); $comment = $this->post_comment($node, $this->randomName(), $this->randomName()); $this->assertTrue($this->comment_exists($comment), 'Comment found.'); // Reply to comment. $this->drupalGet('comment/reply/'. $node->nid .'/'. $comment->id); $reply = $this->post_comment(NULL, $this->randomName(), $this->randomName()); $this->assertTrue($this->comment_exists($reply, TRUE), 'Reply found.'); // Edit reply. $this->drupalGet('comment/edit/'. $reply->id); $reply = $this->post_comment(NULL, $this->randomName(), $this->randomName()); $this->assertTrue($this->comment_exists($reply, TRUE), 'Modified reply found.'); // Delete comment and make sure that reply is also removed. $this->drupalGet('logout'); $this->drupalLoginUser($admin_user); $this->delete_comment($comment); $this->drupalGet('node/'. $node->nid); $this->assertFalse($this->comment_exists($comment), 'Comment not found.'); $this->assertFalse($this->comment_exists($reply, TRUE), 'Reply not found.'); // Enabled comment form on node page. $this->set_comment_form(TRUE); $this->drupalGet('logout'); // Submit comment through node form. $this->drupalLoginUser($web_user); $this->drupalGet('node/'. $node->nid); $form_comment = $this->post_comment(NULL, $this->randomName(), $this->randomName()); $this->assertTrue($this->comment_exists($form_comment), 'Form comment found.'); // Disable comment form on node page. $this->drupalGet('logout'); $this->drupalLoginUser($admin_user); $this->set_comment_form(FALSE); // Enabled anonymous user comments. $this->set_anonymous_user_comment(TRUE, TRUE); $this->set_comment_anonymous('0'); // Ensure that doesn't require contact info. $this->drupalGet('logout'); // Post anonymous comment without contact info. $anonymous_comment1 = $this->post_comment($node, $this->randomName(), $this->randomName()); $this->assertTrue($this->comment_exists($anonymous_comment1), 'Anonymous comment without contact info found.'); // Allow contact info. $this->drupalLoginUser($admin_user); $this->set_comment_anonymous('1'); $this->drupalGet('logout'); // Post anonymous comment with contact info (optional). $this->drupalGet('comment/reply/'. $node->nid); $this->assertTrue($this->comment_contact_info_available(), 'Contact information available.'); $anonymous_comment2 = $this->post_comment($node, $this->randomName(), $this->randomName()); $this->assertTrue($this->comment_exists($anonymous_comment2), 'Anonymous comment with contact info (optional) found.'); // Require contact info. $this->drupalLoginUser($admin_user); $this->set_comment_anonymous('2'); $this->drupalGet('logout'); // Try to post comment with contact info (required). $this->drupalGet('comment/reply/'. $node->nid); $this->assertTrue($this->comment_contact_info_available(), 'Contact information available.'); $anonymous_comment3 = $this->post_comment($node, $this->randomName(), $this->randomName(), TRUE, TRUE); $this->assertText(t('E-mail field is required.'), 'E-mail required.'); // Name should have 'Anonymous' for value by default. $this->assertFalse($this->comment_exists($anonymous_comment3), 'Anonymous comment with contact info (required) not found.'); // Post comment with contact info (required). $anonymous_comment3 = $this->post_comment($node, $this->randomName(), $this->randomName(), TRUE, array('mail' => 'tester@simpletest.org')); $this->assertTrue($this->comment_exists($anonymous_comment3), 'Anonymous comment with contact info (required) found.'); // Unpublish comment. $this->drupalLoginUser($admin_user); $this->perform_comment_operation($anonymous_comment3, 'unpublish'); $this->drupalGet('admin/content/comment/approval'); $this->assertWantedRaw('comments['. $anonymous_comment3->id .']', 'Comment was unpublished.'); // Publish comment. $this->perform_comment_operation($anonymous_comment3, 'publish', TRUE); $this->drupalGet('admin/content/comment'); $this->assertWantedRaw('comments['. $anonymous_comment3->id .']', 'Comment was published.'); // Delete comment. $this->perform_comment_operation($anonymous_comment3, 'delete'); $this->drupalGet('admin/content/comment'); $this->assertNoUnwantedRaw('comments['. $anonymous_comment3->id .']', 'Comment was deleted.'); // Set anonymouse comments to require approval. $this->set_anonymous_user_comment(TRUE, FALSE); $this->set_comment_anonymous('0'); // Ensure that doesn't require contact info. $this->drupalGet('logout'); // Post anonymous comment without contact info. $subject = $this->randomName(); $body = $this->randomName(); $this->post_comment($node, $subject, $body, TRUE, TRUE); // Set $contact to true so that it won't check for id and message. $this->assertText(t('Your comment has been queued for moderation by site administrators and will be published after approval.'), 'Comment requires approval.'); // Get unaproved comment id. $this->drupalLoginUser($admin_user); $anonymous_comment4 = $this->get_unaproved_comment($subject); $anonymous_comment4 = (object) array('id' => $anonymous_comment4, 'subject' => $subject, 'body' => $body); $this->drupalGet('logout'); $this->assertFalse($this->comment_exists($anonymous_comment4), 'Anonymous comment was not published.'); // Approve comment. $this->drupalLoginUser($admin_user); $this->perform_comment_operation($anonymous_comment4, 'publish', TRUE); $this->drupalGet('logout'); $this->drupalGet('node/'. $node->nid); $this->assertTrue($this->comment_exists($anonymous_comment4), 'Anonymous comment visible.'); // Reset. $this->drupalLoginUser($admin_user); $this->set_anonymous_user_comment(FALSE, FALSE); } function post_comment(object $node, $subject, $comment, $preview = TRUE, $contact = NULL) { $edit = array(); $edit['subject'] = $subject; $edit['comment'] = $comment; if ($contact !== NULL && is_array($contact)) { $edit += $contact; } if ($node !== NULL) { $this->drupalGet('comment/reply/'. $node->nid); } if ($preview) { $this->assertNoPattern('/(input)(.*?)(value="Save")/', 'Save button not found.'); // Preview required so no save button should be found. $this->drupalPostRequest(NULL, $edit, 'Preview'); } $this->drupalPostRequest(NULL, array(), 'Save'); // get comment if ($contact !== TRUE) { // If true then attempting to find error message. $this->assertText($subject, 'Comment posted.'); preg_match('/href="(.*?)#comment-([^"]+)"(.*?)>('. $subject .')/', $this->drupalGetContent(), $match); $this->assertTrue((!empty($match) && !empty($match[2])), 'Comment id found.'); return (object) array('id' => $match[2], 'subject' => $subject, 'comment' => $comment); } } /** * Checks current pag for specified comment. * * @param object $comment Comment object. * @param boolean $reply The comment is a reply to another comment. * @return boolean Comment found. */ function comment_exists(object $comment, $reply = FALSE) { $regex = '/'. ($reply ? '
(.*?)' : ''); $regex .= 'subject .'(.*?)'; // Match subject. $regex .= $comment->comment .'(.*?)'; // Match comment. $regex .= '<\/div>/s'; // Dot matches newlines and ensure that match doesn't bleed outside comment div. return preg_match($regex, $this->drupalGetContent()); } function delete_comment(object $comment) { $this->drupalPostRequest('comment/delete/'. $comment->id, array(), 'Delete'); $this->assertWantedText(t('The comment and all its replies have been deleted.'), 'Comment deleted.'); } function set_comment_subject(bool $enabled) { $this->set_comment_settings(array('comment_subject_field' => ($enabled ? '1' : '0')), 'Comment subject '. ($enabled ? 'enabled' : 'disabled') .'.'); } function set_comment_preview(bool $required) { $this->set_comment_settings(array('comment_preview' => ($required ? '1' : '0')), 'Comment preview '. ($required ? 'required' : 'optional') .'.'); } function set_comment_form($enabled) { $this->set_comment_settings(array('comment_controls' => ($enabled ? '1' : '3')), 'Comment controls '. ($enabled ? 'enabled' : 'disabled') .'.'); } function set_comment_anonymous($level) { $this->set_comment_settings(array('comment_anonymous' => $level), 'Anonymous commenting set to level '. $level .'.'); } function set_comment_settings(array $settings, $message) { $this->drupalPostRequest('admin/content/types/story', $settings, 'Save content type'); $this->assertWantedRaw(t('The content type %type has been updated.', array('%type' => 'Story')), $message); } function set_anonymous_user_comment(bool $enabled, bool $without_approval) { $edit = array(); $edit['1[access comments]'] = $enabled; $edit['1[post comments]'] = $enabled; $edit['1[post comments without approval]'] = $without_approval; $this->drupalPostRequest('admin/user/permissions', $edit, 'Save permissions'); $this->assertText(t('The changes have been saved.'), 'Anonymous user comments '. ($enabled ? 'enabled' : 'disabled') .'.'); } function comment_contact_info_available() { return preg_match('/(input).*?(name="name").*?(input).*?(name="mail").*?(input).*?(name="homepage")/s', $this->drupalGetContent()); } function perform_comment_operation(object $comment, $operation, $approval = FALSE) { $edit = array(); $edit['operation'] = $operation; $edit['comments['. $comment->id .']'] = TRUE; $this->drupalPostRequest('admin/content/comment'. ($approval ? '/approval' : ''), $edit, 'Update'); if ($operation == 'delete') { $this->drupalPostRequest(NULL, array(), 'Delete comments'); $this->assertText(t('The comments have been deleted.'), 'Operation "'. $operation .'" was performed on comment.'); } else { $this->assertText(t('The update has been performed.'), 'Operation "'. $operation .'" was performed on comment.'); } } function get_unaproved_comment($subject) { $this->drupalGet('admin/content/comment/approval'); preg_match('/href="(.*?)#comment-([^"]+)"(.*?)>('. $subject .')/', $this->drupalGetContent(), $match); return $match[2]; } }