Chris@18: install(['test_messages']); Chris@18: $theme_config = \Drupal::configFactory()->getEditable('system.theme'); Chris@18: $theme_config->set('default', 'test_messages'); Chris@18: $theme_config->save(); Chris@18: } Chris@18: Chris@18: /** Chris@18: * Test click on links to show messages and remove messages. Chris@18: */ Chris@18: public function testAddRemoveMessages() { Chris@18: $web_assert = $this->assertSession(); Chris@18: $this->drupalGet('js_message_test_link'); Chris@18: Chris@18: $current_messages = []; Chris@18: foreach (JsMessageTestCases::getMessagesSelectors() as $messagesSelector) { Chris@18: $web_assert->elementExists('css', $messagesSelector); Chris@18: foreach (JsMessageTestCases::getTypes() as $type) { Chris@18: $this->click('[id="add-' . $messagesSelector . '-' . $type . '"]'); Chris@18: $selector = "$messagesSelector .messages.messages--$type"; Chris@18: $msg_element = $web_assert->waitForElementVisible('css', $selector); Chris@18: $this->assertNotEmpty($msg_element, "Message element visible: $selector"); Chris@18: $web_assert->elementContains('css', $selector, "This is a message of the type, $type. You be the the judge of its importance."); Chris@18: $current_messages[$selector] = "This is a message of the type, $type. You be the the judge of its importance."; Chris@18: $this->assertCurrentMessages($current_messages, $messagesSelector); Chris@18: } Chris@18: // Remove messages 1 by 1 and confirm the messages are expected. Chris@18: foreach (JsMessageTestCases::getTypes() as $type) { Chris@18: $this->click('[id="remove-' . $messagesSelector . '-' . $type . '"]'); Chris@18: $selector = "$messagesSelector .messages.messages--$type"; Chris@18: // The message for this selector should not be on the page. Chris@18: unset($current_messages[$selector]); Chris@18: $this->assertCurrentMessages($current_messages, $messagesSelector); Chris@18: } Chris@18: } Chris@18: Chris@18: $messagesSelector = JsMessageTestCases::getMessagesSelectors()[0]; Chris@18: $current_messages = []; Chris@18: $types = JsMessageTestCases::getTypes(); Chris@18: $nb_messages = count($types) * 2; Chris@18: for ($i = 0; $i < $nb_messages; $i++) { Chris@18: $current_messages[] = "This is message number $i of the type, {$types[$i % count($types)]}. You be the the judge of its importance."; Chris@18: } Chris@18: // Test adding multiple messages at once. Chris@18: // @see processMessages() Chris@18: $this->click('[id="add-multiple"]'); Chris@18: $this->assertCurrentMessages($current_messages, $messagesSelector); Chris@18: $this->click('[id="remove-multiple"]'); Chris@18: $this->assertCurrentMessages([], $messagesSelector); Chris@18: Chris@18: $current_messages = []; Chris@18: for ($i = 0; $i < $nb_messages; $i++) { Chris@18: $current_messages[] = "Msg-$i"; Chris@18: } Chris@18: // The last message is of a different type and shouldn't get cleared. Chris@18: $last_message = 'Msg-' . count($current_messages); Chris@18: $current_messages[] = $last_message; Chris@18: $this->click('[id="add-multiple-error"]'); Chris@18: $this->assertCurrentMessages($current_messages, $messagesSelector); Chris@18: $this->click('[id="remove-type"]'); Chris@18: $this->assertCurrentMessages([$last_message], $messagesSelector); Chris@18: $this->click('[id="clear-all"]'); Chris@18: $this->assertCurrentMessages([], $messagesSelector); Chris@18: Chris@18: // Confirm that when adding a message with an "id" specified but no status Chris@18: // that it receives the default status. Chris@18: $this->click('[id="id-no-status"]'); Chris@18: $no_status_msg = 'Msg-id-no-status'; Chris@18: $this->assertCurrentMessages([$no_status_msg], $messagesSelector); Chris@18: $web_assert->elementTextContains('css', "$messagesSelector .messages--status[data-drupal-message-id=\"my-special-id\"]", $no_status_msg); Chris@18: Chris@18: } Chris@18: Chris@18: /** Chris@18: * Asserts that currently shown messages match expected messages. Chris@18: * Chris@18: * @param array $expected_messages Chris@18: * Expected messages. Chris@18: * @param string $messagesSelector Chris@18: * The css selector for the containing messages element. Chris@18: */ Chris@18: protected function assertCurrentMessages(array $expected_messages, $messagesSelector) { Chris@18: $expected_messages = array_values($expected_messages); Chris@18: $current_messages = []; Chris@18: if ($message_divs = $this->getSession()->getPage()->findAll('css', "$messagesSelector .messages")) { Chris@18: foreach ($message_divs as $message_div) { Chris@18: /** @var \Behat\Mink\Element\NodeElement $message_div */ Chris@18: $current_messages[] = $message_div->getText(); Chris@18: } Chris@18: } Chris@18: $this->assertEquals($expected_messages, $current_messages); Chris@18: } Chris@18: Chris@18: }