diff --git a/app/models/change_password.rb b/app/models/change_password.rb index d77e02d..22f8e8b 100644 --- a/app/models/change_password.rb +++ b/app/models/change_password.rb @@ -1,13 +1,14 @@ class ChangePassword < Task - attr_accessor :login, :email, :password, :password_confirmation, :environment_id + settings_items :field, :value + attr_accessor :password, :password_confirmation, :environment_id def self.human_attribute_name(attrib) case attrib.to_sym - when :login: - _('Username') - when :email - _('e-mail') + when :field + _('Field') + when :value + _('Value') when :password _('Password') when :password_confirmation @@ -20,25 +21,21 @@ class ChangePassword < Task ################################################### # validations for creating a ChangePassword task - validates_presence_of :login, :email, :environment_id, :on => :create, :message => _('must be filled in') + validates_presence_of :field, :value, :environment_id, :on => :create, :message => _('must be filled in') + validates_inclusion_of :field, :in => %w[login email] - validates_format_of :email, :on => :create, :with => Noosfero::Constants::EMAIL_FORMAT, :if => (lambda { |obj| !obj.email.blank? }) - - validates_each :login, :on => :create do |data,attr,value| - unless data.login.blank? || data.email.blank? - user = User.find_by_login_and_environment_id(data.login, data.environment_id) + validates_each :value, :on => :create do |data,attr,value| + unless data.field.blank? || data.value.blank? + user = data.user_find if user.nil? - data.errors.add(:login, _('is invalid or user does not exists.')) - else - if user.email != data.email - data.errors.add(:email, _('does not match the username you filled in')) - end + data.errors.add(:value, _('is invalid for the selected field.')) end end end before_validation_on_create do |change_password| - change_password.requestor = Person.find_by_identifier_and_environment_id(change_password.login, change_password.environment_id) + user = change_password.user_find + change_password.requestor = user.person if user end ################################################### @@ -49,6 +46,16 @@ class ChangePassword < Task validates_presence_of :password_confirmation, :on => :update, :if => lambda { |change| change.status != Task::Status::CANCELLED } validates_confirmation_of :password, :if => lambda { |change| change.status != Task::Status::CANCELLED } + def user_find + begin + method = "find_by_#{field}_and_environment_id" + user = User.send(method, value, environment_id) + rescue + nil + end + user + end + def title _("Change password") end diff --git a/test/unit/change_password_test.rb b/test/unit/change_password_test.rb index cb6b9cd..8c02e00 100644 --- a/test/unit/change_password_test.rb +++ b/test/unit/change_password_test.rb @@ -8,63 +8,65 @@ class ChangePasswordTest < ActiveSupport::TestCase data = ChangePassword.new assert !data.valid? end - - should 'refuse invalid username' do - User.destroy_all + should 'validate field is login or email' do data = ChangePassword.new - data.login = 'unexisting' - data.email = 'example@example.com' - data.environment_id = Environment.default.id + data.field = 'anything' data.valid? - assert data.errors.invalid?(:login) - end + assert data.errors.invalid?(:field) - should 'require a valid username' do - User.destroy_all - create_user('testuser', :password => 'test', :password_confirmation => 'test', :email => 'test@example.com') + data.field = 'login' + data.valid? + assert !data.errors.invalid?(:field) - data = ChangePassword.new - data.login = 'testuser' + data.field = 'email' data.valid? - assert !data.errors.invalid?(:login) + assert !data.errors.invalid?(:field) end - should 'refuse incorrect e-mail address' do + should 'refuse invalid field' do User.destroy_all - create_user('testuser', :password => 'test', :password_confirmation => 'test', :email => 'test@example.com') data = ChangePassword.new - data.login = 'testuser' - data.email = 'wrong@example.com' data.environment_id = Environment.default.id + data.field = 'login' + data.value = 'unexisting' + data.valid? + assert data.errors.invalid?(:value) + + data.field = 'email' + data.value = 'example@example.com' data.valid? - assert !data.errors.invalid?(:login) - assert data.errors.invalid?(:email) + assert data.errors.invalid?(:value) end - should 'require the correct e-mail address' do + should 'require only a valid field-value' do User.destroy_all - create_user('testuser', :password => 'test', :password_confirmation => 'test', :email => 'test@example.com') + create_user('testuser', :email => 'test@example.com') data = ChangePassword.new - data.login = 'testuser' - data.email = 'test@example.com' data.environment_id = Environment.default.id + assert !data.valid? + assert data.errors.invalid?(:value) + data.field = 'login' + data.value = 'testuser' data.valid? - assert !data.errors.invalid?(:login) - assert !data.errors.invalid?(:email) + assert data.valid? + + data.field = 'email' + data.value = 'test@example.com' + assert data.valid? end should 'require correct passsword confirmation' do create_user('testuser', :password => 'test', :password_confirmation => 'test', :email => 'test@example.com') change = ChangePassword.new - change.login = 'testuser' - change.email = 'test@example.com' change.environment_id = Environment.default.id + change.field = 'login' + change.value = 'testuser' change.save! change.status = Task::Status::FINISHED @@ -83,9 +85,9 @@ class ChangePasswordTest < ActiveSupport::TestCase person = create_user('testuser', :password => 'test', :password_confirmation => 'test', :email => 'test@example.com').person change = ChangePassword.new - change.login = 'testuser' - change.email = 'test@example.com' change.environment_id = Environment.default.id + change.field = 'login' + change.value = 'testuser' change.save! change.expects(:requestor).returns(person).at_least_once @@ -102,9 +104,9 @@ class ChangePasswordTest < ActiveSupport::TestCase person = create_user('testuser', :password => 'test', :password_confirmation => 'test', :email => 'test@example.com').person change = ChangePassword.new - change.login = 'testuser' - change.email = 'test@example.com' change.environment_id = Environment.default.id + change.field = 'login' + change.value = 'testuser' change.save! assert_nothing_raised do @@ -125,25 +127,25 @@ class ChangePasswordTest < ActiveSupport::TestCase p1 = create_user('sample-user', :password => 'test', :password_confirmation => 'test', :email => 'sample-user@test.com', :environment => e1).person p2 = create_user('sample-user', :password => 'test', :password_confirmation => 'test', :email => 'sample-user@test.com', :environment => e2).person - c1 = ChangePassword.create!(:login => 'sample-user', :email => 'sample-user@test.com', :environment_id => e1.id) - c2 = ChangePassword.create!(:login => 'sample-user', :email => 'sample-user@test.com', :environment_id => e2.id) + c1 = ChangePassword.create!(:field => 'login', :value => 'sample-user', :environment_id => e1.id) + c2 = ChangePassword.create!(:field => 'login', :value => 'sample-user', :environment_id => e2.id) assert_equal c1.requestor, p1 assert_equal c2.requestor, p2 end should 'have target notification description' do - person = fast_create(Person, :identifier => 'testuser') + person = create_user('testuser').person - change = ChangePassword.create(:login => 'testuser', :email => 'test@example.com', :environment_id => Environment.default.id) + change = ChangePassword.create(:field => 'login', :value => 'testuser', :environment_id => Environment.default.id) assert_match(/#{change.requestor.name} wants to change its password/, change.target_notification_description) end should 'deliver task created message' do - person = fast_create(Person, :identifier => 'testuser') + person = create_user('testuser').person - task = ChangePassword.create(:login => 'testuser', :email => 'test@example.com', :environment_id => Environment.default.id) + task = ChangePassword.create(:field => 'login', :value => 'testuser', :environment_id => Environment.default.id) email = TaskMailer.deliver_task_created(task) assert_match(/#{task.requestor.name} wants to change its password/, email.subject) -- libgit2 0.21.2