Unverified Commit 7ba77154 authored by larowlan's avatar larowlan

Issue #2863644 by Lendude, zviryatko, Manuel Garcia, Jo Fitzgerald: Convert web tests of block

parent 69edc2a3
...@@ -2,11 +2,18 @@ ...@@ -2,11 +2,18 @@
namespace Drupal\block\Tests; namespace Drupal\block\Tests;
@trigger_error(__NAMESPACE__ . '\BlockTestBase is deprecated in Drupal 8.5.0 and will be removed before Drupal 9.0.0. Instead, use \Drupal\Tests\block\Functional\BlockTestBase, see https://www.drupal.org/node/2901823.', E_USER_DEPRECATED);
use Drupal\simpletest\WebTestBase; use Drupal\simpletest\WebTestBase;
use Drupal\filter\Entity\FilterFormat; use Drupal\filter\Entity\FilterFormat;
/** /**
* Provides setup and helper methods for block module tests. * Provides setup and helper methods for block module tests.
*
* @deprecated in Drupal 8.5.0 and will be removed before Drupal 9.0.0.
* Use \Drupal\Tests\block\Functional\BlockTestBase.
*
* @see https://www.drupal.org/node/2901823
*/ */
abstract class BlockTestBase extends WebTestBase { abstract class BlockTestBase extends WebTestBase {
......
<?php
namespace Drupal\Tests\block\Functional;
use Drupal\block\Entity\Block;
use Drupal\Component\Render\FormattableMarkup;
/**
* Provides test assertions for testing block appearance.
*
* Can be used by test classes that extend \Drupal\Tests\BrowserTestBase.
*/
trait AssertBlockAppearsTrait {
/**
* Checks to see whether a block appears on the page.
*
* @param \Drupal\block\Entity\Block $block
* The block entity to find on the page.
*/
protected function assertBlockAppears(Block $block) {
$result = $this->findBlockInstance($block);
$this->assertTrue(!empty($result), new FormattableMarkup('Ensure the block @id appears on the page', ['@id' => $block->id()]));
}
/**
* Checks to see whether a block does not appears on the page.
*
* @param \Drupal\block\Entity\Block $block
* The block entity to find on the page.
*/
protected function assertNoBlockAppears(Block $block) {
$result = $this->findBlockInstance($block);
$this->assertFalse(!empty($result), new FormattableMarkup('Ensure the block @id does not appear on the page', ['@id' => $block->id()]));
}
/**
* Find a block instance on the page.
*
* @param \Drupal\block\Entity\Block $block
* The block entity to find on the page.
*
* @return array
* The result from the xpath query.
*/
protected function findBlockInstance(Block $block) {
return $this->xpath('//div[@id = :id]', [':id' => 'block-' . $block->id()]);
}
}
<?php <?php
namespace Drupal\block\Tests; namespace Drupal\Tests\block\Functional;
use Drupal\simpletest\WebTestBase; use Drupal\Tests\BrowserTestBase;
/** /**
* Tests the block system with admin themes. * Tests the block system with admin themes.
* *
* @group block * @group block
*/ */
class BlockAdminThemeTest extends WebTestBase { class BlockAdminThemeTest extends BrowserTestBase {
/** /**
* Modules to install. * Modules to install.
......
<?php <?php
namespace Drupal\block\Tests; namespace Drupal\Tests\block\Functional;
use Drupal\Component\Utility\Crypt; use Drupal\Component\Utility\Crypt;
use Drupal\simpletest\WebTestBase; use Drupal\Tests\BrowserTestBase;
/** /**
...@@ -11,7 +11,7 @@ ...@@ -11,7 +11,7 @@
* *
* @group block * @group block
*/ */
class BlockFormInBlockTest extends WebTestBase { class BlockFormInBlockTest extends BrowserTestBase {
/** /**
* Modules to install. * Modules to install.
......
<?php <?php
namespace Drupal\block\Tests; namespace Drupal\Tests\block\Functional;
use Drupal\simpletest\WebTestBase; use Drupal\Tests\BrowserTestBase;
/** /**
* Tests block module's installation. * Tests block module's installation.
* *
* @group block * @group block
*/ */
class BlockInstallTest extends WebTestBase { class BlockInstallTest extends BrowserTestBase {
public function testCacheTagInvalidationUponInstallation() { public function testCacheTagInvalidationUponInstallation() {
// Warm the page cache. // Warm the page cache.
......
<?php <?php
namespace Drupal\block\Tests; namespace Drupal\Tests\block\Functional;
use Drupal\Component\Utility\Unicode; use Drupal\Component\Utility\Unicode;
use Drupal\language\Entity\ConfigurableLanguage; use Drupal\language\Entity\ConfigurableLanguage;
use Drupal\simpletest\WebTestBase; use Drupal\Tests\BrowserTestBase;
/** /**
* Tests display of menu blocks with multiple languages. * Tests display of menu blocks with multiple languages.
* *
* @group block * @group block
*/ */
class BlockLanguageCacheTest extends WebTestBase { class BlockLanguageCacheTest extends BrowserTestBase {
/** /**
* Modules to install. * Modules to install.
...@@ -57,7 +57,7 @@ public function testBlockLinks() { ...@@ -57,7 +57,7 @@ public function testBlockLinks() {
// Create the block cache for all languages. // Create the block cache for all languages.
foreach ($this->langcodes as $langcode) { foreach ($this->langcodes as $langcode) {
$this->drupalGet('admin/structure/block', ['language' => $langcode]); $this->drupalGet('admin/structure/block', ['language' => $langcode]);
$this->clickLinkPartialName('Place block'); $this->clickLink('Place block');
} }
// Create a menu in the default language. // Create a menu in the default language.
...@@ -69,7 +69,7 @@ public function testBlockLinks() { ...@@ -69,7 +69,7 @@ public function testBlockLinks() {
// Check that the block is listed for all languages. // Check that the block is listed for all languages.
foreach ($this->langcodes as $langcode) { foreach ($this->langcodes as $langcode) {
$this->drupalGet('admin/structure/block', ['language' => $langcode]); $this->drupalGet('admin/structure/block', ['language' => $langcode]);
$this->clickLinkPartialName('Place block'); $this->clickLink('Place block');
$this->assertText($edit['label']); $this->assertText($edit['label']);
} }
} }
......
<?php <?php
namespace Drupal\block\Tests; namespace Drupal\Tests\block\Functional;
use Drupal\Component\Utility\Html; use Drupal\Component\Utility\Html;
use Drupal\simpletest\WebTestBase; use Drupal\Tests\BrowserTestBase;
/** /**
* Tests blocks are being rendered in order by weight. * Tests blocks are being rendered in order by weight.
* *
* @group block * @group block
*/ */
class BlockRenderOrderTest extends WebTestBase { class BlockRenderOrderTest extends BrowserTestBase {
/** /**
* Modules to install. * Modules to install.
......
<?php <?php
namespace Drupal\block\Tests; namespace Drupal\Tests\block\Functional;
/** /**
* Tests branding block display. * Tests branding block display.
...@@ -54,7 +54,7 @@ public function testSystemBrandingSettings() { ...@@ -54,7 +54,7 @@ public function testSystemBrandingSettings() {
->save(); ->save();
$this->drupalGet(''); $this->drupalGet('');
$site_slogan_element = $this->xpath($site_slogan_xpath); $site_slogan_element = $this->xpath($site_slogan_xpath);
$this->assertEqual($site_slogan_element[0], 'alert("Community carpentry");', 'The site slogan was XSS-filtered.'); $this->assertEqual($site_slogan_element[0]->getText(), 'alert("Community carpentry");', 'The site slogan was XSS-filtered.');
// Turn just the logo off. // Turn just the logo off.
$this->config('block.block.site-branding') $this->config('block.block.site-branding')
......
<?php <?php
namespace Drupal\block\Tests; namespace Drupal\Tests\block\Functional;
use Drupal\Component\Utility\Html; use Drupal\Component\Utility\Html;
use Drupal\block\Entity\Block; use Drupal\block\Entity\Block;
...@@ -150,9 +150,9 @@ public function testAddBlockFromLibraryWithWeight() { ...@@ -150,9 +150,9 @@ public function testAddBlockFromLibraryWithWeight() {
]); ]);
$links = $this->xpath('//a[contains(@href, :href)]', [':href' => $add_url->toString()]); $links = $this->xpath('//a[contains(@href, :href)]', [':href' => $add_url->toString()]);
$this->assertEqual(1, count($links), 'Found one matching link.'); $this->assertEqual(1, count($links), 'Found one matching link.');
$this->assertEqual(t('Place block'), (string) $links[0], 'Found the expected link text.'); $this->assertEqual(t('Place block'), $links[0]->getText(), 'Found the expected link text.');
list($path, $query_string) = explode('?', $links[0]['href'], 2); list($path, $query_string) = explode('?', $links[0]->getAttribute('href'), 2);
parse_str($query_string, $query_parts); parse_str($query_string, $query_parts);
$this->assertEqual($weight, $query_parts['weight'], 'Found the expected weight query string.'); $this->assertEqual($weight, $query_parts['weight'], 'Found the expected weight query string.');
...@@ -164,7 +164,7 @@ public function testAddBlockFromLibraryWithWeight() { ...@@ -164,7 +164,7 @@ public function testAddBlockFromLibraryWithWeight() {
'settings[label]' => $title, 'settings[label]' => $title,
]; ];
// Create the block using the link parsed from the library page. // Create the block using the link parsed from the library page.
$this->drupalPostForm($this->getAbsoluteUrl($links[0]['href']), $edit, t('Save block')); $this->drupalPostForm($this->getAbsoluteUrl($links[0]->getAttribute('href')), $edit, t('Save block'));
// Ensure that the block was created with the expected weight. // Ensure that the block was created with the expected weight.
/** @var \Drupal\block\BlockInterface $block */ /** @var \Drupal\block\BlockInterface $block */
......
<?php
namespace Drupal\Tests\block\Functional;
use Drupal\filter\Entity\FilterFormat;
use Drupal\Tests\BrowserTestBase;
/**
* Provides setup and helper methods for block module tests.
*/
abstract class BlockTestBase extends BrowserTestBase {
/**
* Modules to install.
*
* @var array
*/
public static $modules = ['block', 'filter', 'test_page_test', 'help', 'block_test'];
/**
* A list of theme regions to test.
*
* @var array
*/
protected $regions;
/**
* A test user with administrative privileges.
*
* @var \Drupal\user\UserInterface
*/
protected $adminUser;
/**
* {@inheritdoc}
*/
protected function setUp() {
parent::setUp();
// Use the test page as the front page.
$this->config('system.site')->set('page.front', '/test-page')->save();
// Create Full HTML text format.
$full_html_format = FilterFormat::create([
'format' => 'full_html',
'name' => 'Full HTML',
]);
$full_html_format->save();
// Create and log in an administrative user having access to the Full HTML
// text format.
$this->adminUser = $this->drupalCreateUser([
'administer blocks',
$full_html_format->getPermissionName(),
'access administration pages',
]);
$this->drupalLogin($this->adminUser);
// Define the existing regions.
$this->regions = [
'header',
'sidebar_first',
'content',
'sidebar_second',
'footer',
];
$block_storage = $this->container->get('entity_type.manager')->getStorage('block');
$blocks = $block_storage->loadByProperties(['theme' => $this->config('system.theme')->get('default')]);
foreach ($blocks as $block) {
$block->delete();
}
}
}
<?php <?php
namespace Drupal\block\Tests; namespace Drupal\Tests\block\Functional;
use Drupal\Component\Utility\Html; use Drupal\Component\Utility\Html;
use Drupal\simpletest\WebTestBase; use Drupal\Tests\BrowserTestBase;
/** /**
* Tests that the block configuration UI exists and stores data correctly. * Tests that the block configuration UI exists and stores data correctly.
* *
* @group block * @group block
*/ */
class BlockUiTest extends WebTestBase { class BlockUiTest extends BrowserTestBase {
/** /**
* Modules to install. * Modules to install.
...@@ -105,7 +105,7 @@ public function testBlockAdminUiPage() { ...@@ -105,7 +105,7 @@ public function testBlockAdminUiPage() {
$block = $this->blocks[$delta]; $block = $this->blocks[$delta];
$label = $block->label(); $label = $block->label();
$element = $this->xpath('//*[@id="blocks"]/tbody/tr[' . $values['tr'] . ']/td[1]/text()'); $element = $this->xpath('//*[@id="blocks"]/tbody/tr[' . $values['tr'] . ']/td[1]/text()');
$this->assertTrue((string) $element[0] == $label, 'The "' . $label . '" block title is set inside the ' . $values['settings']['region'] . ' region.'); $this->assertEquals($element[0]->getText(), $label, 'The "' . $label . '" block title is set inside the ' . $values['settings']['region'] . ' region.');
// Look for a test block region select form element. // Look for a test block region select form element.
$this->assertField('blocks[' . $values['settings']['id'] . '][region]', 'The block "' . $values['label'] . '" has a region assignment field.'); $this->assertField('blocks[' . $values['settings']['id'] . '][region]', 'The block "' . $values['label'] . '" has a region assignment field.');
// Move the test block to the header region. // Move the test block to the header region.
...@@ -171,7 +171,7 @@ public function testCandidateBlockList() { ...@@ -171,7 +171,7 @@ public function testCandidateBlockList() {
$pattern = '//tr[.//td/div[text()=:title] and .//td[text()=:category] and .//td//a[contains(@href, :href)]]'; $pattern = '//tr[.//td/div[text()=:title] and .//td[text()=:category] and .//td//a[contains(@href, :href)]]';
$this->drupalGet('admin/structure/block'); $this->drupalGet('admin/structure/block');
$this->clickLinkPartialName('Place block'); $this->clickLink('Place block');
$elements = $this->xpath($pattern, $arguments); $elements = $this->xpath($pattern, $arguments);
$this->assertTrue(!empty($elements), 'The test block appears in the category for its module.'); $this->assertTrue(!empty($elements), 'The test block appears in the category for its module.');
...@@ -180,7 +180,7 @@ public function testCandidateBlockList() { ...@@ -180,7 +180,7 @@ public function testCandidateBlockList() {
$this->container->get('plugin.manager.block')->clearCachedDefinitions(); $this->container->get('plugin.manager.block')->clearCachedDefinitions();
$this->drupalGet('admin/structure/block'); $this->drupalGet('admin/structure/block');
$this->clickLinkPartialName('Place block'); $this->clickLink('Place block');
$arguments[':category'] = 'Custom category'; $arguments[':category'] = 'Custom category';
$elements = $this->xpath($pattern, $arguments); $elements = $this->xpath($pattern, $arguments);
$this->assertTrue(!empty($elements), 'The test block appears in a custom category controlled by block_test_block_alter().'); $this->assertTrue(!empty($elements), 'The test block appears in a custom category controlled by block_test_block_alter().');
...@@ -197,7 +197,7 @@ public function testContextAwareUnsatisfiedBlocks() { ...@@ -197,7 +197,7 @@ public function testContextAwareUnsatisfiedBlocks() {
]; ];
$this->drupalGet('admin/structure/block'); $this->drupalGet('admin/structure/block');
$this->clickLinkPartialName('Place block'); $this->clickLink('Place block');
$elements = $this->xpath('//tr[.//td/div[text()=:text] and .//td[text()=:category] and .//td//a[contains(@href, :href)]]', $arguments); $elements = $this->xpath('//tr[.//td/div[text()=:text] and .//td[text()=:category] and .//td//a[contains(@href, :href)]]', $arguments);
$this->assertTrue(empty($elements), 'The context-aware test block does not appear.'); $this->assertTrue(empty($elements), 'The context-aware test block does not appear.');
...@@ -223,7 +223,7 @@ public function testContextAwareBlocks() { ...@@ -223,7 +223,7 @@ public function testContextAwareBlocks() {
$pattern = '//tr[.//td/div[text()=:title] and .//td[text()=:category] and .//td//a[contains(@href, :href)]]'; $pattern = '//tr[.//td/div[text()=:title] and .//td[text()=:category] and .//td//a[contains(@href, :href)]]';
$this->drupalGet('admin/structure/block'); $this->drupalGet('admin/structure/block');
$this->clickLinkPartialName('Place block'); $this->clickLink('Place block');
$elements = $this->xpath($pattern, $arguments); $elements = $this->xpath($pattern, $arguments);
$this->assertTrue(!empty($elements), 'The context-aware test block appears.'); $this->assertTrue(!empty($elements), 'The context-aware test block appears.');
$definition = \Drupal::service('plugin.manager.block')->getDefinition('test_context_aware'); $definition = \Drupal::service('plugin.manager.block')->getDefinition('test_context_aware');
......
<?php <?php
namespace Drupal\block\Tests; namespace Drupal\Tests\block\Functional;
use Drupal\block_content\Entity\BlockContent; use Drupal\block_content\Entity\BlockContent;
use Drupal\block_content\Entity\BlockContentType; use Drupal\block_content\Entity\BlockContentType;
use Drupal\Core\Url; use Drupal\Core\Url;
use Drupal\simpletest\WebTestBase;
use Drupal\system\Entity\Menu; use Drupal\system\Entity\Menu;
use Drupal\Tests\BrowserTestBase;
use Drupal\views\Entity\View; use Drupal\views\Entity\View;
/** /**
...@@ -14,7 +14,7 @@ ...@@ -14,7 +14,7 @@
* *
* @group block * @group block
*/ */
class BlockXssTest extends WebTestBase { class BlockXssTest extends BrowserTestBase {
/** /**
* Modules to install. * Modules to install.
...@@ -29,7 +29,7 @@ class BlockXssTest extends WebTestBase { ...@@ -29,7 +29,7 @@ class BlockXssTest extends WebTestBase {
public function testNoUnexpectedEscaping() { public function testNoUnexpectedEscaping() {
$this->drupalLogin($this->drupalCreateUser(['administer blocks', 'access administration pages'])); $this->drupalLogin($this->drupalCreateUser(['administer blocks', 'access administration pages']));
$this->drupalGet(Url::fromRoute('block.admin_display')); $this->drupalGet(Url::fromRoute('block.admin_display'));
$this->clickLinkPartialName('Place block'); $this->clickLink('Place block');
$this->assertNoEscaped('<'); $this->assertNoEscaped('<');
} }
...@@ -58,7 +58,7 @@ public function testXssInCategory() { ...@@ -58,7 +58,7 @@ public function testXssInCategory() {
$this->drupalPlaceBlock('test_xss_title'); $this->drupalPlaceBlock('test_xss_title');
$this->drupalLogin($this->drupalCreateUser(['administer blocks', 'access administration pages'])); $this->drupalLogin($this->drupalCreateUser(['administer blocks', 'access administration pages']));
$this->drupalGet(Url::fromRoute('block.admin_display')); $this->drupalGet(Url::fromRoute('block.admin_display'));
$this->clickLinkPartialName('Place block'); $this->clickLink('Place block');
$this->assertNoRaw("<script>alert('XSS category');</script>"); $this->assertNoRaw("<script>alert('XSS category');</script>");
} }
...@@ -73,7 +73,7 @@ public function testBlockXss() { ...@@ -73,7 +73,7 @@ public function testBlockXss() {
$this->doBlockContentTest(); $this->doBlockContentTest();
$this->drupalGet(Url::fromRoute('block.admin_display')); $this->drupalGet(Url::fromRoute('block.admin_display'));
$this->clickLinkPartialName('Place block'); $this->clickLink('Place block');
$this->assertNoRaw('&amp;lt;', 'The page does not have double escaped HTML tags.'); $this->assertNoRaw('&amp;lt;', 'The page does not have double escaped HTML tags.');
} }
...@@ -101,7 +101,7 @@ protected function doViewTest() { ...@@ -101,7 +101,7 @@ protected function doViewTest() {
$view->save(); $view->save();
$this->drupalGet(Url::fromRoute('block.admin_display')); $this->drupalGet(Url::fromRoute('block.admin_display'));
$this->clickLinkPartialName('Place block'); $this->clickLink('Place block');
// \Drupal\views\Plugin\Derivative\ViewsBlock::getDerivativeDefinitions() // \Drupal\views\Plugin\Derivative\ViewsBlock::getDerivativeDefinitions()
// has a different code path for an admin label based only on the View // has a different code path for an admin label based only on the View
...@@ -137,7 +137,7 @@ protected function doMenuTest() { ...@@ -137,7 +137,7 @@ protected function doMenuTest() {
])->save(); ])->save();
$this->drupalGet(Url::fromRoute('block.admin_display')); $this->drupalGet(Url::fromRoute('block.admin_display'));
$this->clickLinkPartialName('Place block'); $this->clickLink('Place block');
$this->assertEscaped('<script>alert("menu");</script>'); $this->assertEscaped('<script>alert("menu");</script>');
$this->assertNoRaw('<script>alert("menu");</script>'); $this->assertNoRaw('<script>alert("menu");</script>');
...@@ -158,7 +158,7 @@ protected function doBlockContentTest() { ...@@ -158,7 +158,7 @@ protected function doBlockContentTest() {
])->save(); ])->save();
$this->drupalGet(Url::fromRoute('block.admin_display')); $this->drupalGet(Url::fromRoute('block.admin_display'));
$this->clickLinkPartialName('Place block'); $this->clickLink('Place block');
$this->assertEscaped('<script>alert("block_content");</script>'); $this->assertEscaped('<script>alert("block_content");</script>');
$this->assertNoRaw('<script>alert("block_content");</script>'); $this->assertNoRaw('<script>alert("block_content");</script>');
......
<?php <?php
namespace Drupal\block\Tests; namespace Drupal\Tests\block\Functional;
use Drupal\simpletest\WebTestBase; use Drupal\Tests\BrowserTestBase;
/** /**
* Tests the block administration page for a non-default theme. * Tests the block administration page for a non-default theme.
* *
* @group block * @group block
*/ */
class NonDefaultBlockAdminTest extends WebTestBase { class NonDefaultBlockAdminTest extends BrowserTestBase {
/** /**
* Modules to install. * Modules to install.
......
<?php <?php
namespace Drupal\block\Tests\Views; namespace Drupal\Tests\block\Functional\Views;
use Drupal\Component\Serialization\Json; use Drupal\Component\Serialization\Json;
use Drupal\Core\Url; use Drupal\Core\Url;
use Drupal\system\Tests\Cache\AssertPageCacheContextsAndTagsTrait; use Drupal\Tests\block\Functional\AssertBlockAppearsTrait;
use Drupal\Tests\system\Functional\Cache\AssertPageCacheContextsAndTagsTrait;
use Drupal\Tests\views\Functional\ViewTestBase;
use Drupal\views\Entity\View; use Drupal\views\Entity\View;
use Drupal\views\Views; use Drupal\views\Views;
use Drupal\views\Tests\ViewTestBase;
use Drupal\views\Tests\ViewTestData; use Drupal\views\Tests\ViewTestData;
use Drupal\Core\Template\Attribute; use Drupal\Core\Template\Attribute;
...@@ -15,11 +16,12 @@ ...@@ -15,11 +16,12 @@
* Tests the block display plugin. * Tests the block display plugin.
* *
* @group block * @group block
* @see \Drupal\block\Plugin\views\display\Block * @see \Drupal\views\Plugin\views\display\Block
*/ */
class DisplayBlockTest extends ViewTestBase { class DisplayBlockTest extends ViewTestBase {
use AssertPageCacheContextsAndTagsTrait; use AssertPageCacheContextsAndTagsTrait;
use AssertBlockAppearsTrait;
/** /**
* Modules to install. * Modules to install.
...@@ -35,8 +37,11 @@ class DisplayBlockTest extends ViewTestBase { ...@@ -35,8 +37,11 @@ class DisplayBlockTest extends ViewTestBase {
*/ */
public static $testViews = ['test_view_block', 'test_view_block2']; public static $testViews = ['test_view_block', 'test_view_block2'];
protected function setUp() { /**
parent::setUp(); * {@inheritdoc}
*/
protected function setUp($import_test_views = TRUE) {
parent::setUp($import_test_views);
ViewTestData::createTestViews(get_class($this), ['block_test_views']); ViewTestData::createTestViews(get_class($this), ['block_test_views']);
$this->enableViewsTestModule(); $this->enableViewsTestModule();
...@@ -67,10 +72,10 @@ public function testBlockCategory() { ...@@ -67,10 +72,10 @@ public function testBlockCategory() {
'plugin_id' => 'views_block:' . $edit['id'] . '-block_1', 'plugin_id' => 'views_block:' . $edit['id'] . '-block_1',
'theme' => 'classy', 'theme' => 'classy',
]), ]),
':category' => t('Lists (Views)'), ':category' => 'Lists (Views)',
]; ];
$this->drupalGet('admin/structure/block'); $this->drupalGet('admin/structure/block');
$this->clickLinkPartialName('Place block'); $this->clickLink('Place block');
$elements = $this->xpath($pattern, $arguments);