diff --git a/app/services/user_activator.rb b/app/services/user_activator.rb index 63defef4dc4..f5ba7a3703d 100644 --- a/app/services/user_activator.rb +++ b/app/services/user_activator.rb @@ -43,10 +43,13 @@ end class EmailActivator < UserActivator def activate + email_token = user.email_tokens.unconfirmed.active.first + email_token = user.email_tokens.create(email: user.email) if email_token.nil? + Jobs.enqueue(:user_email, type: :signup, user_id: user.id, - email_token: user.email_tokens.first.token + email_token: email_token.token ) I18n.t("login.activate_email", email: user.email) end diff --git a/spec/services/user_activator_spec.rb b/spec/services/user_activator_spec.rb new file mode 100644 index 00000000000..689e869994b --- /dev/null +++ b/spec/services/user_activator_spec.rb @@ -0,0 +1,31 @@ +require 'spec_helper' + +describe UserActivator do + + describe 'email_activator' do + + it 'does not create new email token unless required' do + SiteSetting.email_token_valid_hours = 24 + user = Fabricate(:user) + activator = EmailActivator.new(user, nil, nil, nil) + + Jobs.expects(:enqueue).with(:user_email, has_entries(type: :signup, email_token: user.email_tokens.first.token)) + activator.activate + end + + it 'creates and send new email token if the existing token expired' do + SiteSetting.email_token_valid_hours = 24 + user = Fabricate(:user) + email_token = user.email_tokens.first + email_token.update_column(:created_at, 48.hours.ago) + activator = EmailActivator.new(user, nil, nil, nil) + + Jobs.expects(:enqueue).with(:user_email, has_entries(type: :signup)) + Jobs.expects(:enqueue).with(:user_email, has_entries(type: :signup, email_token: email_token.token)).never + activator.activate + + user.reload + expect(user.email_tokens.last.created_at).to be_within_one_second_of(Time.zone.now) + end + end +end