JsMessageTest.php 4.7 KB

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