Commit 647ca1a57898e6d942ff3f8cf79595e76a7a3939

Authored by Caio SBA
1 parent ab83d73d

Show message in view instead of flash and remove user after 72 hours without activation

app/controllers/public/account_controller.rb
@@ -19,11 +19,11 @@ class AccountController < ApplicationController @@ -19,11 +19,11 @@ class AccountController < ApplicationController
19 def activate 19 def activate
20 @user = User.find_by_activation_code(params[:activation_code]) if params[:activation_code] 20 @user = User.find_by_activation_code(params[:activation_code]) if params[:activation_code]
21 if @user and @user.activate 21 if @user and @user.activate
22 - session[:notice] = _("Your account has been activated, now you can log in!")  
23 - redirect_to :action => 'login', :userlogin => @user.login 22 + @message = _("Your account has been activated, now you can log in!")
  23 + render :action => 'login', :userlogin => @user.login
24 else 24 else
25 session[:notice] = _("It looks like you're trying to activate an account. Perhaps have already activated this account?") 25 session[:notice] = _("It looks like you're trying to activate an account. Perhaps have already activated this account?")
26 - redirect_back_or_default(:controller => 'home') 26 + redirect_to :controller => :home
27 end 27 end
28 end 28 end
29 29
@@ -78,8 +78,7 @@ class AccountController < ApplicationController @@ -78,8 +78,7 @@ class AccountController < ApplicationController
78 invitation.update_attributes!({:friend => @user.person}) 78 invitation.update_attributes!({:friend => @user.person})
79 invitation.finish 79 invitation.finish
80 end 80 end
81 - session[:notice] = _("Thanks for signing up! Now go to your e-mail and activate your account.")  
82 - redirect_back_or_default(:controller => 'home') 81 + @register_pending = true
83 end 82 end
84 rescue ActiveRecord::RecordInvalid 83 rescue ActiveRecord::RecordInvalid
85 @person.valid? 84 @person.valid?
app/models/user.rb
@@ -37,6 +37,7 @@ class User < ActiveRecord::Base @@ -37,6 +37,7 @@ class User < ActiveRecord::Base
37 user.person.save! 37 user.person.save!
38 end 38 end
39 after_create :deliver_activation_code 39 after_create :deliver_activation_code
  40 + after_create :delay_activation_check
40 41
41 attr_writer :person_data 42 attr_writer :person_data
42 def person_data 43 def person_data
@@ -290,4 +291,8 @@ class User < ActiveRecord::Base @@ -290,4 +291,8 @@ class User < ActiveRecord::Base
290 def deliver_activation_code 291 def deliver_activation_code
291 User::Mailer.deliver_activation_code(self) unless self.activation_code.blank? 292 User::Mailer.deliver_activation_code(self) unless self.activation_code.blank?
292 end 293 end
  294 +
  295 + def delay_activation_check
  296 + Delayed::Job.enqueue(UserActivationJob.new(self.id), 0, 72.hours.from_now)
  297 + end
293 end 298 end
app/views/account/login.rhtml
@@ -5,6 +5,8 @@ @@ -5,6 +5,8 @@
5 <% @user ||= User.new %> 5 <% @user ||= User.new %>
6 <% is_thickbox ||= false %> 6 <% is_thickbox ||= false %>
7 7
  8 +<%= @message %>
  9 +
8 <% labelled_form_for :user, @user, :url => login_url do |f| %> 10 <% labelled_form_for :user, @user, :url => login_url do |f| %>
9 11
10 <%= f.text_field :login, :id => 'main_user_login', :onchange => 'this.value = convToValidLogin( this.value )', :value => params[:userlogin] %> 12 <%= f.text_field :login, :id => 'main_user_login', :onchange => 'this.value = convToValidLogin( this.value )', :value => params[:userlogin] %>
app/views/account/signup.rhtml
1 <h1><%= _('Signup') %></h1> 1 <h1><%= _('Signup') %></h1>
2 -<%= render :partial => 'signup_form' %> 2 +<% if @register_pending %>
  3 + <%= _('Thanks for signing up! Now check your e-mail to activate your account!') %>
  4 + <p style="text-align: center"><%= link_to(_('Go to the homepage'), '/') %></p>
  5 +<% else %>
  6 + <%= render :partial => 'signup_form' %>
  7 +<% end %>
