Commit 63ca9209c01e18938dcb1c09f5545065f794c2a7

Authored by Rodrigo Souto
1 parent 103b7ebe

change_password: accept email or login

Also including support for other fields later.

(ActionItem2857)
app/models/change_password.rb
1 class ChangePassword < Task 1 class ChangePassword < Task
2 2
3 - attr_accessor :login, :email, :password, :password_confirmation, :environment_id 3 + settings_items :field, :value
  4 + attr_accessor :password, :password_confirmation, :environment_id
4 5
5 def self.human_attribute_name(attrib) 6 def self.human_attribute_name(attrib)
6 case attrib.to_sym 7 case attrib.to_sym
7 - when :login:  
8 - _('Username')  
9 - when :email  
10 - _('e-mail') 8 + when :field
  9 + _('Field')
  10 + when :value
  11 + _('Value')
11 when :password 12 when :password
12 _('Password') 13 _('Password')
13 when :password_confirmation 14 when :password_confirmation
@@ -20,25 +21,21 @@ class ChangePassword &lt; Task @@ -20,25 +21,21 @@ class ChangePassword &lt; Task
20 ################################################### 21 ###################################################
21 # validations for creating a ChangePassword task 22 # validations for creating a ChangePassword task
22 23
23 - validates_presence_of :login, :email, :environment_id, :on => :create, :message => _('must be filled in') 24 + validates_presence_of :field, :value, :environment_id, :on => :create, :message => _('must be filled in')
  25 + validates_inclusion_of :field, :in => %w[login email]
24 26
25 - validates_format_of :email, :on => :create, :with => Noosfero::Constants::EMAIL_FORMAT, :if => (lambda { |obj| !obj.email.blank? })  
26 -  
27 - validates_each :login, :on => :create do |data,attr,value|  
28 - unless data.login.blank? || data.email.blank?  
29 - user = User.find_by_login_and_environment_id(data.login, data.environment_id) 27 + validates_each :value, :on => :create do |data,attr,value|
  28 + unless data.field.blank? || data.value.blank?
  29 + user = data.user_find
30 if user.nil? 30 if user.nil?
31 - data.errors.add(:login, _('is invalid or user does not exists.'))  
32 - else  
33 - if user.email != data.email  
34 - data.errors.add(:email, _('does not match the username you filled in'))  
35 - end 31 + data.errors.add(:value, _('is invalid for the selected field.'))
36 end 32 end
37 end 33 end
38 end 34 end
39 35
40 before_validation_on_create do |change_password| 36 before_validation_on_create do |change_password|
41 - change_password.requestor = Person.find_by_identifier_and_environment_id(change_password.login, change_password.environment_id) 37 + user = change_password.user_find
  38 + change_password.requestor = user.person if user
42 end 39 end
43 40
44 ################################################### 41 ###################################################
@@ -49,6 +46,16 @@ class ChangePassword &lt; Task @@ -49,6 +46,16 @@ class ChangePassword &lt; Task
49 validates_presence_of :password_confirmation, :on => :update, :if => lambda { |change| change.status != Task::Status::CANCELLED } 46 validates_presence_of :password_confirmation, :on => :update, :if => lambda { |change| change.status != Task::Status::CANCELLED }
50 validates_confirmation_of :password, :if => lambda { |change| change.status != Task::Status::CANCELLED } 47 validates_confirmation_of :password, :if => lambda { |change| change.status != Task::Status::CANCELLED }
51 48
  49 + def user_find
  50 + begin
  51 + method = "find_by_#{field}_and_environment_id"
  52 + user = User.send(method, value, environment_id)
  53 + rescue
  54 + nil
  55 + end
  56 + user
  57 + end
  58 +
52 def title 59 def title
53 _("Change password") 60 _("Change password")
54 end 61 end
test/unit/change_password_test.rb
@@ -8,63 +8,65 @@ class ChangePasswordTest &lt; ActiveSupport::TestCase @@ -8,63 +8,65 @@ class ChangePasswordTest &lt; ActiveSupport::TestCase
8 data = ChangePassword.new 8 data = ChangePassword.new
9 assert !data.valid? 9 assert !data.valid?
10 end 10 end
11 -  
12 - should 'refuse invalid username' do  
13 - User.destroy_all  
14 11
  12 + should 'validate field is login or email' do
