CommentValidationTest.php 5.19 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14
<?php

/**
 * @file
 * Contains \Drupal\comment\Tests\CommentValidationTest.
 */

namespace Drupal\comment\Tests;

use Drupal\comment\CommentInterface;
use Drupal\system\Tests\Entity\EntityUnitTestBase;

/**
 * Tests comment validation constraints.
15 16
 *
 * @group comment
17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
 */
class CommentValidationTest extends EntityUnitTestBase {

  /**
   * Modules to enable.
   *
   * @var array
   */
  public static $modules = array('comment', 'node');

  /**
   * {@inheritdoc}
   */
  public function setUp() {
    parent::setUp();
32 33
    $this->installEntitySchema('node');
    $this->installEntitySchema('comment');
34
    $this->installSchema('comment', array('comment_entity_statistics'));
35 36 37 38 39 40
  }

  /**
   * Tests the comment validation constraints.
   */
  public function testValidation() {
41 42 43 44 45 46 47
    // Add comment type.
    $this->entityManager->getStorage('comment_type')->create(array(
      'id' => 'comment',
      'label' => 'comment',
      'target_entity_type_id' => 'node',
    ))->save();

48
    // Add comment field to content.
49
    $this->entityManager->getStorage('field_storage_config')->create(array(
50 51 52
      'entity_type' => 'node',
      'name' => 'comment',
      'type' => 'comment',
53 54 55
      'settings' => array(
        'comment_type' => 'comment',
      )
56
    ))->save();
57 58

    // Create a page node type.
59
    $this->entityManager->getStorage('node_type')->create(array(
60 61 62 63
      'type' => 'page',
      'name' => 'page',
    ))->save();

64
    // Add comment field instance to page content.
65
    $this->entityManager->getStorage('field_instance_config')->create(array(
66 67 68 69 70 71
      'field_name' => 'comment',
      'entity_type' => 'node',
      'bundle' => 'page',
      'label' => 'Comment settings',
    ))->save();

72
    $node = $this->entityManager->getStorage('node')->create(array(
73 74 75 76 77
      'type' => 'page',
      'title' => 'test',
    ));
    $node->save();

78
    $comment = $this->entityManager->getStorage('comment')->create(array(
79 80 81
      'entity_id' => $node->id(),
      'entity_type' => 'node',
      'field_name' => 'comment',
82
      'comment_body' => $this->randomName(),
83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148
    ));

    $violations = $comment->validate();
    $this->assertEqual(count($violations), 0, 'No violations when validating a default comment.');

    $comment->set('subject', $this->randomString(65));
    $this->assertLengthViolation($comment, 'subject', 64);

    // Make the subject valid.
    $comment->set('subject', $this->randomString());
    $comment->set('name', $this->randomString(61));
    $this->assertLengthViolation($comment, 'name', 60);

    // Validate a name collision between an anonymous comment author name and an
    // existing user account name.
    $user = entity_create('user', array('name' => 'test'));
    $user->save();
    $comment->set('name', 'test');
    $violations = $comment->validate();
    $this->assertEqual(count($violations), 1, "Violation found on author name collision");
    $this->assertEqual($violations[0]->getPropertyPath(), "name");
    $this->assertEqual($violations[0]->getMessage(), t('%name belongs to a registered user.', array('%name' => 'test')));

    // Make the name valid.
    $comment->set('name', 'valid unused name');
    $comment->set('mail', 'invalid');
    $violations = $comment->validate();
    $this->assertEqual(count($violations), 1, 'Violation found when email is invalid');
    $this->assertEqual($violations[0]->getPropertyPath(), 'mail.0.value');
    $this->assertEqual($violations[0]->getMessage(), t('This value is not a valid email address.'));

    $comment->set('mail', NULL);
    $comment->set('homepage', 'http://example.com/' . $this->randomName(237));
    $this->assertLengthViolation($comment, 'homepage', 255);

    $comment->set('homepage', 'invalid');
    $violations = $comment->validate();
    $this->assertEqual(count($violations), 1, 'Violation found when homepage is invalid');
    $this->assertEqual($violations[0]->getPropertyPath(), 'homepage.0.value');

    // @todo This message should be improved in https://drupal.org/node/2012690
    $this->assertEqual($violations[0]->getMessage(), t('This value should be of the correct primitive type.'));

    $comment->set('homepage', NULL);
    $comment->set('hostname', $this->randomString(129));
    $this->assertLengthViolation($comment, 'hostname', 128);

    $comment->set('hostname', NULL);
    $comment->set('thread', $this->randomString(256));
    $this->assertLengthViolation($comment, 'thread', 255);
  }

  /**
   * Verifies that a length violation exists for the given field.
   *
   * @param \Drupal\comment\CommentInterface $comment
   *   The comment object to validate.
   * @param string $field_name
   *   The field that violates the maximum length.
   * @param int $length
   *   Number of characters that was exceeded.
   */
  protected function assertLengthViolation(CommentInterface $comment, $field_name, $length) {
    $violations = $comment->validate();
    $this->assertEqual(count($violations), 1, "Violation found when $field_name is too long.");
    $this->assertEqual($violations[0]->getPropertyPath(), "$field_name.0.value");
149 150
    $field_label = $comment->get($field_name)->getFieldDefinition()->getLabel();
    $this->assertEqual($violations[0]->getMessage(), t('%name: may not be longer than @max characters.', array('%name' => $field_label, '@max' => $length)));
151 152 153
  }

}