user_spec.rb 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191
  1. require 'rails_helper'
  2. require 'models/concerns/has_groups_examples'
  3. require 'models/concerns/has_roles_examples'
  4. require 'models/concerns/has_groups_permissions_examples'
  5. RSpec.describe User do
  6. let(:group_access_instance) { create(:user, roles: [Role.find_by(name: 'Agent')]) }
  7. let(:new_group_access_instance) { build(:user, roles: [Role.find_by(name: 'Agent')]) }
  8. let(:group_access_no_permission_instance) { build(:user) }
  9. include_examples 'HasGroups'
  10. include_examples 'HasRoles'
  11. include_examples 'HasGroups and Permissions'
  12. let(:new_password) { 'N3W54V3PW!' }
  13. context 'password' do
  14. it 'resets login_failed on password change' do
  15. user = create(:user_login_failed)
  16. expect do
  17. user.password = new_password
  18. user.save
  19. end.to change { user.login_failed }.to(0)
  20. end
  21. end
  22. context '#out_of_office_agent' do
  23. it 'responds to out_of_office_agent' do
  24. user = create(:user)
  25. expect(user).to respond_to(:out_of_office_agent)
  26. end
  27. context 'replacement' do
  28. it 'finds assigned' do
  29. user_replacement = create(:user)
  30. user_ooo = create(:user,
  31. out_of_office: true,
  32. out_of_office_start_at: Time.zone.yesterday,
  33. out_of_office_end_at: Time.zone.tomorrow,
  34. out_of_office_replacement_id: user_replacement.id,)
  35. expect(user_ooo.out_of_office_agent).to eq user_replacement
  36. end
  37. it 'finds none for available users' do
  38. user = create(:user)
  39. expect(user.out_of_office_agent).to be nil
  40. end
  41. end
  42. end
  43. context '#max_login_failed?' do
  44. it 'responds to max_login_failed?' do
  45. user = create(:user)
  46. expect(user).to respond_to(:max_login_failed?)
  47. end
  48. it 'checks if a user has reached the maximum of failed logins' do
  49. user = create(:user)
  50. expect(user.max_login_failed?).to be false
  51. user.login_failed = 999
  52. user.save
  53. expect(user.max_login_failed?).to be true
  54. end
  55. end
  56. context '.identify' do
  57. it 'returns users found by login' do
  58. user = create(:user)
  59. found_user = User.identify(user.login)
  60. expect(found_user).to be_an(User)
  61. expect(found_user.id).to eq user.id
  62. end
  63. it 'returns users found by email' do
  64. user = create(:user)
  65. found_user = User.identify(user.email)
  66. expect(found_user).to be_an(User)
  67. expect(found_user.id).to eq user.id
  68. end
  69. end
  70. context '.authenticate' do
  71. it 'authenticates by username and password' do
  72. user = create(:user)
  73. result = described_class.authenticate(user.login, 'zammad')
  74. expect(result).to be_an(User)
  75. end
  76. context 'failure' do
  77. it 'increases login_failed on failed logins' do
  78. user = create(:user)
  79. expect do
  80. described_class.authenticate(user.login, 'wrongpw')
  81. user.reload
  82. end
  83. .to change { user.login_failed }.by(1)
  84. end
  85. it 'fails for unknown users' do
  86. result = described_class.authenticate('john.doe', 'zammad')
  87. expect(result).to be nil
  88. end
  89. it 'fails for inactive users' do
  90. user = create(:user, active: false)
  91. result = described_class.authenticate(user.login, 'zammad')
  92. expect(result).to be nil
  93. end
  94. it 'fails for users with too many failed logins' do
  95. user = create(:user, login_failed: 999)
  96. result = described_class.authenticate(user.login, 'zammad')
  97. expect(result).to be nil
  98. end
  99. it 'fails for wrong passwords' do
  100. user = create(:user)
  101. result = described_class.authenticate(user.login, 'wrongpw')
  102. expect(result).to be nil
  103. end
  104. it 'fails for empty username parameter' do
  105. result = described_class.authenticate('', 'zammad')
  106. expect(result).to be nil
  107. end
  108. it 'fails for empty password parameter' do
  109. result = described_class.authenticate('username', '')
  110. expect(result).to be nil
  111. end
  112. end
  113. end
  114. context '#by_reset_token' do
  115. it 'returns a User instance for existing tokens' do
  116. token = create(:token_password_reset)
  117. expect(described_class.by_reset_token(token.name)).to be_instance_of(described_class)
  118. end
  119. it 'returns nil for not existing tokens' do
  120. expect(described_class.by_reset_token('not-existing')).to be nil
  121. end
  122. end
  123. context '.password_reset_via_token' do
  124. it 'changes the password of the token user and destroys the token' do
  125. token = create(:token_password_reset)
  126. user = User.find(token.user_id)
  127. expect do
  128. described_class.password_reset_via_token(token.name, new_password)
  129. user.reload
  130. end.to change {
  131. user.password
  132. }.and change {
  133. Token.count
  134. }.by(-1)
  135. end
  136. end
  137. context 'import' do
  138. it "doesn't change imported passwords" do
  139. # mock settings calls
  140. expect(Setting).to receive(:get).with('import_mode').and_return(true)
  141. allow(Setting).to receive(:get)
  142. user = build(:user, password: '{sha2}dd9c764fa7ea18cd992c8600006d3dc3ac983d1ba22e9ba2d71f6207456be0ba') # zammad
  143. expect do
  144. user.save
  145. end.to_not change {
  146. user.password
  147. }
  148. end
  149. end
  150. end