t('Comment functionality'), 'desc' => t('Thoroughly test comment administration and user interfaces.'), 'group' => t('Comment Tests'), ); } function setUp() { parent::setUp(); $this->drupalModuleEnable('comment'); // Create users. $this->admin_user = $this->drupalCreateUserRolePerm(array('administer content types', 'administer comments', 'administer permissions')); $this->web_user = $this->drupalCreateUserRolePerm(array('access comments', 'post comments', 'create story content')); $this->drupalLoginUser($this->web_user); $this->node = $this->drupalCreateNode(array('type' => 'story')); $this->assertTrue($this->node, 'Story node created.'); $this->drupalGet('logout'); } /** * Test comment interface. */ // function testCommentInterface() { // // Set comments to not have subject. // $this->drupalLoginUser($this->admin_user); // $this->set_comment_preview(TRUE); // $this->set_comment_subject(FALSE); // $this->drupalGet('logout'); // // // Post comment without subject // $this->drupalLoginUser($this->web_user); // $this->drupalGet('comment/reply/'. $this->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($this->admin_user); // $this->set_comment_subject(true); // $this->set_comment_preview(true); // $this->drupalGet('logout'); // // // Create comment that requires preview. // $this->drupalLoginUser($this->web_user); // $comment = $this->post_comment($this->node, $this->randomName(), $this->randomName()); // $this->assertTrue($this->comment_exists($comment), 'Comment found.'); // // // Reply to comment. // $this->drupalGet('comment/reply/'. $this->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($this->admin_user); // $this->delete_comment($comment); // // $this->drupalGet('node/'. $this->node->nid); // $this->assertFalse($this->comment_exists($comment), 'Comment not found.'); // $this->assertFalse($this->comment_exists($reply, TRUE), 'Reply not found.'); // } /** * Test comment form on node page. */ function testFormOnPage() { // Enabled comment form on node page. $this->drupalLoginUser($this->admin_user); $this->set_comment_form(TRUE); $this->drupalGet('logout'); // Submit comment through node form. $this->drupalLoginUser($this->web_user); $this->drupalGet('node/'. $this->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($this->admin_user); $this->set_comment_form(FALSE); } /** * Test anonymous comment functionality. */ function testAnonymous() { $this->drupalLoginUser($this->admin_user); // 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($this->node, $this->randomName(), $this->randomName()); $this->assertTrue($this->comment_exists($anonymous_comment1), 'Anonymous comment without contact info found.'); // Allow contact info. $this->drupalLoginUser($this->admin_user); $this->set_comment_anonymous('1'); $this->drupalGet('logout'); // Post anonymous comment with contact info (optional). $this->drupalGet('comment/reply/'. $this->node->nid); $this->assertTrue($this->comment_contact_info_available(), 'Contact information available.'); $anonymous_comment2 = $this->post_comment($this->node, $this->randomName(), $this->randomName()); $this->assertTrue($this->comment_exists($anonymous_comment2), 'Anonymous comment with contact info (optional) found.'); // Require contact info. $this->drupalLoginUser($this->admin_user); $this->set_comment_anonymous('2'); $this->drupalGet('logout'); // Try to post comment with contact info (required). $this->drupalGet('comment/reply/'. $this->node->nid); $this->assertTrue($this->comment_contact_info_available(), 'Contact information available.'); $anonymous_comment3 = $this->post_comment($this->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($this->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($this->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($this->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($this->admin_user); $anonymous_comment4 = $this->get_unaproved_comment($subject); $anonymous_comment4 = (object) array('id' => $anonymous_comment4, 'subject' => $subject, 'comment' => $body); $this->drupalGet('logout'); $this->assertFalse($this->comment_exists($anonymous_comment4), 'Anonymous comment was not published.'); // Approve comment. $this->drupalLoginUser($this->admin_user); $this->perform_comment_operation($anonymous_comment4, 'publish', TRUE); $this->drupalGet('logout'); $this->drupalGet('node/'. $this->node->nid); $this->assertTrue($this->comment_exists($anonymous_comment4), 'Anonymous comment visible.'); // Reset. $this->drupalLoginUser($this->admin_user); $this->set_anonymous_user_comment(FALSE, FALSE); } /** * Post comment. * * @param object $node Node to post comment on. * @param string $subject Comment subject. * @param string $comment Comment body. * @param boolean $preview Should preview be required. * @param mixed $contact Set to NULL for no contact info, TRUE to ignore success checking, and array of values to set contact info. */ function post_comment($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->assertFieldById('edit-comment'); $this->assertNoPattern('/(input)(.*?)(value="Save")/', 'Save button not found.'); // Preview required so no save button should be found. $this->drupalPost(NULL, $edit, 'Preview'); } $this->drupalPost(NULL, array(), 'Save'); $match = array(); // Get comment ID preg_match('/#comment-([^"]+)/', $this->_browser->getURL(), $match); // get comment if ($contact !== TRUE) { // If true then attempting to find error message. $this->assertText($subject, 'Comment posted.'); $this->assertTrue((!empty($match) && !empty($match[1])), 'Comment id found.'); } if (isset($match[1])) { return (object) array('id' => $match[1], 'subject' => $subject, 'comment' => $comment); } else { return NULL; } } /** * 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($comment, $reply = FALSE) { if ($comment && is_object($comment)) { $regex = '/'. ($reply ? '