lib/user_activation_job.rb 0 → 100644
@@ -0,0 +1,6 @@ @@ -0,0 +1,6 @@
  1 +class UserActivationJob < Struct.new(:user_id)
  2 + def perform
  3 + user = User.find(user_id)
  4 + user.destroy unless user.activated?
  5 + end
  6 +end
test/functional/account_controller_test.rb
@@ -70,7 +70,8 @@ class AccountControllerTest &lt; Test::Unit::TestCase @@ -70,7 +70,8 @@ class AccountControllerTest &lt; Test::Unit::TestCase
70 def test_should_allow_signup 70 def test_should_allow_signup
71 assert_difference User, :count do 71 assert_difference User, :count do
72 new_user 72 new_user
73 - assert_response :redirect 73 + assert_response :success
  74 + assert_not_nil assigns(:register_pending)
74 end 75 end
75 end 76 end
76 77
@@ -79,6 +80,7 @@ class AccountControllerTest &lt; Test::Unit::TestCase @@ -79,6 +80,7 @@ class AccountControllerTest &lt; Test::Unit::TestCase
79 new_user(:login => nil) 80 new_user(:login => nil)
80 assert assigns(:user).errors.on(:login) 81 assert assigns(:user).errors.on(:login)
81 assert_response :success 82 assert_response :success
  83 + assert_nil assigns(:register_pending)
82 end 84 end
83 end 85 end
84 86
@@ -87,6 +89,7 @@ class AccountControllerTest &lt; Test::Unit::TestCase @@ -87,6 +89,7 @@ class AccountControllerTest &lt; Test::Unit::TestCase
87 new_user(:password => nil) 89 new_user(:password => nil)
88 assert assigns(:user).errors.on(:password) 90 assert assigns(:user).errors.on(:password)
89 assert_response :success 91 assert_response :success
  92 + assert_nil assigns(:register_pending)
90 end 93 end
91 end 94 end
92 95
@@ -95,6 +98,7 @@ class AccountControllerTest &lt; Test::Unit::TestCase @@ -95,6 +98,7 @@ class AccountControllerTest &lt; Test::Unit::TestCase
95 new_user(:password_confirmation => nil) 98 new_user(:password_confirmation => nil)
96 assert assigns(:user).errors.on(:password_confirmation) 99 assert assigns(:user).errors.on(:password_confirmation)
97 assert_response :success 100 assert_response :success
  101 + assert_nil assigns(:register_pending)
98 end 102 end
99 end 103 end
100 104
@@ -103,6 +107,7 @@ class AccountControllerTest &lt; Test::Unit::TestCase @@ -103,6 +107,7 @@ class AccountControllerTest &lt; Test::Unit::TestCase
103 new_user(:email => nil) 107 new_user(:email => nil)
104 assert assigns(:user).errors.on(:email) 108 assert assigns(:user).errors.on(:email)
105 assert_response :success 109 assert_response :success
  110 + assert_nil assigns(:register_pending)
106 end 111 end
107 end 112 end
108 113
@@ -111,6 +116,7 @@ class AccountControllerTest &lt; Test::Unit::TestCase @@ -111,6 +116,7 @@ class AccountControllerTest &lt; Test::Unit::TestCase
111 Environment.default.update_attributes(:terms_of_use => 'some terms ...') 116 Environment.default.update_attributes(:terms_of_use => 'some terms ...')
112 new_user 117 new_user
113 assert_response :success 118 assert_response :success
  119 + assert_nil assigns(:register_pending)
114 end 120 end
115 end 121 end
116 122
@@ -118,7 +124,8 @@ class AccountControllerTest &lt; Test::Unit::TestCase @@ -118,7 +124,8 @@ class AccountControllerTest &lt; Test::Unit::TestCase
118 assert_difference User, :count do 124 assert_difference User, :count do
119 Environment.default.update_attributes(:terms_of_use => 'some terms ...') 125 Environment.default.update_attributes(:terms_of_use => 'some terms ...')
120 new_user(:terms_accepted => '1') 126 new_user(:terms_accepted => '1')
121 - assert_response :redirect 127 + assert_response :success
  128 + assert_not_nil assigns(:register_pending)
