diff --git a/app/models/user.rb b/app/models/user.rb index 8be2ba9..a96a7a4 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -417,6 +417,12 @@ class User < ActiveRecord::Base @is_password_required = false end + def resend_activation_code + return if self.activated? + update_attribute(:activation_code, make_activation_code) + self.deliver_activation_code + end + protected def normalize_email diff --git a/lib/noosfero/api/session.rb b/lib/noosfero/api/session.rb index 21cab29..2eb6ed6 100644 --- a/lib/noosfero/api/session.rb +++ b/lib/noosfero/api/session.rb @@ -113,6 +113,22 @@ module Noosfero end end + # Resend activation code. + # + # Parameters: + # value (required) - Email or login + # Example Request: + # POST /resend_activation_code?value=some@mail.com + post "/resend_activation_code" do + requestors = fetch_requestors(params[:value]) + not_found! if requestors.blank? + remote_ip = (request.respond_to?(:remote_ip) && request.remote_ip) || (env && env['REMOTE_ADDR']) + requestors.each do |requestor| + requestor.user.resend_activation_code + end + present requestors.map(&:user), :with => Entities::UserLogin + end + params do requires :code, type: String, desc: _("Forgot password code") end diff --git a/test/unit/api/session_test.rb b/test/unit/api/session_test.rb index a054649..bae3d4a 100644 --- a/test/unit/api/session_test.rb +++ b/test/unit/api/session_test.rb @@ -192,4 +192,30 @@ class SessionTest < ActiveSupport::TestCase assert !json['user']['private_token'].present? end + should 'resend activation code for an inactive user' do + user = create_user + params = {:value => user.login} + Delayed::Job.destroy_all + assert_difference 'ActionMailer::Base.deliveries.size' do + post "/api/v1/resend_activation_code?#{params.to_query}" + process_delayed_job_queue + end + json = JSON.parse(last_response.body) + refute json['users'].first['private_token'] + assert_equal user.email, ActionMailer::Base.deliveries.last['to'].to_s + end + + should 'not resend activation code for an active user' do + user = create_user + params = {:value => user.login} + user.activate + Delayed::Job.destroy_all + assert_no_difference 'ActionMailer::Base.deliveries.size' do + post "/api/v1/resend_activation_code?#{params.to_query}" + process_delayed_job_queue + end + json = JSON.parse(last_response.body) + assert json['users'].first['private_token'] + end + end diff --git a/test/unit/user_test.rb b/test/unit/user_test.rb index eb363df..2e01880 100644 --- a/test/unit/user_test.rb +++ b/test/unit/user_test.rb @@ -737,6 +737,28 @@ class UserTest < ActiveSupport::TestCase assert user.private_token, 'token' end + should 'deliver e-mail with activation code when resend was requested and user was not activated' do + user = new_user :email => 'pending@activation.com' + activation_code = user.activation_code + Delayed::Job.destroy_all + assert_difference 'ActionMailer::Base.deliveries.size', 1 do + user.resend_activation_code + process_delayed_job_queue + end + assert_not_equal activation_code, user.reload.activation_code + assert_equal 'pending@activation.com', ActionMailer::Base.deliveries.last['to'].to_s + end + + should 'not deliver e-mail with activation code when resend was requested and user was activated' do + user = new_user :email => 'pending@activation.com' + user.activate + Delayed::Job.destroy_all + assert_no_difference 'ActionMailer::Base.deliveries.size' do + user.resend_activation_code + process_delayed_job_queue + end + end + protected def new_user(options = {}) user = User.new({ :login => 'quire', :email => 'quire@example.com', :password => 'quire', :password_confirmation => 'quire' }.merge(options)) -- libgit2 0.21.2