2015-08-17 17:00:26 -07:00
< ? php
/**
* @ file
* Contains \Drupal\comment\Tests\CommentTestBase .
*/
namespace Drupal\comment\Tests ;
use Drupal\comment\Entity\CommentType ;
use Drupal\comment\Entity\Comment ;
use Drupal\comment\CommentInterface ;
use Drupal\field\Entity\FieldConfig ;
use Drupal\comment\Plugin\Field\FieldType\CommentItemInterface ;
use Drupal\node\Entity\NodeType ;
use Drupal\simpletest\WebTestBase ;
/**
* Provides setup and helper methods for comment tests .
*/
abstract class CommentTestBase extends WebTestBase {
use CommentTestTrait ;
/**
* Modules to install .
*
* @ var array
*/
2015-09-04 13:20:09 -07:00
public static $modules = [ 'block' , 'comment' , 'node' , 'history' , 'field_ui' , 'datetime' ];
2015-08-17 17:00:26 -07:00
/**
* An administrative user with permission to configure comment settings .
*
* @ var \Drupal\user\UserInterface
*/
protected $adminUser ;
/**
* A normal user with permission to post comments .
*
* @ var \Drupal\user\UserInterface
*/
protected $webUser ;
/**
* A test node to which comments will be posted .
*
* @ var \Drupal\node\NodeInterface
*/
protected $node ;
protected function setUp () {
parent :: setUp ();
// Create an article content type only if it does not yet exist, so that
// child classes may specify the standard profile.
$types = NodeType :: loadMultiple ();
if ( empty ( $types [ 'article' ])) {
$this -> drupalCreateContentType ( array ( 'type' => 'article' , 'name' => t ( 'Article' )));
}
// Create two test users.
$this -> adminUser = $this -> drupalCreateUser ( array (
'administer content types' ,
'administer comments' ,
'administer comment types' ,
'administer comment fields' ,
'administer comment display' ,
'skip comment approval' ,
'post comments' ,
'access comments' ,
2015-10-08 11:40:12 -07:00
// Usernames aren't shown in comment edit form autocomplete unless this
// permission is granted.
'access user profiles' ,
2015-08-17 17:00:26 -07:00
'access content' ,
));
$this -> webUser = $this -> drupalCreateUser ( array (
'access comments' ,
'post comments' ,
'create article content' ,
'edit own comments' ,
'skip comment approval' ,
'access content' ,
));
// Create comment field on article.
$this -> addDefaultCommentField ( 'node' , 'article' );
// Create a test node authored by the web user.
$this -> node = $this -> drupalCreateNode ( array ( 'type' => 'article' , 'promote' => 1 , 'uid' => $this -> webUser -> id ()));
2015-09-04 13:20:09 -07:00
$this -> drupalPlaceBlock ( 'local_tasks_block' );
2015-08-17 17:00:26 -07:00
}
/**
* Posts a comment .
*
* @ param \Drupal\Core\Entity\EntityInterface | null $entity
* Node to post comment on or NULL to post to the previously loaded page .
* @ param string $comment
* Comment body .
* @ param string $subject
* Comment subject .
* @ param string $contact
* Set to NULL for no contact info , TRUE to ignore success checking , and
* array of values to set contact info .
* @ param string $field_name
* ( optional ) Field name through which the comment should be posted .
* Defaults to 'comment' .
*
* @ return \Drupal\comment\CommentInterface | null
* The posted comment or NULL when posted comment was not found .
*/
public function postComment ( $entity , $comment , $subject = '' , $contact = NULL , $field_name = 'comment' ) {
$edit = array ();
$edit [ 'comment_body[0][value]' ] = $comment ;
if ( $entity !== NULL ) {
$field = FieldConfig :: loadByName ( 'node' , $entity -> bundle (), $field_name );
}
else {
$field = FieldConfig :: loadByName ( 'node' , 'article' , $field_name );
}
$preview_mode = $field -> getSetting ( 'preview' );
// Must get the page before we test for fields.
if ( $entity !== NULL ) {
$this -> drupalGet ( 'comment/reply/node/' . $entity -> id () . '/' . $field_name );
}
// Determine the visibility of subject form field.
if ( entity_get_form_display ( 'comment' , 'comment' , 'default' ) -> getComponent ( 'subject' )) {
// Subject input allowed.
$edit [ 'subject[0][value]' ] = $subject ;
}
else {
$this -> assertNoFieldByName ( 'subject[0][value]' , '' , 'Subject field not found.' );
}
if ( $contact !== NULL && is_array ( $contact )) {
$edit += $contact ;
}
switch ( $preview_mode ) {
case DRUPAL_REQUIRED :
// Preview required so no save button should be found.
$this -> assertNoFieldByName ( 'op' , t ( 'Save' ), 'Save button not found.' );
$this -> drupalPostForm ( NULL , $edit , t ( 'Preview' ));
// Don't break here so that we can test post-preview field presence and
// function below.
case DRUPAL_OPTIONAL :
$this -> assertFieldByName ( 'op' , t ( 'Preview' ), 'Preview button found.' );
$this -> assertFieldByName ( 'op' , t ( 'Save' ), 'Save button found.' );
$this -> drupalPostForm ( NULL , $edit , t ( 'Save' ));
break ;
case DRUPAL_DISABLED :
$this -> assertNoFieldByName ( 'op' , t ( 'Preview' ), 'Preview button not found.' );
$this -> assertFieldByName ( 'op' , t ( 'Save' ), 'Save button found.' );
$this -> drupalPostForm ( NULL , $edit , t ( 'Save' ));
break ;
}
$match = array ();
// Get comment ID
preg_match ( '/#comment-([0-9]+)/' , $this -> getURL (), $match );
// Get comment.
if ( $contact !== TRUE ) { // If true then attempting to find error message.
if ( $subject ) {
$this -> assertText ( $subject , 'Comment subject posted.' );
}
$this -> assertText ( $comment , 'Comment body posted.' );
$this -> assertTrue (( ! empty ( $match ) && ! empty ( $match [ 1 ])), 'Comment id found.' );
}
if ( isset ( $match [ 1 ])) {
\Drupal :: entityManager () -> getStorage ( 'comment' ) -> resetCache ( array ( $match [ 1 ]));
return Comment :: load ( $match [ 1 ]);
}
}
/**
* Checks current page for specified comment .
*
* @ param \Drupal\comment\CommentInterface $comment
* The comment object .
* @ param bool $reply
* Boolean indicating whether the comment is a reply to another comment .
*
2015-08-27 12:03:05 -07:00
* @ return bool
2015-08-17 17:00:26 -07:00
* Boolean indicating whether the comment was found .
*/
function commentExists ( CommentInterface $comment = NULL , $reply = FALSE ) {
if ( $comment ) {
2015-10-08 11:40:12 -07:00
$comment_element = $this -> cssSelect ( '.comment-wrapper ' . ( $reply ? '.indented ' : '' ) . '#comment-' . $comment -> id () . ' ~ article' );
if ( empty ( $comment_element )) {
return FALSE ;
}
$comment_title = $comment_element [ 0 ] -> xpath ( 'div/h3/a' );
if ( empty ( $comment_title ) || (( string ) $comment_title [ 0 ]) !== $comment -> getSubject ()) {
return FALSE ;
}
$comment_body = $comment_element [ 0 ] -> xpath ( 'div/div/p' );
if ( empty ( $comment_body ) || (( string ) $comment_body [ 0 ]) !== $comment -> comment_body -> value ) {
return FALSE ;
}
return TRUE ;
2015-08-17 17:00:26 -07:00
}
else {
return FALSE ;
}
}
/**
* Deletes a comment .
*
* @ param \Drupal\comment\CommentInterface $comment
* Comment to delete .
*/
function deleteComment ( CommentInterface $comment ) {
$this -> drupalPostForm ( 'comment/' . $comment -> id () . '/delete' , array (), t ( 'Delete' ));
$this -> assertText ( t ( 'The comment and all its replies have been deleted.' ), 'Comment deleted.' );
}
/**
* Sets the value governing whether the subject field should be enabled .
*
* @ param bool $enabled
* Boolean specifying whether the subject field should be enabled .
*/
public function setCommentSubject ( $enabled ) {
$form_display = entity_get_form_display ( 'comment' , 'comment' , 'default' );
if ( $enabled ) {
$form_display -> setComponent ( 'subject' , array (
'type' => 'string_textfield' ,
));
}
else {
$form_display -> removeComponent ( 'subject' );
}
$form_display -> save ();
// Display status message.
$this -> pass ( 'Comment subject ' . ( $enabled ? 'enabled' : 'disabled' ) . '.' );
}
/**
* Sets the value governing the previewing mode for the comment form .
*
* @ param int $mode
* The preview mode : DRUPAL_DISABLED , DRUPAL_OPTIONAL or DRUPAL_REQUIRED .
* @ param string $field_name
* ( optional ) Field name through which the comment should be posted .
* Defaults to 'comment' .
*/
public function setCommentPreview ( $mode , $field_name = 'comment' ) {
switch ( $mode ) {
case DRUPAL_DISABLED :
$mode_text = 'disabled' ;
break ;
case DRUPAL_OPTIONAL :
$mode_text = 'optional' ;
break ;
case DRUPAL_REQUIRED :
$mode_text = 'required' ;
break ;
}
$this -> setCommentSettings ( 'preview' , $mode , format_string ( 'Comment preview @mode_text.' , array ( '@mode_text' => $mode_text )), $field_name );
}
/**
* Sets the value governing whether the comment form is on its own page .
*
* @ param bool $enabled
* TRUE if the comment form should be displayed on the same page as the
* comments ; FALSE if it should be displayed on its own page .
* @ param string $field_name
* ( optional ) Field name through which the comment should be posted .
* Defaults to 'comment' .
*/
public function setCommentForm ( $enabled , $field_name = 'comment' ) {
$this -> setCommentSettings ( 'form_location' , ( $enabled ? CommentItemInterface :: FORM_BELOW : CommentItemInterface :: FORM_SEPARATE_PAGE ), 'Comment controls ' . ( $enabled ? 'enabled' : 'disabled' ) . '.' , $field_name );
}
/**
* Sets the value governing restrictions on anonymous comments .
*
2016-01-06 16:31:26 -08:00
* @ param int $level
2015-08-17 17:00:26 -07:00
* The level of the contact information allowed for anonymous comments :
* - 0 : No contact information allowed .
* - 1 : Contact information allowed but not required .
* - 2 : Contact information required .
*/
function setCommentAnonymous ( $level ) {
$this -> setCommentSettings ( 'anonymous' , $level , format_string ( 'Anonymous commenting set to level @level.' , array ( '@level' => $level )));
}
/**
* Sets the value specifying the default number of comments per page .
*
* @ param int $number
* Comments per page value .
* @ param string $field_name
* ( optional ) Field name through which the comment should be posted .
* Defaults to 'comment' .
*/
public function setCommentsPerPage ( $number , $field_name = 'comment' ) {
$this -> setCommentSettings ( 'per_page' , $number , format_string ( 'Number of comments per page set to @number.' , array ( '@number' => $number )), $field_name );
}
/**
* Sets a comment settings variable for the article content type .
*
* @ param string $name
* Name of variable .
* @ param string $value
* Value of variable .
* @ param string $message
* Status message to display .
* @ param string $field_name
* ( optional ) Field name through which the comment should be posted .
* Defaults to 'comment' .
*/
public function setCommentSettings ( $name , $value , $message , $field_name = 'comment' ) {
$field = FieldConfig :: loadByName ( 'node' , 'article' , $field_name );
$field -> setSetting ( $name , $value );
$field -> save ();
// Display status message.
$this -> pass ( $message );
}
/**
* Checks whether the commenter ' s contact information is displayed .
*
2015-08-27 12:03:05 -07:00
* @ return bool
2015-08-17 17:00:26 -07:00
* Contact info is available .
*/
function commentContactInfoAvailable () {
return preg_match ( '/(input).*?(name="name").*?(input).*?(name="mail").*?(input).*?(name="homepage")/s' , $this -> getRawContent ());
}
/**
* Performs the specified operation on the specified comment .
*
* @ param \Drupal\comment\CommentInterface $comment
* Comment to perform operation on .
* @ param string $operation
* Operation to perform .
* @ param bool $approval
* Operation is found on approval page .
*/
function performCommentOperation ( CommentInterface $comment , $operation , $approval = FALSE ) {
$edit = array ();
$edit [ 'operation' ] = $operation ;
$edit [ 'comments[' . $comment -> id () . ']' ] = TRUE ;
$this -> drupalPostForm ( 'admin/content/comment' . ( $approval ? '/approval' : '' ), $edit , t ( 'Update' ));
if ( $operation == 'delete' ) {
$this -> drupalPostForm ( NULL , array (), t ( 'Delete comments' ));
$this -> assertRaw ( \Drupal :: translation () -> formatPlural ( 1 , 'Deleted 1 comment.' , 'Deleted @count comments.' ), format_string ( 'Operation "@operation" was performed on comment.' , array ( '@operation' => $operation )));
}
else {
$this -> assertText ( t ( 'The update has been performed.' ), format_string ( 'Operation "@operation" was performed on comment.' , array ( '@operation' => $operation )));
}
}
/**
* Gets the comment ID for an unapproved comment .
*
* @ param string $subject
* Comment subject to find .
*
2016-01-06 16:31:26 -08:00
* @ return int
2015-08-17 17:00:26 -07:00
* Comment id .
*/
function getUnapprovedComment ( $subject ) {
$this -> drupalGet ( 'admin/content/comment/approval' );
preg_match ( '/href="(.*?)#comment-([^"]+)"(.*?)>(' . $subject . ')/' , $this -> getRawContent (), $match );
return $match [ 2 ];
}
/**
* Creates a comment comment type ( bundle ) .
*
* @ param string $label
* The comment type label .
*
* @ return \Drupal\comment\Entity\CommentType
* Created comment type .
*/
protected function createCommentType ( $label ) {
$bundle = CommentType :: create ( array (
'id' => $label ,
'label' => $label ,
'description' => '' ,
'target_entity_type_id' => 'node' ,
));
$bundle -> save ();
return $bundle ;
}
}