user_spec.rb 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163
  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 {
  17. user.password = new_password
  18. user.save
  19. }.to change { user.login_failed }.to(0)
  20. end
  21. end
  22. context '#max_login_failed?' do
  23. it 'responds to max_login_failed?' do
  24. user = create(:user)
  25. expect(user).to respond_to(:max_login_failed?)
  26. end
  27. it 'checks if a user has reached the maximum of failed logins' do
  28. user = create(:user)
  29. expect(user.max_login_failed?).to be false
  30. user.login_failed = 999
  31. user.save
  32. expect(user.max_login_failed?).to be true
  33. end
  34. end
  35. context '.identify' do
  36. it 'returns users found by login' do
  37. user = create(:user)
  38. found_user = User.identify(user.login)
  39. expect(found_user).to be_an(User)
  40. expect(found_user.id).to eq user.id
  41. end
  42. it 'returns users found by email' do
  43. user = create(:user)
  44. found_user = User.identify(user.email)
  45. expect(found_user).to be_an(User)
  46. expect(found_user.id).to eq user.id
  47. end
  48. end
  49. context '.authenticate' do
  50. it 'authenticates by username and password' do
  51. user = create(:user)
  52. result = described_class.authenticate(user.login, 'zammad')
  53. expect(result).to be_an(User)
  54. end
  55. context 'failure' do
  56. it 'increases login_failed on failed logins' do
  57. user = create(:user)
  58. expect do
  59. described_class.authenticate(user.login, 'wrongpw')
  60. user.reload
  61. end
  62. .to change { user.login_failed }.by(1)
  63. end
  64. it 'fails for unknown users' do
  65. result = described_class.authenticate('john.doe', 'zammad')
  66. expect(result).to be nil
  67. end
  68. it 'fails for inactive users' do
  69. user = create(:user, active: false)
  70. result = described_class.authenticate(user.login, 'zammad')
  71. expect(result).to be nil
  72. end
  73. it 'fails for users with too many failed logins' do
  74. user = create(:user, login_failed: 999)
  75. result = described_class.authenticate(user.login, 'zammad')
  76. expect(result).to be nil
  77. end
  78. it 'fails for wrong passwords' do
  79. user = create(:user)
  80. result = described_class.authenticate(user.login, 'wrongpw')
  81. expect(result).to be nil
  82. end
  83. it 'fails for empty username parameter' do
  84. result = described_class.authenticate('', 'zammad')
  85. expect(result).to be nil
  86. end
  87. it 'fails for empty password parameter' do
  88. result = described_class.authenticate('username', '')
  89. expect(result).to be nil
  90. end
  91. end
  92. end
  93. context '#by_reset_token' do
  94. it 'returns a User instance for existing tokens' do
  95. token = create(:token_password_reset)
  96. expect(described_class.by_reset_token(token.name)).to be_instance_of(described_class)
  97. end
  98. it 'returns nil for not existing tokens' do
  99. expect(described_class.by_reset_token('not-existing')).to be nil
  100. end
  101. end
  102. context '.password_reset_via_token' do
  103. it 'changes the password of the token user and destroys the token' do
  104. token = create(:token_password_reset)
  105. user = User.find(token.user_id)
  106. expect {
  107. described_class.password_reset_via_token(token.name, new_password)
  108. user.reload
  109. }.to change {
  110. user.password
  111. }.and change {
  112. Token.count
  113. }.by(-1)
  114. end
  115. end
  116. context 'import' do
  117. it "doesn't change imported passwords" do
  118. # mock settings calls
  119. expect(Setting).to receive(:get).with('import_mode').and_return(true)
  120. allow(Setting).to receive(:get)
  121. user = build(:user, password: '{sha2}dd9c764fa7ea18cd992c8600006d3dc3ac983d1ba22e9ba2d71f6207456be0ba') # zammad
  122. expect {
  123. user.save
  124. }.to_not change {
  125. user.password
  126. }
  127. end
  128. end
  129. end