2015-08-17 17:00:26 -07:00
< ? php
namespace Drupal\standard\Tests ;
use Drupal\config\Tests\SchemaCheckTestTrait ;
use Drupal\contact\Entity\ContactForm ;
2015-10-08 11:40:12 -07:00
use Drupal\Core\Url ;
use Drupal\dynamic_page_cache\EventSubscriber\DynamicPageCacheSubscriber ;
2015-08-17 17:00:26 -07:00
use Drupal\filter\Entity\FilterFormat ;
use Drupal\simpletest\WebTestBase ;
use Drupal\user\Entity\Role ;
/**
* Tests Standard installation profile expectations .
*
* @ group standard
*/
class StandardTest extends WebTestBase {
use SchemaCheckTestTrait ;
protected $profile = 'standard' ;
/**
* The admin user .
*
* @ var \Drupal\user\UserInterface
*/
protected $adminUser ;
/**
* Tests Standard installation profile .
*/
function testStandard () {
$this -> drupalGet ( '' );
$this -> assertLink ( t ( 'Contact' ));
$this -> clickLink ( t ( 'Contact' ));
$this -> assertResponse ( 200 );
// Test anonymous user can access 'Main navigation' block.
$this -> adminUser = $this -> drupalCreateUser ( array (
'administer blocks' ,
'post comments' ,
'skip comment approval' ,
'create article content' ,
'create page content' ,
));
$this -> drupalLogin ( $this -> adminUser );
// Configure the block.
$this -> drupalGet ( 'admin/structure/block/add/system_menu_block:main/bartik' );
$this -> drupalPostForm ( NULL , array (
'region' => 'sidebar_first' ,
'id' => 'main_navigation' ,
), t ( 'Save block' ));
// Verify admin user can see the block.
$this -> drupalGet ( '' );
$this -> assertText ( 'Main navigation' );
// Verify we have role = aria on system_powered_by and help_block
// blocks.
$this -> drupalGet ( 'admin/structure/block' );
$elements = $this -> xpath ( '//div[@role=:role and @id=:id]' , array (
':role' => 'complementary' ,
':id' => 'block-bartik-help' ,
));
$this -> assertEqual ( count ( $elements ), 1 , 'Found complementary role on help block.' );
$this -> drupalGet ( '' );
$elements = $this -> xpath ( '//div[@role=:role and @id=:id]' , array (
':role' => 'complementary' ,
':id' => 'block-bartik-powered' ,
));
$this -> assertEqual ( count ( $elements ), 1 , 'Found complementary role on powered by block.' );
// Verify anonymous user can see the block.
$this -> drupalLogout ();
$this -> assertText ( 'Main navigation' );
// Ensure comments don't show in the front page RSS feed.
// Create an article.
$this -> drupalCreateNode ( array (
'type' => 'article' ,
'title' => 'Foobar' ,
'promote' => 1 ,
'status' => 1 ,
'body' => array ( array ( 'value' => 'Then she picked out two somebodies,<br />Sally and me' , 'format' => 'basic_html' )),
));
// Add a comment.
$this -> drupalLogin ( $this -> adminUser );
$this -> drupalGet ( 'node/1' );
$this -> assertRaw ( 'Then she picked out two somebodies,<br />Sally and me' , 'Found a line break.' );
$this -> drupalPostForm ( NULL , array (
'subject[0][value]' => 'Barfoo' ,
'comment_body[0][value]' => 'Then she picked out two somebodies, Sally and me' ,
), t ( 'Save' ));
// Fetch the feed.
$this -> drupalGet ( 'rss.xml' );
$this -> assertText ( 'Foobar' );
$this -> assertNoText ( 'Then she picked out two somebodies, Sally and me' );
// Ensure block body exists.
$this -> drupalGet ( 'block/add' );
$this -> assertFieldByName ( 'body[0][value]' );
// Now we have all configuration imported, test all of them for schema
// conformance. Ensures all imported default configuration is valid when
// standard profile modules are enabled.
$names = $this -> container -> get ( 'config.storage' ) -> listAll ();
/** @var \Drupal\Core\Config\TypedConfigManagerInterface $typed_config */
$typed_config = $this -> container -> get ( 'config.typed' );
foreach ( $names as $name ) {
$config = $this -> config ( $name );
$this -> assertConfigSchema ( $typed_config , $name , $config -> get ());
}
// Ensure that configuration from the Standard profile is not reused when
// enabling a module again since it contains configuration that can not be
// installed. For example, editor.editor.basic_html is editor configuration
// that depends on the ckeditor module. The ckeditor module can not be
// installed before the editor module since it depends on the editor module.
// The installer does not have this limitation since it ensures that all of
// the install profiles dependencies are installed before creating the
// editor configuration.
foreach ( FilterFormat :: loadMultiple () as $filter ) {
// Ensure that editor can be uninstalled by removing use in filter
// formats. It is necessary to prime the filter collection before removing
// the filter.
$filter -> filters ();
$filter -> removeFilter ( 'editor_file_reference' );
$filter -> save ();
}
\Drupal :: service ( 'module_installer' ) -> uninstall ( array ( 'editor' , 'ckeditor' ));
$this -> rebuildContainer ();
\Drupal :: service ( 'module_installer' ) -> install ( array ( 'editor' ));
/** @var \Drupal\contact\ContactFormInterface $contact_form */
$contact_form = ContactForm :: load ( 'feedback' );
$recipients = $contact_form -> getRecipients ();
$this -> assertEqual ([ 'simpletest@example.com' ], $recipients );
$role = Role :: create ([
'id' => 'admin_theme' ,
'label' => 'Admin theme' ,
]);
$role -> grantPermission ( 'view the administration theme' );
$role -> save ();
$this -> adminUser -> addRole ( $role -> id ());
$this -> adminUser -> save ();
$this -> drupalGet ( 'node/add' );
$this -> assertResponse ( 200 );
2015-08-27 12:03:05 -07:00
// Ensure that there are no pending updates after installation.
$this -> drupalLogin ( $this -> rootUser );
$this -> drupalGet ( 'update.php/selection' );
$this -> assertText ( 'No pending updates.' );
2015-08-17 17:00:26 -07:00
2015-09-04 13:20:09 -07:00
// Ensure that there are no pending entity updates after installation.
$this -> assertFalse ( $this -> container -> get ( 'entity.definition_update_manager' ) -> needsUpdates (), 'After installation, entity schema is up to date.' );
// Make sure the optional image styles are not installed.
$this -> drupalGet ( 'admin/config/media/image-styles' );
$this -> assertNoText ( 'Max 325x325' );
$this -> assertNoText ( 'Max 650x650' );
$this -> assertNoText ( 'Max 1300x1300' );
$this -> assertNoText ( 'Max 2600x2600' );
// Make sure the optional image styles are installed after enabling
// the responsive_image module.
\Drupal :: service ( 'module_installer' ) -> install ( array ( 'responsive_image' ));
$this -> rebuildContainer ();
$this -> drupalGet ( 'admin/config/media/image-styles' );
$this -> assertText ( 'Max 325x325' );
$this -> assertText ( 'Max 650x650' );
$this -> assertText ( 'Max 1300x1300' );
$this -> assertText ( 'Max 2600x2600' );
2015-10-08 11:40:12 -07:00
// Verify certain routes' responses are cacheable by Dynamic Page Cache, to
// ensure these responses are very fast for authenticated users.
$this -> dumpHeaders = TRUE ;
$this -> drupalLogin ( $this -> adminUser );
$url = Url :: fromRoute ( 'contact.site_page' );
$this -> drupalGet ( $url );
$this -> assertEqual ( 'UNCACHEABLE' , $this -> drupalGetHeader ( DynamicPageCacheSubscriber :: HEADER ), 'Site-wide contact page cannot be cached by Dynamic Page Cache.' );
$url = Url :: fromRoute ( '<front>' );
$this -> drupalGet ( $url );
$this -> drupalGet ( $url );
$this -> assertEqual ( 'HIT' , $this -> drupalGetHeader ( DynamicPageCacheSubscriber :: HEADER ), 'Frontpage is cached by Dynamic Page Cache.' );
// @todo uncomment after https://www.drupal.org/node/2543334 has landed.
//url = Url::fromRoute('entity.node.canonical', ['node' => 1]);
//$this->drupalGet($url);
//$this->drupalGet($url);
//$this->assertEqual('HIT', $this->drupalGetHeader(DynamicPageCacheSubscriber::HEADER), 'Full node page is cached by Dynamic Page Cache.');
$url = Url :: fromRoute ( 'entity.user.canonical' , [ 'user' => 1 ]);
$this -> drupalGet ( $url );
$this -> drupalGet ( $url );
$this -> assertEqual ( 'HIT' , $this -> drupalGetHeader ( DynamicPageCacheSubscriber :: HEADER ), 'User profile page is cached by Dynamic Page Cache.' );
2015-09-04 13:20:09 -07:00
}
2015-08-17 17:00:26 -07:00
}