summaryrefslogtreecommitdiff
path: root/modules/comment/comment.test
diff options
context:
space:
mode:
Diffstat (limited to 'modules/comment/comment.test')
-rw-r--r--modules/comment/comment.test372
1 files changed, 372 insertions, 0 deletions
diff --git a/modules/comment/comment.test b/modules/comment/comment.test
new file mode 100644
index 000000000..c309769f2
--- /dev/null
+++ b/modules/comment/comment.test
@@ -0,0 +1,372 @@
+<?php
+// $Id$
+
+class CommentTestCase extends DrupalWebTestCase {
+ protected $admin_user;
+ protected $web_user;
+ protected $node;
+
+ /**
+ * Implementation of getInfo().
+ */
+ function getInfo() {
+ return array(
+ 'name' => t('Comment functionality'),
+ 'description' => t('Thoroughly test comment administration and user interfaces.'),
+ 'group' => t('Comment'),
+ );
+ }
+
+ /**
+ * Implementation of setUp().
+ */
+ function setUp() {
+ parent::setUp('comment');
+ // Create users.
+ $this->admin_user = $this->drupalCreateUser(array('administer content types', 'administer comments', 'administer permissions'));
+ $this->web_user = $this->drupalCreateUser(array('access comments', 'post comments', 'create story content'));
+
+ $this->drupalLogin($this->web_user);
+ $this->node = $this->drupalCreateNode(array('type' => 'story'));
+ $this->assertTrue($this->node, t('Story node created.'));
+ $this->drupalLogout();
+ }
+
+ /**
+ * Test comment interface.
+ */
+ function testCommentInterface() {
+ // Set comments to not have subject.
+ $this->drupalLogin($this->admin_user);
+ $this->setCommentPreview(TRUE);
+ $this->setCommentSubject(FALSE);
+ $this->drupalLogout();
+
+ // Post comment without subject.
+ $this->drupalLogin($this->web_user);
+ $this->drupalGet('comment/reply/'. $this->node->nid);
+ $this->assertNoFieldByName('subject', '', t('Subject field not found.'));
+
+ // Set comments to have subject and preview to required.
+ $this->drupalLogout();
+ $this->drupalLogin($this->admin_user);
+ $this->setCommentSubject(TRUE);
+ $this->setCommentPreview(TRUE);
+ $this->drupalLogout();
+
+ // Create comment that requires preview.
+ $this->drupalLogin($this->web_user);
+ $comment = $this->postComment($this->node, $this->randomName(), $this->randomName());
+ $this->assertTrue($this->commentExists($comment), t('Comment found.'));
+
+ // Reply to comment.
+ $this->drupalGet('comment/reply/'. $this->node->nid .'/'. $comment->id);
+ $reply = $this->postComment(NULL, $this->randomName(), $this->randomName());
+ $this->assertTrue($this->commentExists($reply, TRUE), t('Reply found.'));
+
+ // Edit reply.
+ $this->drupalGet('comment/edit/'. $reply->id);
+ $reply = $this->postComment(NULL, $this->randomName(), $this->randomName());
+ $this->assertTrue($this->commentExists($reply, TRUE), t('Modified reply found.'));
+
+ // Delete comment and make sure that reply is also removed.
+ $this->drupalLogout();
+ $this->drupalLogin($this->admin_user);
+ $this->deleteComment($comment);
+
+ $this->drupalGet('node/'. $this->node->nid);
+ $this->assertFalse($this->commentExists($comment), t('Comment not found.'));
+ $this->assertFalse($this->commentExists($reply, TRUE), t('Reply not found.'));
+ }
+
+ /**
+ * Test comment form on node page.
+ */
+ function testFormOnPage() {
+ // Enabled comment form on node page.
+ $this->drupalLogin($this->admin_user);
+ $this->setCommentForm(TRUE);
+ $this->drupalLogout();
+
+ // Submit comment through node form.
+ $this->drupalLogin($this->web_user);
+ $this->drupalGet('node/'. $this->node->nid);
+ $form_comment = $this->postComment(NULL, $this->randomName(), $this->randomName());
+ $this->assertTrue($this->commentExists($form_comment), t('Form comment found.'));
+
+ // Disable comment form on node page.
+ $this->drupalLogout();
+ $this->drupalLogin($this->admin_user);
+ $this->setCommentForm(FALSE);
+ }
+
+ /**
+ * Test anonymous comment functionality.
+ */
+ function testAnonymous() {
+ $this->drupalLogin($this->admin_user);
+ // Enabled anonymous user comments.
+ $this->setAnonymousUserComment(TRUE, TRUE);
+ $this->setCommentAnonymous('0'); // Ensure that doesn't require contact info.
+ $this->drupalLogout();
+
+ // Post anonymous comment without contact info.
+ $anonymous_comment1 = $this->postComment($this->node, $this->randomName(), $this->randomName());
+ $this->assertTrue($this->commentExists($anonymous_comment1), t('Anonymous comment without contact info found.'));
+
+ // Allow contact info.
+ $this->drupalLogin($this->admin_user);
+ $this->setCommentAnonymous('1');
+ $this->drupalLogout();
+
+ // Post anonymous comment with contact info (optional).
+ $this->drupalGet('comment/reply/'. $this->node->nid);
+ $this->assertTrue($this->commentContactInfoAvailable(), t('Contact information available.'));
+
+ $anonymous_comment2 = $this->postComment($this->node, $this->randomName(), $this->randomName());
+ $this->assertTrue($this->commentExists($anonymous_comment2), t('Anonymous comment with contact info (optional) found.'));
+
+ // Require contact info.
+ $this->drupalLogin($this->admin_user);
+ $this->setCommentAnonymous('2');
+ $this->drupalLogout();
+
+ // Try to post comment with contact info (required).
+ $this->drupalGet('comment/reply/'. $this->node->nid);
+ $this->assertTrue($this->commentContactInfoAvailable(), t('Contact information available.'));
+
+ $anonymous_comment3 = $this->postComment($this->node, $this->randomName(), $this->randomName(), TRUE, TRUE);
+ $this->assertText(t('E-mail field is required.'), t('E-mail required.')); // Name should have 'Anonymous' for value by default.
+ $this->assertFalse($this->commentExists($anonymous_comment3), t('Anonymous comment with contact info (required) not found.'));
+
+ // Post comment with contact info (required).
+ $anonymous_comment3 = $this->postComment($this->node, $this->randomName(), $this->randomName(), FALSE, array('mail' => 'tester@simpletest.org'));
+ $this->assertTrue($this->commentExists($anonymous_comment3), t('Anonymous comment with contact info (required) found.'));
+
+ // Unpublish comment.
+ $this->drupalLogin($this->admin_user);
+ $this->performCommentOperation($anonymous_comment3, 'unpublish');
+
+ $this->drupalGet('admin/content/comment/approval');
+ $this->assertRaw('comments['. $anonymous_comment3->id .']', t('Comment was unpublished.'));
+
+ // Publish comment.
+ $this->performCommentOperation($anonymous_comment3, 'publish', TRUE);
+
+ $this->drupalGet('admin/content/comment');
+ $this->assertRaw('comments['. $anonymous_comment3->id .']', t('Comment was published.'));
+
+ // Delete comment.
+ $this->performCommentOperation($anonymous_comment3, 'delete');
+
+ $this->drupalGet('admin/content/comment');
+ $this->assertNoRaw('comments['. $anonymous_comment3->id .']', t('Comment was deleted.'));
+
+ // Set anonymouse comments to require approval.
+ $this->setAnonymousUserComment(TRUE, FALSE);
+ $this->setCommentAnonymous('0'); // Ensure that doesn't require contact info.
+ $this->drupalLogout();
+
+ // Post anonymous comment without contact info.
+ $subject = $this->randomName();
+ $body = $this->randomName();
+ $this->postComment($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.'), t('Comment requires approval.'));
+
+ // Get unaproved comment id.
+ $this->drupalLogin($this->admin_user);
+ $anonymous_comment4 = $this->getUnaprovedComment($subject);
+ $anonymous_comment4 = (object) array('id' => $anonymous_comment4, 'subject' => $subject, 'comment' => $body);
+ $this->drupalLogout();
+
+ $this->assertFalse($this->commentExists($anonymous_comment4), t('Anonymous comment was not published.'));
+
+ // Approve comment.
+ $this->drupalLogin($this->admin_user);
+ $this->performCommentOperation($anonymous_comment4, 'publish', TRUE);
+ $this->drupalLogout();
+
+ $this->drupalGet('node/'. $this->node->nid);
+ $this->assertTrue($this->commentExists($anonymous_comment4), t('Anonymous comment visible.'));
+
+ // Reset.
+ $this->drupalLogin($this->admin_user);
+ $this->setAnonymousUserComment(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 postComment($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->assertNoFieldByName('op', t('Save'), t('Save button not found.')); // Preview required so no save button should be found.
+ $this->drupalPost(NULL, $edit, t('Preview'));
+ }
+ $this->drupalPost(NULL, $edit, t('Save'));
+
+ $match = array();
+ // Get comment ID
+ preg_match('/#comment-([^"]+)/', $this->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])), t('Comment id found.'));
+ }
+ if (isset($match[1])) {
+ return (object) array('id' => $match[1], '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 commentExists($comment, $reply = FALSE) {
+ if ($comment && is_object($comment)) {
+ $regex = '/'. ($reply ? '<div class="indented">(.*?)' : '');
+ $regex .= '<a id="comment-'. $comment->id .'"(.*?)'; // Comment anchor.
+ $regex .= '<div(.*?)'; // Begin in comment div.
+ $regex .= $comment->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());
+ }
+ else {
+ return FALSE;
+ }
+ }
+
+ /**
+ * Delete comment.
+ *
+ * @param object $comment Comment to delete.
+ */
+ function deleteComment($comment) {
+ $this->drupalPost('comment/delete/'. $comment->id, array(), t('Delete'));
+ $this->assertText(t('The comment and all its replies have been deleted.'), t('Comment deleted.'));
+ }
+
+ /**
+ * Set comment subject setting.
+ *
+ * @param boolean $enabled Subject value.
+ */
+ function setCommentSubject($enabled) {
+ $this->setCommentSettings('comment_subject_field', ($enabled ? '1' : '0'), 'Comment subject '. ($enabled ? 'enabled' : 'disabled') .'.');
+ }
+
+ /**
+ * Set comment preview setting.
+ *
+ * @param boolean $required Preview value.
+ */
+ function setCommentPreview($required) {
+ $this->setCommentSettings('comment_preview', ($required ? '1' : '0'), 'Comment preview '. ($required ? 'required' : 'optional') .'.');
+ }
+
+ /**
+ * Set comment form setting.
+ *
+ * @param boolean $enabled Form value.
+ */
+ function setCommentForm($enabled) {
+ $this->setCommentSettings('comment_form_location', ($enabled ? '1' : '3'), 'Comment controls '. ($enabled ? 'enabled' : 'disabled') .'.');
+ }
+
+ /**
+ * Set comment anonymous level setting.
+ *
+ * @param integer $level Anonymous level.
+ */
+ function setCommentAnonymous($level) {
+ $this->setCommentSettings('comment_anonymous', $level, 'Anonymous commenting set to level '. $level .'.');
+ }
+
+ /**
+ * Set comment setting for story content type.
+ *
+ * @param string $name Name of variable.
+ * @param string $vale Value of variable.
+ * @param string $message Status message to display.
+ */
+ function setCommentSettings($name, $value, $message) {
+ variable_set($name .'_story', $value);
+ $this->assertTrue(TRUE, t($message)); // Display status message.
+ }
+
+ /**
+ * Set anonymous comment setting.
+ *
+ * @param boolean $enabled Allow anonymous commenting.
+ * @param boolean $without_approval Allow anonymous commenting without approval.
+ */
+ function setAnonymousUserComment($enabled, $without_approval) {
+ $edit = array();
+ $edit['1[access comments]'] = $enabled;
+ $edit['1[post comments]'] = $enabled;
+ $edit['1[post comments without approval]'] = $without_approval;
+ $this->drupalPost('admin/user/permissions', $edit, t('Save permissions'));
+ $this->assertText(t('The changes have been saved.'), t('Anonymous user comments '. ($enabled ? 'enabled' : 'disabled') .'.'));
+ }
+
+ /**
+ * Check for contact info.
+ *
+ * @return boolean Contact info is avialable.
+ */
+ function commentContactInfoAvailable() {
+ return preg_match('/(input).*?(name="name").*?(input).*?(name="mail").*?(input).*?(name="homepage")/s', $this->drupalGetContent());
+ }
+
+ /**
+ * Perform the specified operation on the specified comment.
+ *
+ * @param object $comment Comment to perform operation on.
+ * @param string $operation Operation to perform.
+ * @param boolean $aproval Operation is found on approval page.
+ */
+ function performCommentOperation($comment, $operation, $approval = FALSE) {
+ $edit = array();
+ $edit['operation'] = $operation;
+ $edit['comments['. $comment->id .']'] = TRUE;
+ $this->drupalPost('admin/content/comment'. ($approval ? '/approval' : ''), $edit, t('Update'));
+
+ if ($operation == 'delete') {
+ $this->drupalPost(NULL, array(), t('Delete comments'));
+ $this->assertText(t('The comments have been deleted.'), t('Operation "'. $operation .'" was performed on comment.'));
+ }
+ else {
+ $this->assertText(t('The update has been performed.'), t('Operation "'. $operation .'" was performed on comment.'));
+ }
+ }
+
+ /**
+ * Get the comment id for an unaproved comment.
+ *
+ * @param string $subject Comment subject to find.
+ * @return integer Comment id.
+ */
+ function getUnaprovedComment($subject) {
+ $this->drupalGet('admin/content/comment/approval');
+ preg_match('/href="(.*?)#comment-([^"]+)"(.*?)>('. $subject .')/', $this->drupalGetContent(), $match);
+ return $match[2];
+ }
+}