122 end 129 end
123 end 130 end
124 131
@@ -643,7 +650,7 @@ class AccountControllerTest &lt; Test::Unit::TestCase @@ -643,7 +650,7 @@ class AccountControllerTest &lt; Test::Unit::TestCase
643 Person.any_instance.stubs(:required_fields).returns(['organization']) 650 Person.any_instance.stubs(:required_fields).returns(['organization'])
644 assert_difference User, :count do 651 assert_difference User, :count do
645 post :signup, :user => { :login => 'testuser', :password => '123456', :password_confirmation => '123456', :email => 'testuser@example.com' }, :profile_data => { :organization => 'example.com' } 652 post :signup, :user => { :login => 'testuser', :password => '123456', :password_confirmation => '123456', :email => 'testuser@example.com' }, :profile_data => { :organization => 'example.com' }
646 - assert_redirected_to :controller => 'home' 653 + assert_response :success
647 end 654 end
648 assert_equal 'example.com', Person['testuser'].organization 655 assert_equal 'example.com', Person['testuser'].organization
649 end 656 end
@@ -692,7 +699,8 @@ class AccountControllerTest &lt; Test::Unit::TestCase @@ -692,7 +699,8 @@ class AccountControllerTest &lt; Test::Unit::TestCase
692 should 'activate user when activation code is present and correct' do 699 should 'activate user when activation code is present and correct' do
693 user = User.create! :login => 'testuser', :password => 'test123', :password_confirmation => 'test123', :email => 'test@test.org' 700 user = User.create! :login => 'testuser', :password => 'test123', :password_confirmation => 'test123', :email => 'test@test.org'
694 get :activate, :activation_code => user.activation_code 701 get :activate, :activation_code => user.activation_code
695 - assert_redirected_to :action => :login, :userlogin => user.login 702 + assert_not_nil assigns(:message)
  703 + assert_response :success
696 post :login, :user => {:login => 'testuser', :password => 'test123'} 704 post :login, :user => {:login => 'testuser', :password => 'test123'}
697 assert_not_nil session[:user] 705 assert_not_nil session[:user]
698 assert_redirected_to :controller => 'profile_editor', :profile => 'testuser' 706 assert_redirected_to :controller => 'profile_editor', :profile => 'testuser'
@@ -702,6 +710,7 @@ class AccountControllerTest &lt; Test::Unit::TestCase @@ -702,6 +710,7 @@ class AccountControllerTest &lt; Test::Unit::TestCase
702 @request.env["HTTP_REFERER"] = '/bli' 710 @request.env["HTTP_REFERER"] = '/bli'
703 user = User.create! :login => 'testuser', :password => 'test123', :password_confirmation => 'test123', :email => 'test@test.org' 711 user = User.create! :login => 'testuser', :password => 'test123', :password_confirmation => 'test123', :email => 'test@test.org'
704 get :activate 712 get :activate
  713 + assert_nil assigns(:message)
705 post :login, :user => {:login => 'testuser', :password => 'test123'} 714 post :login, :user => {:login => 'testuser', :password => 'test123'}
706 assert_nil session[:user] 715 assert_nil session[:user]
707 assert_redirected_to '/bli' 716 assert_redirected_to '/bli'
@@ -711,6 +720,7 @@ class AccountControllerTest &lt; Test::Unit::TestCase @@ -711,6 +720,7 @@ class AccountControllerTest &lt; Test::Unit::TestCase
711 @request.env["HTTP_REFERER"] = '/bli' 720 @request.env["HTTP_REFERER"] = '/bli'
712 user = User.create! :login => 'testuser', :password => 'test123', :password_confirmation => 'test123', :email => 'test@test.org' 721 user = User.create! :login => 'testuser', :password => 'test123', :password_confirmation => 'test123', :email => 'test@test.org'
713 get :activate, :activation_code => 'wrongcode' 722 get :activate, :activation_code => 'wrongcode'
  723 + assert_nil assigns(:message)
