PageRenderTime 45ms CodeModel.GetById 18ms RepoModel.GetById 0ms app.codeStats 0ms

/web/core/modules/user/tests/src/FunctionalJavascript/PasswordConfirmWidgetTest.php

https://gitlab.com/mohamed_hussein/prodt
PHP | 179 lines | 86 code | 36 blank | 57 comment | 0 complexity | 1ba5d1698b9c00c868851fd583e0e9af MD5 | raw file
  1. <?php
  2. namespace Drupal\Tests\user\FunctionalJavascript;
  3. use Drupal\FunctionalJavascriptTests\WebDriverTestBase;
  4. /**
  5. * Tests the JS components added to the PasswordConfirm render element.
  6. *
  7. * @group user
  8. */
  9. class PasswordConfirmWidgetTest extends WebDriverTestBase {
  10. /**
  11. * {@inheritdoc}
  12. */
  13. protected $defaultTheme = 'stark';
  14. /**
  15. * WebAssert object.
  16. *
  17. * @var \Drupal\Tests\WebAssert
  18. */
  19. protected $assert;
  20. /**
  21. * User for testing.
  22. *
  23. * @var \Drupal\user\UserInterface
  24. */
  25. protected $testUser;
  26. /**
  27. * {@inheritdoc}
  28. */
  29. protected function setUp(): void {
  30. parent::setUp();
  31. $this->assert = $this->assertSession();
  32. // Create a user.
  33. $this->testUser = $this->createUser();
  34. $this->drupalLogin($this->testUser);
  35. }
  36. /**
  37. * Tests the components added to the password confirm widget.
  38. */
  39. public function testPasswordConfirmWidgetJsComponents() {
  40. $this->drupalGet($this->testUser->toUrl('edit-form'));
  41. $password_confirm_widget_selector = '.js-form-type-password-confirm.js-form-item-pass';
  42. $password_parent_selector = '.js-form-item-pass-pass1';
  43. $password_confirm_selector = '.js-form-item-pass-pass2';
  44. $password_confirm_widget = $this->assert->elementExists('css', $password_confirm_widget_selector);
  45. $password_parent_item = $password_confirm_widget->find('css', $password_parent_selector);
  46. $password_confirm_item = $password_confirm_widget->find('css', $password_confirm_selector);
  47. // Check that 'password-parent' and 'confirm-parent' are added to the
  48. // appropriate elements.
  49. $this->assertNotNull($this->assert->waitForElement('css', "$password_parent_selector.password-parent"));
  50. $this->assertTrue($password_parent_item->hasClass('password-parent'));
  51. $this->assertNotNull($this->assert->waitForElement('css', "$password_confirm_selector.confirm-parent"));
  52. $this->assertTrue($password_confirm_item->hasClass('confirm-parent'));
  53. // Check the elements of the main password item.
  54. $this->assertTrue($password_parent_item->has('css', 'input.js-password-field'));
  55. // Strength meter and bar.
  56. $this->assertTrue($password_parent_item->has('css', 'input.js-password-field + .password-strength > [data-drupal-selector="password-strength-meter"]:first-child [data-drupal-selector="password-strength-indicator"]'));
  57. // Password strength feedback. No strength text feedback present without
  58. // input.
  59. $this->assertTrue($password_parent_item->has('css', '.password-strength > [data-drupal-selector="password-strength-meter"] + .password-strength__title:last-child > [data-drupal-selector="password-strength-text"]'));
  60. $this->assertEmpty($password_parent_item->find('css', '.password-strength > [data-drupal-selector="password-strength-meter"] + .password-strength__title:last-child > [data-drupal-selector="password-strength-text"]')->getText());
  61. // Check the elements of the password confirm item.
  62. $this->assertTrue($password_confirm_item->has('css', 'input.js-password-confirm'));
  63. // Check the password suggestions element.
  64. $this->assertTrue($password_confirm_item->has('css', "$password_confirm_selector + .password-suggestions"));
  65. $this->assertFalse($password_confirm_item->has('css', "$password_confirm_selector + .password-suggestions > ul > li"));
  66. $this->assertFalse($password_confirm_item->find('css', "$password_confirm_selector + .password-suggestions")->isVisible());
  67. $this->assertTrue($password_confirm_item->find('css', "$password_confirm_selector + .password-suggestions")->getHtml() === '');
  68. // Fill only the main input for first.
  69. $this->drupalGet($this->testUser->toUrl('edit-form'));
  70. // Wait for the JS.
  71. $this->assert->waitForElement('css', "$password_parent_selector.password-parent");
  72. // Fill main input.
  73. $password_confirm_widget->fillField('Password', 'o');
  74. // Password tips should be refreshed and get visible.
  75. $this->assertNotNull($this->assert->waitForElement('css', "$password_confirm_selector + .password-suggestions > ul > li"));
  76. $this->assertTrue($password_confirm_item->find('css', "$password_confirm_selector + .password-suggestions > ul > li")->isVisible());
  77. // Password match message must become invisible.
  78. $this->assertFalse($password_confirm_item->find('css', 'input.js-password-confirm + [data-drupal-selector="password-confirm-message"]')->isVisible());
  79. // Password strength message should be updated.
  80. $this->assert->elementContains('css', "$password_confirm_widget_selector $password_parent_selector", '<div aria-live="polite" aria-atomic="true" class="password-strength__title">Password strength: <span class="password-strength__text" data-drupal-selector="password-strength-text">Weak</span></div>');
  81. // Deleting the input must not change the element above.
  82. $password_confirm_widget->fillField('Password', 'o');
  83. $this->assertFalse($password_confirm_item->find('css', 'input.js-password-confirm + [data-drupal-selector="password-confirm-message"]')->isVisible());
  84. $this->assertTrue($password_confirm_item->find('css', "$password_confirm_selector + .password-suggestions > ul > li")->isVisible());
  85. $this->assert->elementContains('css', "$password_confirm_widget_selector $password_parent_selector", '<div aria-live="polite" aria-atomic="true" class="password-strength__title">Password strength: <span class="password-strength__text" data-drupal-selector="password-strength-text">Weak</span></div>');
  86. // Now fill both the main and confirm input.
  87. $password_confirm_widget->fillField('Password', 'oooooooooO0∘');
  88. $password_confirm_widget->fillField('Confirm password', 'oooooooooO0∘');
  89. // Bar should be 100% wide.
  90. $this->assert->elementAttributeContains('css', 'input.js-password-field + .password-strength > [data-drupal-selector="password-strength-meter"] [data-drupal-selector="password-strength-indicator"]', 'style', 'width: 100%;');
  91. $this->assert->elementTextContains('css', "$password_confirm_widget_selector $password_parent_selector [data-drupal-selector='password-strength-text']", 'Strong');
  92. // Password match message must be visible.
  93. $this->assertTrue($password_confirm_item->find('css', 'input.js-password-confirm + [data-drupal-selector="password-confirm-message"]')->isVisible());
  94. $this->assertTrue($password_confirm_item->find('css', 'input.js-password-confirm + [data-drupal-selector="password-confirm-message"] > [data-drupal-selector="password-match-status-text"]')->hasClass('ok'));
  95. $this->assert->elementTextContains('css', 'input.js-password-confirm + [data-drupal-selector="password-confirm-message"] > [data-drupal-selector="password-match-status-text"]', 'yes');
  96. // Password suggestions should get invisible.
  97. $this->assertFalse($password_confirm_item->find('css', "$password_confirm_selector + .password-suggestions")->isVisible());
  98. }
  99. /**
  100. * Ensures that password match message is visible when widget is initialized.
  101. */
  102. public function testPasswordConfirmMessage() {
  103. $this->drupalGet($this->testUser->toUrl('edit-form'));
  104. $password_confirm_widget_selector = '.js-form-type-password-confirm.js-form-item-pass';
  105. $password_confirm_selector = '.js-form-item-pass-pass2';
  106. $password_confirm_widget = $this->assert->elementExists('css', $password_confirm_widget_selector);
  107. $password_confirm_item = $password_confirm_widget->find('css', $password_confirm_selector);
  108. // Password match message.
  109. $this->assertTrue($password_confirm_item->has('css', 'input.js-password-confirm + [data-drupal-selector="password-confirm-message"]'));
  110. $this->assertTrue($password_confirm_item->find('css', 'input.js-password-confirm + [data-drupal-selector="password-confirm-message"]')->isVisible());
  111. $this->assert->elementContains('css', "$password_confirm_widget_selector $password_confirm_selector", '<div aria-live="polite" aria-atomic="true" class="password-confirm-message" data-drupal-selector="password-confirm-message">Passwords match: <span data-drupal-selector="password-match-status-text"></span></div>');
  112. }
  113. /**
  114. * Tests the password confirm widget so that only confirm input is filled.
  115. */
  116. public function testFillConfirmOnly() {
  117. $this->drupalGet($this->testUser->toUrl('edit-form'));
  118. $password_confirm_widget_selector = '.js-form-type-password-confirm.js-form-item-pass';
  119. $password_parent_selector = '.js-form-item-pass-pass1';
  120. $password_confirm_selector = '.js-form-item-pass-pass2';
  121. $password_confirm_widget = $this->assert->elementExists('css', $password_confirm_widget_selector);
  122. $password_confirm_item = $password_confirm_widget->find('css', $password_confirm_selector);
  123. $password_parent_item = $password_confirm_widget->find('css', $password_parent_selector);
  124. // Fill only the confirm input.
  125. $password_confirm_widget->fillField('Confirm password', 'o');
  126. // Password tips should be refreshed and get visible.
  127. $this->assertNotNull($this->assert->waitForElement('css', "$password_confirm_selector + .password-suggestions > ul > li"));
  128. $this->assertTrue($password_confirm_item->find('css', "$password_confirm_selector + .password-suggestions")->isVisible());
  129. // The appropriate strength text should appear.
  130. $this->assert->elementContains('css', "$password_confirm_widget_selector $password_parent_selector", '<div aria-live="polite" aria-atomic="true" class="password-strength__title">Password strength: <span class="password-strength__text" data-drupal-selector="password-strength-text">Weak</span></div>');
  131. // Password match.
  132. $this->assertTrue($password_confirm_item->find('css', 'input.js-password-confirm + [data-drupal-selector="password-confirm-message"]')->isVisible());
  133. $this->assert->elementContains('css', "$password_confirm_widget_selector $password_confirm_selector [data-drupal-selector='password-confirm-message']", 'Passwords match: <span data-drupal-selector="password-match-status-text" class="error">no</span>');
  134. // Deleting the input should hide the 'password match', but password
  135. // strength and tips must remain visible.
  136. $password_confirm_widget->fillField('Confirm password', '');
  137. $this->assertFalse($password_confirm_item->find('css', 'input.js-password-confirm + [data-drupal-selector="password-confirm-message"]')->isVisible());
  138. $this->assert->elementContains('css', "$password_confirm_widget_selector $password_confirm_selector [data-drupal-selector='password-confirm-message']", 'Passwords match: <span data-drupal-selector="password-match-status-text" class="error">no</span>');
  139. $this->assertTrue($password_confirm_item->find('css', "$password_confirm_selector + .password-suggestions")->isVisible());
  140. $this->assertTrue($password_parent_item->find('css', '.password-strength > .password-strength__meter + .password-strength__title')->isVisible());
  141. $this->assert->elementContains('css', "$password_confirm_widget_selector $password_parent_selector", '<div aria-live="polite" aria-atomic="true" class="password-strength__title">Password strength: <span class="password-strength__text" data-drupal-selector="password-strength-text">Weak</span></div>');
  142. }
  143. }