From 96f2aaa57a6a75d6d035256cdbe89b753150247f Mon Sep 17 00:00:00 2001 From: Kevin Fitzpatrick & Tim Frazer Date: Mon, 14 Nov 2011 12:30:47 -0800 Subject: [PATCH] Background sending password reset instructions. --- app/models/jobs/reset_password.rb | 10 +++++++++ app/models/user.rb | 5 +++++ .../devise/passwords_controller_spec.rb | 19 +++++----------- spec/models/jobs/reset_password_spec.rb | 14 ++++++++++++ spec/models/user_spec.rb | 22 +++++++++++++++++++ 5 files changed, 56 insertions(+), 14 deletions(-) create mode 100644 app/models/jobs/reset_password.rb create mode 100644 spec/models/jobs/reset_password_spec.rb diff --git a/app/models/jobs/reset_password.rb b/app/models/jobs/reset_password.rb new file mode 100644 index 000000000..7b3e50e96 --- /dev/null +++ b/app/models/jobs/reset_password.rb @@ -0,0 +1,10 @@ +module Jobs + class ResetPassword < Base + @queue = :mail + + def self.perform(user_id) + user = User.find(user_id) + ::Devise.mailer.reset_password_instructions(user).deliver + end + end +end diff --git a/app/models/user.rb b/app/models/user.rb index b87f24784..654bb7bb1 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -105,6 +105,11 @@ class User < ActiveRecord::Base user end + def send_reset_password_instructions + generate_reset_password_token! if should_generate_token? + Resque.enqueue(Jobs::ResetPassword, self.id) + end + def update_user_preferences(pref_hash) if self.disable_mail diff --git a/spec/controllers/devise/passwords_controller_spec.rb b/spec/controllers/devise/passwords_controller_spec.rb index e20e83baf..b9c61ae9f 100644 --- a/spec/controllers/devise/passwords_controller_spec.rb +++ b/spec/controllers/devise/passwords_controller_spec.rb @@ -18,9 +18,8 @@ describe Devise::PasswordsController do response.should be_success end it "doesn't send email" do - expect { - post :create, "user" => {"email" => "foo@example.com"} - }.to change(Devise.mailer.deliveries, :length).by(0) + Resque.should_not_receive(:enqueue) + post :create, "user" => {"email" => "foo@example.com"} end end context "when there is a user with that email" do @@ -28,18 +27,10 @@ describe Devise::PasswordsController do post :create, "user" => {"email" => alice.email} response.should redirect_to(new_user_session_path) end - it "sends email" do - expect { - post :create, "user" => {"email" => alice.email} - }.to change(Devise.mailer.deliveries, :length).by(1) - end - it "sends email with a non-blank body" do + it "sends email (enqueued to Resque)" do + Resque.should_receive(:enqueue).with(Jobs::ResetPassword, alice.id) post :create, "user" => {"email" => alice.email} - email = Devise.mailer.deliveries.last - email_body = email.body.to_s - email_body = email.html_part.body.raw_source if email_body.blank? && email.html_part.present? - email_body.should_not be_blank - end + end end end end \ No newline at end of file diff --git a/spec/models/jobs/reset_password_spec.rb b/spec/models/jobs/reset_password_spec.rb new file mode 100644 index 000000000..8abfc0419 --- /dev/null +++ b/spec/models/jobs/reset_password_spec.rb @@ -0,0 +1,14 @@ +require 'spec_helper' + +describe Jobs::ResetPassword do + describe "#perform" do + it "given a user id it sends the reset password instructions for that user" do + user = Factory :user + expect { + mail = Jobs::ResetPassword.perform(user.id) + mail.to.should == [user.email] + mail.body.should include("change your password") + }.to change(Devise.mailer.deliveries, :length).by(1) + end + end +end \ No newline at end of file diff --git a/spec/models/user_spec.rb b/spec/models/user_spec.rb index e89de4100..431a745be 100644 --- a/spec/models/user_spec.rb +++ b/spec/models/user_spec.rb @@ -983,4 +983,26 @@ describe User do end end end + + describe "#send_reset_password_instructions" do + it "generates a reset password token if it's supposed to" do + user = User.new + user.stub!(:should_generate_token?).and_return(true) + user.should_receive(:generate_reset_password_token) + user.send_reset_password_instructions + end + + it "does not generate a reset password token if it's not supposed to" do + user = User.new + user.stub!(:should_generate_token?).and_return(false) + user.should_not_receive(:generate_reset_password_token) + user.send_reset_password_instructions + end + + it "queues up a job to send the reset password instructions" do + user = Factory :user + Resque.should_receive(:enqueue).with(Jobs::ResetPassword, user.id) + user.send_reset_password_instructions + end + end end