714 post :login, :user => {:login => 'testuser', :password => 'test123'} 724 post :login, :user => {:login => 'testuser', :password => 'test123'}
715 assert_nil session[:user] 725 assert_nil session[:user]
716 assert_redirected_to '/bli' 726 assert_redirected_to '/bli'
test/integration/signup_test.rb
@@ -24,10 +24,8 @@ class SignupTest &lt; ActionController::IntegrationTest @@ -24,10 +24,8 @@ class SignupTest &lt; ActionController::IntegrationTest
24 assert_equal mail_count, ActionMailer::Base.deliveries.count 24 assert_equal mail_count, ActionMailer::Base.deliveries.count
25 25
26 post '/account/signup', :user => { :login => 'shouldaccepterms', :password => 'test', :password_confirmation => 'test', :email => 'shouldaccepterms@example.com', :terms_accepted => '1' }, :profile_data => person_data 26 post '/account/signup', :user => { :login => 'shouldaccepterms', :password => 'test', :password_confirmation => 'test', :email => 'shouldaccepterms@example.com', :terms_accepted => '1' }, :profile_data => person_data
27 - assert_response :redirect 27 + assert_response :success
28 28
29 - follow_redirect!  
30 - assert_response :redirect  
31 assert_equal count + 1, User.count 29 assert_equal count + 1, User.count
32 assert_equal mail_count + 1, ActionMailer::Base.deliveries.count 30 assert_equal mail_count + 1, ActionMailer::Base.deliveries.count
33 31
test/integration/user_registers_at_the_application_test.rb
@@ -13,9 +13,8 @@ class UserRegistersAtTheApplicationTest &lt; ActionController::IntegrationTest @@ -13,9 +13,8 @@ class UserRegistersAtTheApplicationTest &lt; ActionController::IntegrationTest
13 assert_response :success 13 assert_response :success
14 14
15 post '/account/signup', :user => { :login => 'mylogin', :password => 'mypassword', :password_confirmation => 'mypassword', :email => 'mylogin@example.com' } 15 post '/account/signup', :user => { :login => 'mylogin', :password => 'mypassword', :password_confirmation => 'mypassword', :email => 'mylogin@example.com' }
16 - assert_response :redirect 16 + assert_response :success
17 17
18 - follow_redirect!  
19 assert_tag :tag => 'a', :attributes => { :href => /^\/account\/login/ } 18 assert_tag :tag => 'a', :attributes => { :href => /^\/account\/login/ }
20 end 19 end
21 20
test/unit/user_activation_job_test.rb 0 → 100644
@@ -0,0 +1,39 @@ @@ -0,0 +1,39 @@
  1 +require File.dirname(__FILE__) + '/../test_helper'
  2 +
  3 +class NotifyActivityToProfilesJobTest < ActiveSupport::TestCase
  4 +
  5 + should 'create job on user creation' do
  6 + assert_difference Delayed::Job, :count, 1 do
  7 + user = new_user :login => 'test1'
  8 + assert_equal user.id, YAML.load(Delayed::Job.last.handler).user_id
  9 + end
  10 + process_delayed_job_queue
  11 + end
  12 +
  13 + should 'destroy user if not activated' do
  14 + user = new_user :login => 'test2'
  15 + job = UserActivationJob.new(user.id)
  16 + assert_difference User, :count, -1 do
  17 + job.perform
  18 + process_delayed_job_queue
  19 + end
  20 + end
  21 +
  22 + should 'not destroy user if activated' do
  23 + user = new_user :login => 'test3'
  24 + user.activate
  25 + job = UserActivationJob.new(user.id)
  26 + assert_no_difference User, :count do
  27 + job.perform
  28 + process_delayed_job_queue
  29 + end
  30 + end
  31 +
  32 + protected
  33 + def new_user(options = {})
  34 + user = User.new({ :login => 'quire', :email => 'quire@example.com', :password => 'quire', :password_confirmation => 'quire' }.merge(options))
  35 + user.save
  36 + user
  37 + end
  38 +
  39 +end
test/unit/user_test.rb
@@ -472,6 +472,12 @@ class UserTest &lt; Test::Unit::TestCase @@ -472,6 +472,12 @@ class UserTest &lt; Test::Unit::TestCase
472 assert user.activated? 472 assert user.activated?
473 end 473 end
474 474
  475 + should 'delay activation check' do
  476 + assert_difference Delayed::Job, :count, 1 do
  477 + user = new_user
  478 + end
  479 + end
  480 +
475 protected 481 protected
476 def new_user(options = {}) 482 def new_user(options = {})
477 user = User.new({ :login => 'quire', :email => 'quire@example.com', :password => 'quire', :password_confirmation => 'quire' }.merge(options)) 483 user = User.new({ :login => 'quire', :email => 'quire@example.com', :password => 'quire', :password_confirmation => 'quire' }.merge(options))