summaryrefslogtreecommitdiff
path: root/modules/comment/comment.test
diff options
context:
space:
mode:
authorDries Buytaert <dries@buytaert.net>2008-04-20 18:24:07 +0000
committerDries Buytaert <dries@buytaert.net>2008-04-20 18:24:07 +0000
commitaf474609e3e80db9ba1d16b9ad2eae89775f51c8 (patch)
treee525479dd6381b94d21943c3d2decf1c749c028c /modules/comment/comment.test
parentfe7b9baff62379f5a0c901d27cbb677345791bd0 (diff)
downloadbrdo-af474609e3e80db9ba1d16b9ad2eae89775f51c8.tar.gz
brdo-af474609e3e80db9ba1d16b9ad2eae89775f51c8.tar.bz2
- Added a test framework to Drupal along with a first batch of tests for
Drupal core! This is an important milestone for the project so enable the module and check it out ... :) Thanks to Rok Žlender, Károly Négyesi, Jimmy Berry, Kevin Bridges, Charlie Gordon, Douglas Hubler, Miglius Alaburda, Andy Kirkham, Dimitri13, Kieran Lal, Moshe Weitzman, and the many other people that helped with testing over the past years and that drove this home. It all works but it is still rough around the edges (i.e. documentation is still being written, the coding style is not 100% yet, a number of tests still fail) but we spent the entire weekend working on it in Paris and made a ton of progress. The best way to help and to get up to speed, is to start writing and contributing some tests ... as well as fixing some of the failures. For those willing to help with improving the test framework, here are some next steps and issues to resolve: - How to best approach unit tests and mock functions? - How to test drupal_mail() and drupal_http_request()? - How to improve the admin UI so we have a nice progress bar? - How best to do code coverage? - See http://g.d.o/node/10099 for more ...
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];
+ }
+}