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 }
|