15 data = ChangePassword.new 13 data = ChangePassword.new
16 - data.login = 'unexisting'  
17 - data.email = 'example@example.com'  
18 - data.environment_id = Environment.default.id 14 + data.field = 'anything'
19 data.valid? 15 data.valid?
20 - assert data.errors.invalid?(:login)  
21 - end 16 + assert data.errors.invalid?(:field)
22 17
23 - should 'require a valid username' do  
24 - User.destroy_all  
25 - create_user('testuser', :password => 'test', :password_confirmation => 'test', :email => 'test@example.com') 18 + data.field = 'login'
  19 + data.valid?
  20 + assert !data.errors.invalid?(:field)
26 21
27 - data = ChangePassword.new  
28 - data.login = 'testuser' 22 + data.field = 'email'
29 data.valid? 23 data.valid?
30 - assert !data.errors.invalid?(:login) 24 + assert !data.errors.invalid?(:field)
31 end 25 end
32 26
33 - should 'refuse incorrect e-mail address' do 27 + should 'refuse invalid field' do
34 User.destroy_all 28 User.destroy_all
35 - create_user('testuser', :password => 'test', :password_confirmation => 'test', :email => 'test@example.com')  
36 29
37 data = ChangePassword.new 30 data = ChangePassword.new
38 - data.login = 'testuser'  
39 - data.email = 'wrong@example.com'  
40 data.environment_id = Environment.default.id 31 data.environment_id = Environment.default.id
41 32
  33 + data.field = 'login'
  34 + data.value = 'unexisting'
  35 + data.valid?
  36 + assert data.errors.invalid?(:value)
  37 +
  38 + data.field = 'email'
  39 + data.value = 'example@example.com'
42 data.valid? 40 data.valid?
43 - assert !data.errors.invalid?(:login)  
44 - assert data.errors.invalid?(:email) 41 + assert data.errors.invalid?(:value)
45 end 42 end
46 43
47 - should 'require the correct e-mail address' do 44 + should 'require only a valid field-value' do
48 User.destroy_all 45 User.destroy_all
49 - create_user('testuser', :password => 'test', :password_confirmation => 'test', :email => 'test@example.com') 46 + create_user('testuser', :email => 'test@example.com')
50 47
51 data = ChangePassword.new 48 data = ChangePassword.new
52 - data.login = 'testuser'  
53 - data.email = 'test@example.com'  
54 data.environment_id = Environment.default.id 49 data.environment_id = Environment.default.id
  50 + assert !data.valid?
  51 + assert data.errors.invalid?(:value)
55 52
  53 + data.field = 'login'
  54 + data.value = 'testuser'
56 data.valid? 55 data.valid?
57 - assert !data.errors.invalid?(:login)  
58 - assert !data.errors.invalid?(:email) 56 + assert data.valid?
  57 +
  58 + data.field = 'email'
  59 + data.value = 'test@example.com'
  60 + assert data.valid?
59 end 61 end
60 62
61 should 'require correct passsword confirmation' do 63 should 'require correct passsword confirmation' do
62 create_user('testuser', :password => 'test', :password_confirmation => 'test', :email => 'test@example.com') 64 create_user('testuser', :password => 'test', :password_confirmation => 'test', :email => 'test@example.com')
63 65
64 change = ChangePassword.new 66 change = ChangePassword.new
65 - change.login = 'testuser'  
66 - change.email = 'test@example.com'  
67 change.environment_id = Environment.default.id 67 change.environment_id = Environment.default.id
  68 + change.field = 'login'
  69 + change.value = 'testuser'
68 change.save! 70 change.save!
69 71
70 change.status = Task::Status::FINISHED 72 change.status = Task::Status::FINISHED
@@ -83,9 +85,9 @@ class ChangePasswordTest &lt; ActiveSupport::TestCase @@ -83,9 +85,9 @@ class ChangePasswordTest &lt; ActiveSupport::TestCase
83 person = create_user('testuser', :password => 'test', :password_confirmation => 'test', :email => 'test@example.com').person 85 person = create_user('testuser', :password => 'test', :password_confirmation => 'test', :email => 'test@example.com').person
84 86
85 change = ChangePassword.new 87 change = ChangePassword.new
86 - change.login = 'testuser'  
87 - change.email = 'test@example.com'  
88 change.environment_id = Environment.default.id 88 change.environment_id = Environment.default.id
  89 + change.field = 'login'
  90 + change.value = 'testuser'
