password-strength.js 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222
  1. import assert from 'assert';
  2. import React from 'react'; // jshint ignore:line
  3. import ReactDOM from 'react-dom'; // jshint ignore:line
  4. import PasswordStrength from 'misago/components/password-strength'; // jshint ignore:line
  5. import zxcvbn from 'misago/services/zxcvbn';
  6. describe("Password Strength", function() {
  7. afterEach(function() {
  8. window.emptyTestContainers();
  9. delete window.zxcvbn;
  10. });
  11. it('renders very weak password', function(done) {
  12. window.zxcvbn = function(password, inputs) {
  13. assert.equal(password, 'very-weak', "valid password is passed to API");
  14. assert.deepEqual(inputs, ['a', 'b', 'c'],
  15. "valid password is passed to API");
  16. return {
  17. score: 0
  18. };
  19. };
  20. zxcvbn.init({
  21. include: function() {
  22. /* noop */
  23. }
  24. });
  25. zxcvbn.load();
  26. /* jshint ignore:start */
  27. ReactDOM.render(
  28. <PasswordStrength password="very-weak" inputs={['a', 'b', 'c']} />,
  29. document.getElementById('test-mount')
  30. );
  31. /* jshint ignore:end */
  32. let element = $('#test-mount .password-strength');
  33. assert.ok(element.length, "component renders very weak password");
  34. window.setTimeout(function() {
  35. assert.ok(element.find('.progress-bar').hasClass('progress-bar-danger'),
  36. "progress bar has valid class");
  37. assert.equal(element.find('.sr-only').text().trim(),
  38. "Entered password is very weak.",
  39. "progress bar has valid sr-only label");
  40. assert.equal(element.find('p').text().trim(),
  41. "Entered password is very weak.",
  42. "progress bar has valid description");
  43. done();
  44. }, 200);
  45. });
  46. it('renders weak password', function(done) {
  47. window.zxcvbn = function(password, inputs) {
  48. assert.equal(password, 'weak', "valid password is passed to API");
  49. assert.deepEqual(inputs, ['a', 'b', 'c'],
  50. "valid password is passed to API");
  51. return {
  52. score: 1
  53. };
  54. };
  55. zxcvbn.init({
  56. include: function() {
  57. /* noop */
  58. }
  59. });
  60. zxcvbn.load();
  61. /* jshint ignore:start */
  62. ReactDOM.render(
  63. <PasswordStrength password="weak" inputs={['a', 'b', 'c']} />,
  64. document.getElementById('test-mount')
  65. );
  66. /* jshint ignore:end */
  67. let element = $('#test-mount .password-strength');
  68. assert.ok(element.length, "component renders weak password");
  69. window.setTimeout(function() {
  70. assert.ok(element.find('.progress-bar').hasClass('progress-bar-warning'),
  71. "progress bar has valid class");
  72. assert.equal(element.find('.sr-only').text().trim(),
  73. "Entered password is weak.",
  74. "progress bar has valid sr-only label");
  75. assert.equal(element.find('p').text().trim(),
  76. "Entered password is weak.",
  77. "progress bar has valid description");
  78. done();
  79. }, 200);
  80. });
  81. it('renders average password', function(done) {
  82. window.zxcvbn = function(password, inputs) {
  83. assert.equal(password, 'average', "valid password is passed to API");
  84. assert.deepEqual(inputs, ['a', 'b', 'c'],
  85. "valid password is passed to API");
  86. return {
  87. score: 2
  88. };
  89. };
  90. zxcvbn.init({
  91. include: function() {
  92. /* noop */
  93. }
  94. });
  95. zxcvbn.load();
  96. /* jshint ignore:start */
  97. ReactDOM.render(
  98. <PasswordStrength password="average" inputs={['a', 'b', 'c']} />,
  99. document.getElementById('test-mount')
  100. );
  101. /* jshint ignore:end */
  102. let element = $('#test-mount .password-strength');
  103. assert.ok(element.length, "component renders average password");
  104. window.setTimeout(function() {
  105. assert.ok(element.find('.progress-bar').hasClass('progress-bar-warning'),
  106. "progress bar has valid class");
  107. assert.equal(element.find('.sr-only').text().trim(),
  108. "Entered password is average.",
  109. "progress bar has valid sr-only label");
  110. assert.equal(element.find('p').text().trim(),
  111. "Entered password is average.",
  112. "progress bar has valid description");
  113. done();
  114. }, 200);
  115. });
  116. it('renders strong password', function(done) {
  117. window.zxcvbn = function(password, inputs) {
  118. assert.equal(password, 'stronk', "valid password is passed to API");
  119. assert.deepEqual(inputs, ['a', 'b', 'c'],
  120. "valid password is passed to API");
  121. return {
  122. score: 3
  123. };
  124. };
  125. zxcvbn.init({
  126. include: function() {
  127. /* noop */
  128. }
  129. });
  130. zxcvbn.load();
  131. /* jshint ignore:start */
  132. ReactDOM.render(
  133. <PasswordStrength password="stronk" inputs={['a', 'b', 'c']} />,
  134. document.getElementById('test-mount')
  135. );
  136. /* jshint ignore:end */
  137. let element = $('#test-mount .password-strength');
  138. assert.ok(element.length, "component renders strong password");
  139. window.setTimeout(function() {
  140. assert.ok(element.find('.progress-bar').hasClass('progress-bar-primary'),
  141. "progress bar has valid class");
  142. assert.equal(element.find('.sr-only').text().trim(),
  143. "Entered password is strong.",
  144. "progress bar has valid sr-only label");
  145. assert.equal(element.find('p').text().trim(),
  146. "Entered password is strong.",
  147. "progress bar has valid description");
  148. done();
  149. }, 200);
  150. });
  151. it('renders very strong password', function(done) {
  152. window.zxcvbn = function(password, inputs) {
  153. assert.equal(password, 'very-stronk', "valid password is passed to API");
  154. assert.deepEqual(inputs, ['a', 'b', 'c'],
  155. "valid password is passed to API");
  156. return {
  157. score: 4
  158. };
  159. };
  160. zxcvbn.init({
  161. include: function() {
  162. /* noop */
  163. }
  164. });
  165. zxcvbn.load();
  166. /* jshint ignore:start */
  167. ReactDOM.render(
  168. <PasswordStrength password="very-stronk" inputs={['a', 'b', 'c']} />,
  169. document.getElementById('test-mount')
  170. );
  171. /* jshint ignore:end */
  172. let element = $('#test-mount .password-strength');
  173. assert.ok(element.length, "component renders very strong password");
  174. window.setTimeout(function() {
  175. assert.ok(element.find('.progress-bar').hasClass('progress-bar-success'),
  176. "progress bar has valid class");
  177. assert.equal(element.find('.sr-only').text().trim(),
  178. "Entered password is very strong.",
  179. "progress bar has valid sr-only label");
  180. assert.equal(element.find('p').text().trim(),
  181. "Entered password is very strong.",
  182. "progress bar has valid description");
  183. done();
  184. }, 200);
  185. });
  186. });