summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNathaniel Catchpole2017-09-18 10:44:29 (GMT)
committerNathaniel Catchpole2017-09-18 10:44:29 (GMT)
commit1f628331a3a61d6b5b3710b7b7c9e8157d688433 (patch)
tree7067f2f07356b3546df49eae3199ceb23226ef4f
parent465348f98d931c195f5ddd292264c9f23233cd47 (diff)
Issue #2902191 by tedbow, vaplas, xjm, droplet, drpal: Determine cause and fix random fail in \Drupal\Tests\settings_tray\FunctionalJavascript\SettingsTrayBlockFormTest::testBlocks
-rw-r--r--core/modules/settings_tray/tests/src/FunctionalJavascript/SettingsTrayBlockFormTest.php253
-rw-r--r--core/modules/settings_tray/tests/src/FunctionalJavascript/SettingsTrayJavascriptTestBase.php30
2 files changed, 156 insertions, 127 deletions
diff --git a/core/modules/settings_tray/tests/src/FunctionalJavascript/SettingsTrayBlockFormTest.php b/core/modules/settings_tray/tests/src/FunctionalJavascript/SettingsTrayBlockFormTest.php
index d2881eb..342fbca 100644
--- a/core/modules/settings_tray/tests/src/FunctionalJavascript/SettingsTrayBlockFormTest.php
+++ b/core/modules/settings_tray/tests/src/FunctionalJavascript/SettingsTrayBlockFormTest.php
@@ -66,144 +66,151 @@ class SettingsTrayBlockFormTest extends SettingsTrayJavascriptTestBase {
*
* @dataProvider providerTestBlocks
*/
- public function testBlocks($block_plugin, $new_page_text, $element_selector, $label_selector, $button_text, $toolbar_item) {
+ public function testBlocks($theme, $block_plugin, $new_page_text, $element_selector, $label_selector, $button_text, $toolbar_item) {
$web_assert = $this->assertSession();
$page = $this->getSession()->getPage();
- foreach ($this->getTestThemes() as $theme) {
- $this->enableTheme($theme);
- $block = $this->placeBlock($block_plugin);
- $block_selector = str_replace('_', '-', $this->getBlockSelector($block));
- $block_id = $block->id();
- $this->drupalGet('user');
+ $this->enableTheme($theme);
+ $block = $this->placeBlock($block_plugin);
+ $block_selector = str_replace('_', '-', $this->getBlockSelector($block));
+ $block_id = $block->id();
+ $this->drupalGet('user');
- $link = $page->find('css', "$block_selector .contextual-links li a");
- $this->assertEquals('Quick edit', $link->getText(), "'Quick edit' is the first contextual link for the block.");
- $this->assertContains("/admin/structure/block/manage/$block_id/off-canvas?destination=user/2", $link->getAttribute('href'));
-
- if (isset($toolbar_item)) {
- // Check that you can open a toolbar tray and it will be closed after
- // entering edit mode.
- if ($element = $page->find('css', "#toolbar-administration a.is-active")) {
- // If a tray was open from page load close it.
- $element->click();
- $this->waitForNoElement("#toolbar-administration a.is-active");
- }
- $page->find('css', $toolbar_item)->click();
- $this->assertElementVisibleAfterWait('css', "{$toolbar_item}.is-active");
- }
- $this->enableEditMode();
- if (isset($toolbar_item)) {
- $this->waitForNoElement("{$toolbar_item}.is-active");
- }
- $this->openBlockForm($block_selector);
- switch ($block_plugin) {
- case 'system_powered_by_block':
- // Confirm "Display Title" is not checked.
- $web_assert->checkboxNotChecked('settings[label_display]');
- // Confirm Title is not visible.
- $this->assertEquals($this->isLabelInputVisible(), FALSE, 'Label is not visible');
- $page->checkField('settings[label_display]');
- $this->assertEquals($this->isLabelInputVisible(), TRUE, 'Label is visible');
- // Fill out form, save the form.
- $page->fillField('settings[label]', $new_page_text);
-
- break;
-
- case 'system_branding_block':
- // Fill out form, save the form.
- $page->fillField('settings[site_information][site_name]', $new_page_text);
- break;
-
- case 'settings_tray_test_class':
- $web_assert->elementExists('css', '[data-drupal-selector="edit-settings-some-setting"]');
- break;
+ $link = $page->find('css', "$block_selector .contextual-links li a");
+ $this->assertEquals('Quick edit', $link->getText(), "'Quick edit' is the first contextual link for the block.");
+ $this->assertContains("/admin/structure/block/manage/$block_id/off-canvas?destination=user/2", $link->getAttribute('href'));
+
+ if (isset($toolbar_item)) {
+ // Check that you can open a toolbar tray and it will be closed after
+ // entering edit mode.
+ if ($element = $page->find('css', "#toolbar-administration a.is-active")) {
+ // If a tray was open from page load close it.
+ $element->click();
+ $this->waitForNoElement("#toolbar-administration a.is-active");
}
+ $page->find('css', $toolbar_item)->click();
+ $this->assertElementVisibleAfterWait('css', "{$toolbar_item}.is-active");
+ }
+ $this->enableEditMode();
+ if (isset($toolbar_item)) {
+ $this->waitForNoElement("{$toolbar_item}.is-active");
+ }
+ $this->openBlockForm($block_selector);
+ switch ($block_plugin) {
+ case 'system_powered_by_block':
+ // Confirm "Display Title" is not checked.
+ $web_assert->checkboxNotChecked('settings[label_display]');
+ // Confirm Title is not visible.
+ $this->assertEquals($this->isLabelInputVisible(), FALSE, 'Label is not visible');
+ $page->checkField('settings[label_display]');
+ $this->assertEquals($this->isLabelInputVisible(), TRUE, 'Label is visible');
+ // Fill out form, save the form.
+ $page->fillField('settings[label]', $new_page_text);
+
+ break;
+
+ case 'system_branding_block':
+ // Fill out form, save the form.
+ $page->fillField('settings[site_information][site_name]', $new_page_text);
+ break;
+
+ case 'settings_tray_test_class':
+ $web_assert->elementExists('css', '[data-drupal-selector="edit-settings-some-setting"]');
+ break;
+ }
- if (isset($new_page_text)) {
- $page->pressButton($button_text);
- // Make sure the changes are present.
- $new_page_text_locator = "$block_selector $label_selector:contains($new_page_text)";
- $this->assertElementVisibleAfterWait('css', $new_page_text_locator);
- $web_assert->assertWaitOnAjaxRequest();
- }
+ if (isset($new_page_text)) {
+ $page->pressButton($button_text);
+ // Make sure the changes are present.
+ $new_page_text_locator = "$block_selector $label_selector:contains($new_page_text)";
+ $this->assertElementVisibleAfterWait('css', $new_page_text_locator);
+ // The page is loaded with the new change but make sure page is
+ // completely loaded.
+ $this->assertPageLoadComplete();
+ }
- $this->openBlockForm($block_selector);
+ $this->openBlockForm($block_selector);
- $this->disableEditMode();
- // Canvas should close when editing module is closed.
- $this->waitForOffCanvasToClose();
+ $this->disableEditMode();
+ // Canvas should close when editing module is closed.
+ $this->waitForOffCanvasToClose();
- $this->enableEditMode();
+ $this->enableEditMode();
- // Open block form by clicking a element inside the block.
- // This confirms that default action for links and form elements is
- // suppressed.
- $this->openBlockForm("$block_selector {$element_selector}", $block_selector);
- $web_assert->elementTextContains('css', '.contextual-toolbar-tab button', 'Editing');
- $web_assert->elementAttributeContains('css', '.dialog-off-canvas__main-canvas', 'class', 'js-settings-tray-edit-mode');
- // Simulate press the Escape key.
- $this->getSession()->executeScript('jQuery("body").trigger(jQuery.Event("keyup", { keyCode: 27 }));');
- $this->waitForOffCanvasToClose();
- $this->getSession()->wait(100);
- $this->assertEditModeDisabled();
- $web_assert->elementTextContains('css', '#drupal-live-announce', 'Exited edit mode.');
- $web_assert->elementTextNotContains('css', '.contextual-toolbar-tab button', 'Editing');
- $web_assert->elementAttributeNotContains('css', '.dialog-off-canvas__main-canvas', 'class', 'js-settings-tray-edit-mode');
- // Delete the block that was placed for the current theme.
- $block->delete();
- }
+ // Open block form by clicking a element inside the block.
+ // This confirms that default action for links and form elements is
+ // suppressed.
+ $this->openBlockForm("$block_selector {$element_selector}", $block_selector);
+ $web_assert->elementTextContains('css', '.contextual-toolbar-tab button', 'Editing');
+ $web_assert->elementAttributeContains('css', '.dialog-off-canvas__main-canvas', 'class', 'js-settings-tray-edit-mode');
+ // Simulate press the Escape key.
+ $this->getSession()->executeScript('jQuery("body").trigger(jQuery.Event("keyup", { keyCode: 27 }));');
+ $this->waitForOffCanvasToClose();
+ $this->getSession()->wait(100);
+ $this->assertEditModeDisabled();
+ $web_assert->elementTextContains('css', '#drupal-live-announce', 'Exited edit mode.');
+ $web_assert->elementTextNotContains('css', '.contextual-toolbar-tab button', 'Editing');
+ $web_assert->elementAttributeNotContains('css', '.dialog-off-canvas__main-canvas', 'class', 'js-settings-tray-edit-mode');
}
/**
* Dataprovider for testBlocks().
*/
public function providerTestBlocks() {
- $blocks = [
- 'block-powered' => [
- 'block_plugin' => 'system_powered_by_block',
- 'new_page_text' => 'Can you imagine anyone showing the label on this block',
- 'element_selector' => 'span a',
- 'label_selector' => 'h2',
- 'button_text' => 'Save Powered by Drupal',
- 'toolbar_item' => '#toolbar-item-user',
- ],
- 'block-branding' => [
- 'block_plugin' => 'system_branding_block',
- 'new_page_text' => 'The site that will live a very short life',
- 'element_selector' => "a[rel='home']:last-child",
- 'label_selector' => "a[rel='home']:last-child",
- 'button_text' => 'Save Site branding',
- 'toolbar_item' => '#toolbar-item-administration',
- ],
- 'block-search' => [
- 'block_plugin' => 'search_form_block',
- 'new_page_text' => NULL,
- 'element_selector' => '#edit-submit',
- 'label_selector' => 'h2',
- 'button_text' => 'Save Search form',
- 'toolbar_item' => NULL,
- ],
- // This is the functional JS test coverage accompanying
- // \Drupal\Tests\settings_tray\Functional\SettingsTrayTest::testPossibleAnnotations().
- SettingsTrayFormAnnotationIsClassBlock::class => [
- 'block_plugin' => 'settings_tray_test_class',
- 'new_page_text' => NULL,
- 'element_selector' => 'span',
- 'label_selector' => NULL,
- 'button_text' => NULL,
- 'toolbar_item' => NULL,
- ],
- // This is the functional JS test coverage accompanying
- // \Drupal\Tests\settings_tray\Functional\SettingsTrayTest::testPossibleAnnotations().
- SettingsTrayFormAnnotationNoneBlock::class => [
- 'block_plugin' => 'settings_tray_test_none',
- 'new_page_text' => NULL,
- 'element_selector' => 'span',
- 'label_selector' => NULL,
- 'button_text' => NULL,
- 'toolbar_item' => NULL,
- ],
- ];
+ $blocks = [];
+ foreach ($this->getTestThemes() as $theme) {
+ $blocks += [
+ "$theme: block-powered" => [
+ 'theme' => $theme,
+ 'block_plugin' => 'system_powered_by_block',
+ 'new_page_text' => 'Can you imagine anyone showing the label on this block',
+ 'element_selector' => 'span a',
+ 'label_selector' => 'h2',
+ 'button_text' => 'Save Powered by Drupal',
+ 'toolbar_item' => '#toolbar-item-user',
+ ],
+ "$theme: block-branding" => [
+ 'theme' => $theme,
+ 'block_plugin' => 'system_branding_block',
+ 'new_page_text' => 'The site that will live a very short life',
+ 'element_selector' => "a[rel='home']:last-child",
+ 'label_selector' => "a[rel='home']:last-child",
+ 'button_text' => 'Save Site branding',
+ 'toolbar_item' => '#toolbar-item-administration',
+ ],
+ "$theme: block-search" => [
+ 'theme' => $theme,
+ 'block_plugin' => 'search_form_block',
+ 'new_page_text' => NULL,
+ 'element_selector' => '#edit-submit',
+ 'label_selector' => 'h2',
+ 'button_text' => 'Save Search form',
+ 'toolbar_item' => NULL,
+ ],
+ // This is the functional JS test coverage accompanying
+ // \Drupal\Tests\settings_tray\Functional\SettingsTrayTest::testPossibleAnnotations().
+ "$theme: " . SettingsTrayFormAnnotationIsClassBlock::class => [
+ 'theme' => $theme,
+ 'block_plugin' => 'settings_tray_test_class',
+ 'new_page_text' => NULL,
+ 'element_selector' => 'span',
+ 'label_selector' => NULL,
+ 'button_text' => NULL,
+ 'toolbar_item' => NULL,
+ ],
+ // This is the functional JS test coverage accompanying
+ // \Drupal\Tests\settings_tray\Functional\SettingsTrayTest::testPossibleAnnotations().
+ "$theme: " . SettingsTrayFormAnnotationNoneBlock::class => [
+ 'theme' => $theme,
+ 'block_plugin' => 'settings_tray_test_none',
+ 'new_page_text' => NULL,
+ 'element_selector' => 'span',
+ 'label_selector' => NULL,
+ 'button_text' => NULL,
+ 'toolbar_item' => NULL,
+ ],
+ ];
+ }
+
return $blocks;
}
diff --git a/core/modules/settings_tray/tests/src/FunctionalJavascript/SettingsTrayJavascriptTestBase.php b/core/modules/settings_tray/tests/src/FunctionalJavascript/SettingsTrayJavascriptTestBase.php
index 7f7f394..083337a 100644
--- a/core/modules/settings_tray/tests/src/FunctionalJavascript/SettingsTrayJavascriptTestBase.php
+++ b/core/modules/settings_tray/tests/src/FunctionalJavascript/SettingsTrayJavascriptTestBase.php
@@ -14,12 +14,34 @@ abstract class SettingsTrayJavascriptTestBase extends JavascriptTestBase {
*/
protected function drupalGet($path, array $options = [], array $headers = []) {
$return = parent::drupalGet($path, $options, $headers);
+ $this->assertPageLoadComplete();
+ return $return;
+ }
- // After the page loaded we need to additionally wait until the settings
- // tray Ajax activity is done.
+ /**
+ * Assert the page is completely loaded.
+ *
+ * Ajax requests may happen after page loads. Also for users who have access
+ * to contextual links the contextual link placeholders will be filled after
+ * the page is received.
+ */
+ protected function assertPageLoadComplete() {
$this->assertSession()->assertWaitOnAjaxRequest();
+ if ($this->loggedInUser && $this->loggedInUser->hasPermission('access contextual links')) {
+ $this->assertAllContextualLinksLoaded();
+ }
+ }
- return $return;
+ /**
+ * Assert all contextual link areas have be loaded.
+ *
+ * Contextual link placeholders will be filled after
+ * the page is received.
+ *
+ * @todo Move this function to https://www.drupal.org/node/2821724.
+ */
+ protected function assertAllContextualLinksLoaded() {
+ $this->waitForNoElement('[data-contextual-id]:empty');
}
/**
@@ -72,7 +94,7 @@ abstract class SettingsTrayJavascriptTestBase extends JavascriptTestBase {
* (optional) Timeout in milliseconds, defaults to 10000.
*/
protected function waitForNoElement($selector, $timeout = 10000) {
- $condition = "(jQuery('$selector').length == 0)";
+ $condition = "(typeof jQuery !== 'undefined' && jQuery('$selector').length === 0)";
$this->assertJsCondition($condition, $timeout);
}