89 change.save! 91 change.save!
90 92
91 change.expects(:requestor).returns(person).at_least_once 93 change.expects(:requestor).returns(person).at_least_once
@@ -102,9 +104,9 @@ class ChangePasswordTest &lt; ActiveSupport::TestCase @@ -102,9 +104,9 @@ class ChangePasswordTest &lt; ActiveSupport::TestCase
102 person = create_user('testuser', :password => 'test', :password_confirmation => 'test', :email => 'test@example.com').person 104 person = create_user('testuser', :password => 'test', :password_confirmation => 'test', :email => 'test@example.com').person
103 105
104 change = ChangePassword.new 106 change = ChangePassword.new
105 - change.login = 'testuser'  
106 - change.email = 'test@example.com'  
107 change.environment_id = Environment.default.id 107 change.environment_id = Environment.default.id
  108 + change.field = 'login'
  109 + change.value = 'testuser'
108 change.save! 110 change.save!
109 111
110 assert_nothing_raised do 112 assert_nothing_raised do
@@ -125,25 +127,25 @@ class ChangePasswordTest &lt; ActiveSupport::TestCase @@ -125,25 +127,25 @@ class ChangePasswordTest &lt; ActiveSupport::TestCase
125 p1 = create_user('sample-user', :password => 'test', :password_confirmation => 'test', :email => 'sample-user@test.com', :environment => e1).person 127 p1 = create_user('sample-user', :password => 'test', :password_confirmation => 'test', :email => 'sample-user@test.com', :environment => e1).person
126 p2 = create_user('sample-user', :password => 'test', :password_confirmation => 'test', :email => 'sample-user@test.com', :environment => e2).person 128 p2 = create_user('sample-user', :password => 'test', :password_confirmation => 'test', :email => 'sample-user@test.com', :environment => e2).person
127 129
128 - c1 = ChangePassword.create!(:login => 'sample-user', :email => 'sample-user@test.com', :environment_id => e1.id)  
129 - c2 = ChangePassword.create!(:login => 'sample-user', :email => 'sample-user@test.com', :environment_id => e2.id) 130 + c1 = ChangePassword.create!(:field => 'login', :value => 'sample-user', :environment_id => e1.id)
  131 + c2 = ChangePassword.create!(:field => 'login', :value => 'sample-user', :environment_id => e2.id)
130 132
131 assert_equal c1.requestor, p1 133 assert_equal c1.requestor, p1
132 assert_equal c2.requestor, p2 134 assert_equal c2.requestor, p2
133 end 135 end
134 136
135 should 'have target notification description' do 137 should 'have target notification description' do
136 - person = fast_create(Person, :identifier => 'testuser') 138 + person = create_user('testuser').person
137 139
138 - change = ChangePassword.create(:login => 'testuser', :email => 'test@example.com', :environment_id => Environment.default.id) 140 + change = ChangePassword.create(:field => 'login', :value => 'testuser', :environment_id => Environment.default.id)
139 141
140 assert_match(/#{change.requestor.name} wants to change its password/, change.target_notification_description) 142 assert_match(/#{change.requestor.name} wants to change its password/, change.target_notification_description)
141 end 143 end
142 144
143 should 'deliver task created message' do 145 should 'deliver task created message' do
144 - person = fast_create(Person, :identifier => 'testuser') 146 + person = create_user('testuser').person
145 147
146 - task = ChangePassword.create(:login => 'testuser', :email => 'test@example.com', :environment_id => Environment.default.id) 148 + task = ChangePassword.create(:field => 'login', :value => 'testuser', :environment_id => Environment.default.id)
147 149
148 email = TaskMailer.deliver_task_created(task) 150 email = TaskMailer.deliver_task_created(task)
149 assert_match(/#{task.requestor.name} wants to change its password/, email.subject) 151 assert_match(/#{task.requestor.name} wants to change its password/, email.subject)