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 19 def activate
20 20 @user = User.find_by_activation_code(params[:activation_code]) if params[:activation_code]
21 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 24 else
25 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 27 end
28 28 end
29 29  
... ... @@ -78,8 +78,7 @@ class AccountController < ApplicationController
78 78 invitation.update_attributes!({:friend => @user.person})
79 79 invitation.finish
80 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 82 end
84 83 rescue ActiveRecord::RecordInvalid
85 84 @person.valid?
... ...
app/models/user.rb
... ... @@ -37,6 +37,7 @@ class User < ActiveRecord::Base
37 37 user.person.save!
38 38 end
39 39 after_create :deliver_activation_code
  40 + after_create :delay_activation_check
40 41  
41 42 attr_writer :person_data
42 43 def person_data
... ... @@ -290,4 +291,8 @@ class User < ActiveRecord::Base
290 291 def deliver_activation_code
291 292 User::Mailer.deliver_activation_code(self) unless self.activation_code.blank?
292 293 end
  294 +
  295 + def delay_activation_check
  296 + Delayed::Job.enqueue(UserActivationJob.new(self.id), 0, 72.hours.from_now)
  297 + end
293 298 end
... ...
app/views/account/login.rhtml
... ... @@ -5,6 +5,8 @@
5 5 <% @user ||= User.new %>
6 6 <% is_thickbox ||= false %>
7 7  
  8 +<%= @message %>
  9 +
8 10 <% labelled_form_for :user, @user, :url => login_url do |f| %>
9 11  
10 12 <%= f.text_field :login, :id => 'main_user_login', :onchange => 'this.value = convToValidLogin( this.value )', :value => params[:userlogin] %>
... ...
app/views/account/signup.rhtml
1 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 @@
  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 70 def test_should_allow_signup
71 71 assert_difference User, :count do
72 72 new_user
73   - assert_response :redirect
  73 + assert_response :success
  74 + assert_not_nil assigns(:register_pending)
74 75 end
75 76 end
76 77  
... ... @@ -79,6 +80,7 @@ class AccountControllerTest &lt; Test::Unit::TestCase
79 80 new_user(:login => nil)
80 81 assert assigns(:user).errors.on(:login)
81 82 assert_response :success
  83 + assert_nil assigns(:register_pending)
82 84 end
83 85 end
84 86  
... ... @@ -87,6 +89,7 @@ class AccountControllerTest &lt; Test::Unit::TestCase
87 89 new_user(:password => nil)
88 90 assert assigns(:user).errors.on(:password)
89 91 assert_response :success
  92 + assert_nil assigns(:register_pending)
90 93 end
91 94 end
92 95  
... ... @@ -95,6 +98,7 @@ class AccountControllerTest &lt; Test::Unit::TestCase
95 98 new_user(:password_confirmation => nil)
96 99 assert assigns(:user).errors.on(:password_confirmation)
97 100 assert_response :success
  101 + assert_nil assigns(:register_pending)
98 102 end
99 103 end
100 104  
... ... @@ -103,6 +107,7 @@ class AccountControllerTest &lt; Test::Unit::TestCase
103 107 new_user(:email => nil)
104 108 assert assigns(:user).errors.on(:email)
105 109 assert_response :success
  110 + assert_nil assigns(:register_pending)
106 111 end
107 112 end
108 113  
... ... @@ -111,6 +116,7 @@ class AccountControllerTest &lt; Test::Unit::TestCase
111 116 Environment.default.update_attributes(:terms_of_use => 'some terms ...')
112 117 new_user
113 118 assert_response :success
  119 + assert_nil assigns(:register_pending)
114 120 end
115 121 end
116 122  
... ... @@ -118,7 +124,8 @@ class AccountControllerTest &lt; Test::Unit::TestCase
118 124 assert_difference User, :count do
119 125 Environment.default.update_attributes(:terms_of_use => 'some terms ...')
120 126 new_user(:terms_accepted => '1')
121   - assert_response :redirect
  127 + assert_response :success
  128 + assert_not_nil assigns(:register_pending)
122 129 end
123 130 end
124 131  
... ... @@ -643,7 +650,7 @@ class AccountControllerTest &lt; Test::Unit::TestCase
643 650 Person.any_instance.stubs(:required_fields).returns(['organization'])
644 651 assert_difference User, :count do
645 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 654 end
648 655 assert_equal 'example.com', Person['testuser'].organization
649 656 end
... ... @@ -692,7 +699,8 @@ class AccountControllerTest &lt; Test::Unit::TestCase
692 699 should 'activate user when activation code is present and correct' do
693 700 user = User.create! :login => 'testuser', :password => 'test123', :password_confirmation => 'test123', :email => 'test@test.org'
694 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 704 post :login, :user => {:login => 'testuser', :password => 'test123'}
697 705 assert_not_nil session[:user]
698 706 assert_redirected_to :controller => 'profile_editor', :profile => 'testuser'
... ... @@ -702,6 +710,7 @@ class AccountControllerTest &lt; Test::Unit::TestCase
702 710 @request.env["HTTP_REFERER"] = '/bli'
703 711 user = User.create! :login => 'testuser', :password => 'test123', :password_confirmation => 'test123', :email => 'test@test.org'
704 712 get :activate
  713 + assert_nil assigns(:message)
705 714 post :login, :user => {:login => 'testuser', :password => 'test123'}
706 715 assert_nil session[:user]
707 716 assert_redirected_to '/bli'
... ... @@ -711,6 +720,7 @@ class AccountControllerTest &lt; Test::Unit::TestCase
711 720 @request.env["HTTP_REFERER"] = '/bli'
712 721 user = User.create! :login => 'testuser', :password => 'test123', :password_confirmation => 'test123', :email => 'test@test.org'
713 722 get :activate, :activation_code => 'wrongcode'
  723 + assert_nil assigns(:message)
714 724 post :login, :user => {:login => 'testuser', :password => 'test123'}
715 725 assert_nil session[:user]
716 726 assert_redirected_to '/bli'
... ...
test/integration/signup_test.rb
... ... @@ -24,10 +24,8 @@ class SignupTest &lt; ActionController::IntegrationTest
24 24 assert_equal mail_count, ActionMailer::Base.deliveries.count
25 25  
26 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 29 assert_equal count + 1, User.count
32 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 13 assert_response :success
14 14  
15 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 18 assert_tag :tag => 'a', :attributes => { :href => /^\/account\/login/ }
20 19 end
21 20  
... ...
test/unit/user_activation_job_test.rb 0 → 100644
... ... @@ -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 472 assert user.activated?
473 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 481 protected
476 482 def new_user(options = {})
477 483 user = User.new({ :login => 'quire', :email => 'quire@example.com', :password => 'quire', :password_confirmation => 'quire' }.merge(options))
... ...