annotate core/tests/Drupal/FunctionalJavascriptTests/Core/JsMessageTest.php @ 19:fa3358dc1485 tip

Add ndrum files
author Chris Cannam
date Wed, 28 Aug 2019 13:14:47 +0100
parents af1871eacc83
children
rev   line source
Chris@18 1 <?php
Chris@18 2
Chris@18 3 namespace Drupal\FunctionalJavascriptTests\Core;
Chris@18 4
Chris@18 5 use Drupal\FunctionalJavascriptTests\WebDriverTestBase;
Chris@18 6 use Drupal\system\Tests\JsMessageTestCases;
Chris@18 7
Chris@18 8 /**
Chris@18 9 * Tests core/drupal.messages library.
Chris@18 10 *
Chris@18 11 * @group Javascript
Chris@18 12 */
Chris@18 13 class JsMessageTest extends WebDriverTestBase {
Chris@18 14
Chris@18 15 /**
Chris@18 16 * {@inheritdoc}
Chris@18 17 */
Chris@18 18 public static $modules = ['js_message_test'];
Chris@18 19
Chris@18 20 /**
Chris@18 21 * {@inheritdoc}
Chris@18 22 */
Chris@18 23 protected function setUp() {
Chris@18 24 parent::setUp();
Chris@18 25
Chris@18 26 // Enable the theme.
Chris@18 27 \Drupal::service('theme_installer')->install(['test_messages']);
Chris@18 28 $theme_config = \Drupal::configFactory()->getEditable('system.theme');
Chris@18 29 $theme_config->set('default', 'test_messages');
Chris@18 30 $theme_config->save();
Chris@18 31 }
Chris@18 32
Chris@18 33 /**
Chris@18 34 * Test click on links to show messages and remove messages.
Chris@18 35 */
Chris@18 36 public function testAddRemoveMessages() {
Chris@18 37 $web_assert = $this->assertSession();
Chris@18 38 $this->drupalGet('js_message_test_link');
Chris@18 39
Chris@18 40 $current_messages = [];
Chris@18 41 foreach (JsMessageTestCases::getMessagesSelectors() as $messagesSelector) {
Chris@18 42 $web_assert->elementExists('css', $messagesSelector);
Chris@18 43 foreach (JsMessageTestCases::getTypes() as $type) {
Chris@18 44 $this->click('[id="add-' . $messagesSelector . '-' . $type . '"]');
Chris@18 45 $selector = "$messagesSelector .messages.messages--$type";
Chris@18 46 $msg_element = $web_assert->waitForElementVisible('css', $selector);
Chris@18 47 $this->assertNotEmpty($msg_element, "Message element visible: $selector");
Chris@18 48 $web_assert->elementContains('css', $selector, "This is a message of the type, $type. You be the the judge of its importance.");
Chris@18 49 $current_messages[$selector] = "This is a message of the type, $type. You be the the judge of its importance.";
Chris@18 50 $this->assertCurrentMessages($current_messages, $messagesSelector);
Chris@18 51 }
Chris@18 52 // Remove messages 1 by 1 and confirm the messages are expected.
Chris@18 53 foreach (JsMessageTestCases::getTypes() as $type) {
Chris@18 54 $this->click('[id="remove-' . $messagesSelector . '-' . $type . '"]');
Chris@18 55 $selector = "$messagesSelector .messages.messages--$type";
Chris@18 56 // The message for this selector should not be on the page.
Chris@18 57 unset($current_messages[$selector]);
Chris@18 58 $this->assertCurrentMessages($current_messages, $messagesSelector);
Chris@18 59 }
Chris@18 60 }
Chris@18 61
Chris@18 62 $messagesSelector = JsMessageTestCases::getMessagesSelectors()[0];
Chris@18 63 $current_messages = [];
Chris@18 64 $types = JsMessageTestCases::getTypes();
Chris@18 65 $nb_messages = count($types) * 2;
Chris@18 66 for ($i = 0; $i < $nb_messages; $i++) {
Chris@18 67 $current_messages[] = "This is message number $i of the type, {$types[$i % count($types)]}. You be the the judge of its importance.";
Chris@18 68 }
Chris@18 69 // Test adding multiple messages at once.
Chris@18 70 // @see processMessages()
Chris@18 71 $this->click('[id="add-multiple"]');
Chris@18 72 $this->assertCurrentMessages($current_messages, $messagesSelector);
Chris@18 73 $this->click('[id="remove-multiple"]');
Chris@18 74 $this->assertCurrentMessages([], $messagesSelector);
Chris@18 75
Chris@18 76 $current_messages = [];
Chris@18 77 for ($i = 0; $i < $nb_messages; $i++) {
Chris@18 78 $current_messages[] = "Msg-$i";
Chris@18 79 }
Chris@18 80 // The last message is of a different type and shouldn't get cleared.
Chris@18 81 $last_message = 'Msg-' . count($current_messages);
Chris@18 82 $current_messages[] = $last_message;
Chris@18 83 $this->click('[id="add-multiple-error"]');
Chris@18 84 $this->assertCurrentMessages($current_messages, $messagesSelector);
Chris@18 85 $this->click('[id="remove-type"]');
Chris@18 86 $this->assertCurrentMessages([$last_message], $messagesSelector);
Chris@18 87 $this->click('[id="clear-all"]');
Chris@18 88 $this->assertCurrentMessages([], $messagesSelector);
Chris@18 89
Chris@18 90 // Confirm that when adding a message with an "id" specified but no status
Chris@18 91 // that it receives the default status.
Chris@18 92 $this->click('[id="id-no-status"]');
Chris@18 93 $no_status_msg = 'Msg-id-no-status';
Chris@18 94 $this->assertCurrentMessages([$no_status_msg], $messagesSelector);
Chris@18 95 $web_assert->elementTextContains('css', "$messagesSelector .messages--status[data-drupal-message-id=\"my-special-id\"]", $no_status_msg);
Chris@18 96
Chris@18 97 }
Chris@18 98
Chris@18 99 /**
Chris@18 100 * Asserts that currently shown messages match expected messages.
Chris@18 101 *
Chris@18 102 * @param array $expected_messages
Chris@18 103 * Expected messages.
Chris@18 104 * @param string $messagesSelector
Chris@18 105 * The css selector for the containing messages element.
Chris@18 106 */
Chris@18 107 protected function assertCurrentMessages(array $expected_messages, $messagesSelector) {
Chris@18 108 $expected_messages = array_values($expected_messages);
Chris@18 109 $current_messages = [];
Chris@18 110 if ($message_divs = $this->getSession()->getPage()->findAll('css', "$messagesSelector .messages")) {
Chris@18 111 foreach ($message_divs as $message_div) {
Chris@18 112 /** @var \Behat\Mink\Element\NodeElement $message_div */
Chris@18 113 $current_messages[] = $message_div->getText();
Chris@18 114 }
Chris@18 115 }
Chris@18 116 $this->assertEquals($expected_messages, $current_messages);
Chris@18 117 }
Chris@18 118
Chris@18 119 }