Commit 7bac7ef7dcdee879741ea74da7f334be2e5bc8ca
Committed by
Daniela Feitosa
1 parent
54151a76
Exists in
master
and in
8 other branches
adding some hotspots to make the openid plugin works.
Showing
10 changed files
with
285 additions
and
40 deletions
Show diff stats
app/controllers/public/account_controller.rb
... | ... | @@ -25,11 +25,13 @@ class AccountController < ApplicationController |
25 | 25 | |
26 | 26 | # action to perform login to the application |
27 | 27 | def login |
28 | - @user = User.new | |
29 | - @person = @user.build_person | |
30 | 28 | store_location(request.referer) unless session[:return_to] |
31 | 29 | return unless request.post? |
32 | - self.current_user = User.authenticate(params[:user][:login], params[:user][:password], environment) if params[:user] | |
30 | + | |
31 | + self.current_user = plugins_alternative_authentication | |
32 | + | |
33 | + self.current_user ||= User.authenticate(params[:user][:login], params[:user][:password], environment) if params[:user] | |
34 | + | |
33 | 35 | if logged_in? |
34 | 36 | if params[:remember_me] == "1" |
35 | 37 | self.current_user.remember_me |
... | ... | @@ -41,7 +43,6 @@ class AccountController < ApplicationController |
41 | 43 | end |
42 | 44 | else |
43 | 45 | session[:notice] = _('Incorrect username or password') if redirect? |
44 | - redirect_to :back if redirect? | |
45 | 46 | end |
46 | 47 | end |
47 | 48 | |
... | ... | @@ -56,6 +57,10 @@ class AccountController < ApplicationController |
56 | 57 | |
57 | 58 | # action to register an user to the application |
58 | 59 | def signup |
60 | + if @plugins.dispatch(:allow_user_registration).include?(false) | |
61 | + redirect_back_or_default(:controller => 'home') | |
62 | + end | |
63 | + | |
59 | 64 | @invitation_code = params[:invitation_code] |
60 | 65 | begin |
61 | 66 | if params[:user] |
... | ... | @@ -125,6 +130,9 @@ class AccountController < ApplicationController |
125 | 130 | # |
126 | 131 | # Posts back. |
127 | 132 | def forgot_password |
133 | + if @plugins.dispatch(:allow_password_recovery).include?(false) | |
134 | + redirect_back_or_default(:controller => 'home') | |
135 | + end | |
128 | 136 | @change_password = ChangePassword.new(params[:change_password]) |
129 | 137 | |
130 | 138 | if request.post? |
... | ... | @@ -316,4 +324,13 @@ class AccountController < ApplicationController |
316 | 324 | end |
317 | 325 | end |
318 | 326 | |
327 | + def plugins_alternative_authentication | |
328 | + user = nil | |
329 | + @plugins.each do |plugin| | |
330 | + user = plugin.alternative_authentication | |
331 | + break unless user.nil? | |
332 | + end | |
333 | + user | |
334 | + end | |
335 | + | |
319 | 336 | end | ... | ... |
app/models/person.rb
... | ... | @@ -71,10 +71,7 @@ class Person < Profile |
71 | 71 | Friendship.find(:all, :conditions => { :friend_id => person.id}).each { |friendship| friendship.destroy } |
72 | 72 | end |
73 | 73 | |
74 | - after_destroy :destroy_user | |
75 | - def destroy_user | |
76 | - self.user.destroy if self.user | |
77 | - end | |
74 | + belongs_to :user, :dependent => :delete | |
78 | 75 | |
79 | 76 | def can_control_scrap?(scrap) |
80 | 77 | begin | ... | ... |
app/models/user.rb
... | ... | @@ -30,7 +30,7 @@ class User < ActiveRecord::Base |
30 | 30 | |
31 | 31 | after_create do |user| |
32 | 32 | user.person ||= Person.new |
33 | - user.person.attributes = user.person_data.merge(:identifier => user.login, :user_id => user.id, :environment_id => user.environment_id) | |
33 | + user.person.attributes = user.person_data.merge(:identifier => user.login, :user => user, :environment_id => user.environment_id) | |
34 | 34 | user.person.name ||= user.login |
35 | 35 | user.person.visible = false unless user.activated? |
36 | 36 | user.person.save! |
... | ... | @@ -88,13 +88,13 @@ class User < ActiveRecord::Base |
88 | 88 | attr_protected :activated_at |
89 | 89 | |
90 | 90 | # Virtual attribute for the unencrypted password |
91 | - attr_accessor :password | |
91 | + attr_accessor :password, :name | |
92 | 92 | |
93 | 93 | validates_presence_of :login, :email |
94 | 94 | validates_format_of :login, :with => Profile::IDENTIFIER_FORMAT, :if => (lambda {|user| !user.login.blank?}) |
95 | 95 | validates_presence_of :password, :if => :password_required? |
96 | - validates_presence_of :password_confirmation, :if => :password_required?, :if => (lambda {|user| !user.password.blank?}) | |
97 | - validates_length_of :password, :within => 4..40, :if => :password_required?, :if => (lambda {|user| !user.password.blank?}) | |
96 | + validates_presence_of :password_confirmation, :if => :password_required? | |
97 | + validates_length_of :password, :within => 4..40, :if => :password_required? | |
98 | 98 | validates_confirmation_of :password, :if => :password_required? |
99 | 99 | validates_length_of :login, :within => 2..40, :if => (lambda {|user| !user.login.blank?}) |
100 | 100 | validates_length_of :email, :within => 3..100, :if => (lambda {|user| !user.email.blank?}) |
... | ... | @@ -228,7 +228,12 @@ class User < ActiveRecord::Base |
228 | 228 | end |
229 | 229 | |
230 | 230 | def name |
231 | - person ? person.name : login | |
231 | + name = (self[:name] || login) | |
232 | + person.nil? ? name : (person.name || name) | |
233 | + end | |
234 | + | |
235 | + def name= name | |
236 | + self[:name] = name | |
232 | 237 | end |
233 | 238 | |
234 | 239 | def enable_email! |
... | ... | @@ -274,6 +279,11 @@ class User < ActiveRecord::Base |
274 | 279 | 15 # in minutes |
275 | 280 | end |
276 | 281 | |
282 | + | |
283 | + def not_require_password! | |
284 | + @is_password_required = false | |
285 | + end | |
286 | + | |
277 | 287 | protected |
278 | 288 | # before filter |
279 | 289 | def encrypt_password |
... | ... | @@ -282,9 +292,13 @@ class User < ActiveRecord::Base |
282 | 292 | self.password_type ||= User.system_encryption_method.to_s |
283 | 293 | self.crypted_password = encrypt(password) |
284 | 294 | end |
285 | - | |
295 | + | |
286 | 296 | def password_required? |
287 | - crypted_password.blank? || !password.blank? | |
297 | + (crypted_password.blank? || !password.blank?) && is_password_required? | |
298 | + end | |
299 | + | |
300 | + def is_password_required? | |
301 | + @is_password_required.nil? ? true : @is_password_required | |
288 | 302 | end |
289 | 303 | |
290 | 304 | def make_activation_code | ... | ... |
app/views/account/login.rhtml
... | ... | @@ -13,6 +13,8 @@ |
13 | 13 | |
14 | 14 | <%= f.password_field :password %> |
15 | 15 | |
16 | + <%= @plugins.dispatch(:login_extra_contents).collect { |content| instance_eval(&content) }.join("") %> | |
17 | + | |
16 | 18 | <% button_bar do %> |
17 | 19 | <%= submit_button( 'login', _('Log in') )%> |
18 | 20 | <% if is_thickbox %> |
... | ... | @@ -23,8 +25,13 @@ |
23 | 25 | <% end %> |
24 | 26 | |
25 | 27 | <% button_bar do %> |
26 | - <%= button :add, _("New user"), :controller => 'account', :action => 'signup' %> | |
27 | - <%= button :help, _("I forgot my password!"), :controller => 'account', :action => 'forgot_password' %> | |
28 | + <% unless @plugins.dispatch(:allow_user_registration).include?(false) %> | |
29 | + <%= button :add, _("New user"), :controller => 'account', :action => 'signup' %> | |
30 | + <% end %> | |
31 | + | |
32 | + <% unless @plugins.dispatch(:allow_password_recovery).include?(false) %> | |
33 | + <%= button :help, _("I forgot my password!"), :controller => 'account', :action => 'forgot_password' %> | |
34 | + <% end %> | |
28 | 35 | <% end %> |
29 | 36 | |
30 | 37 | </div><!-- end class="login-box" --> | ... | ... |
app/views/layouts/application-ng.rhtml
... | ... | @@ -56,10 +56,18 @@ |
56 | 56 | <%= usermenu_logged_in %> |
57 | 57 | </span> |
58 | 58 | <span class='not-logged-in' style='display: none'> |
59 | - <%= _("<span class='login'>%s</span> <span class='or'>or</span> <span class='signup'>%s</span>") % [thickbox_inline_popup_link('<i class="icon-menu-login"></i><strong>' + _('Login') + '</strong>', login_url, 'inlineLoginBox', :id => 'link_login'), link_to('<strong>' + _('Sign up') + '</strong>', :controller => 'account', :action => 'signup') ] %> | |
59 | + | |
60 | + <%= _("<span class='login'>%s</span>") % thickbox_inline_popup_link('<i class="icon-menu-login"></i><strong>' + _('Login') + '</strong>', login_url, 'inlineLoginBox', :id => 'link_login') %> | |
61 | + <%= @plugins.dispatch(:alternative_authentication_link).collect { |content| instance_eval(&content) }.join("") %> | |
62 | + | |
60 | 63 | <div id='inlineLoginBox' style='display: none;'> |
61 | 64 | <%= render :file => 'account/login', :locals => { :is_thickbox => true } %> |
62 | 65 | </div> |
66 | + | |
67 | + <% unless @plugins.dispatch(:allow_user_registration).include?(false) %> | |
68 | + <%= _("<span class='or'>or</span> <span class='signup'>%s</span>") % link_to('<strong>' + _('Sign up') + '</strong>', :controller => 'account', :action => 'signup')%> | |
69 | + <% end %> | |
70 | + | |
63 | 71 | </span> |
64 | 72 | <form action="/search" class="search_form" method="get" class="clean"> |
65 | 73 | <input name="query" size="15" title="<%=_('Search...')%>" onfocus="this.form.className='focused';" onblur="this.form.className=''" /> | ... | ... |
config/routes.rb
... | ... | @@ -19,6 +19,7 @@ ActionController::Routing::Routes.draw do |map| |
19 | 19 | |
20 | 20 | # -- just remember to delete public/index.html. |
21 | 21 | # You can have the root of your site routed by hooking up '' |
22 | + map.root :controller => "home", :conditions => { :if => lambda { |env| !Domain.hosting_profile_at(env[:host]) } } | |
22 | 23 | map.connect '', :controller => "home", :conditions => { :if => lambda { |env| !Domain.hosting_profile_at(env[:host]) } } |
23 | 24 | map.home 'site/:action', :controller => 'home' |
24 | 25 | ... | ... |
lib/noosfero/plugin.rb
... | ... | @@ -320,6 +320,37 @@ class Noosfero::Plugin |
320 | 320 | nil |
321 | 321 | end |
322 | 322 | |
323 | + # -> Add an alternative authentication method. | |
324 | + # Your plugin have to make the access control and return the logged user. | |
325 | + # returns = User | |
326 | + def alternative_authentication | |
327 | + nil | |
328 | + end | |
329 | + | |
330 | + # -> Adds adicional link to make the user authentication | |
331 | + # returns = lambda block that creates html code | |
332 | + def alternative_authentication_link | |
333 | + nil | |
334 | + end | |
335 | + | |
336 | + # -> Allow or not user registration | |
337 | + # returns = boolean | |
338 | + def allow_user_registration | |
339 | + true | |
340 | + end | |
341 | + | |
342 | + # -> Allow or not password recovery by users | |
343 | + # returns = boolean | |
344 | + def allow_password_recovery | |
345 | + true | |
346 | + end | |
347 | + | |
348 | + # -> Adds fields to the login form | |
349 | + # returns = lambda block that creates html code | |
350 | + def login_extra_contents | |
351 | + nil | |
352 | + end | |
353 | + | |
323 | 354 | def method_missing(method, *args, &block) |
324 | 355 | # This is a generic hotspot for all controllers on Noosfero. |
325 | 356 | # If any plugin wants to define filters to run on any controller, the name of | ... | ... |
test/functional/account_controller_test.rb
... | ... | @@ -11,6 +11,10 @@ class AccountControllerTest < ActionController::TestCase |
11 | 11 | |
12 | 12 | all_fixtures |
13 | 13 | |
14 | + def teardown | |
15 | + Thread.current[:enabled_plugins] = nil | |
16 | + end | |
17 | + | |
14 | 18 | def setup |
15 | 19 | @controller = AccountController.new |
16 | 20 | @request = ActionController::TestRequest.new |
... | ... | @@ -31,13 +35,11 @@ class AccountControllerTest < ActionController::TestCase |
31 | 35 | assert_response :redirect |
32 | 36 | end |
33 | 37 | |
34 | - should 'redirect to where user was on login' do | |
35 | - @request.env["HTTP_REFERER"] = '/bli' | |
36 | - u = new_user | |
38 | + should 'display notice message if the login fail' do | |
37 | 39 | @controller.stubs(:logged_in?).returns(false) |
38 | 40 | post :login, :user => {:login => 'quire', :password => 'quire'} |
39 | 41 | |
40 | - assert_redirected_to '/bli' | |
42 | + assert session[:notice].include?('Incorrect') | |
41 | 43 | end |
42 | 44 | |
43 | 45 | should 'authenticate on the current environment' do |
... | ... | @@ -46,23 +48,11 @@ class AccountControllerTest < ActionController::TestCase |
46 | 48 | post :login, :user => { :login => 'fake', :password => 'fake' } |
47 | 49 | end |
48 | 50 | |
49 | - should 'redirect to where was when login on other environment' do | |
50 | - e = fast_create(Environment, :name => 'other_environment') | |
51 | - e.domains << Domain.new(:name => 'other.environment') | |
52 | - e.save! | |
53 | - u = create_user('test_user', :environment => e).person | |
54 | - | |
55 | - @request.env["HTTP_REFERER"] = '/bli' | |
56 | - post :login, :user => {:login => 'test_user', :password => 'test_user'} | |
57 | - | |
58 | - assert_redirected_to '/bli' | |
59 | - end | |
60 | - | |
61 | 51 | def test_should_fail_login_and_not_redirect |
62 | 52 | @request.env["HTTP_REFERER"] = 'bli' |
63 | 53 | post :login, :user => {:login => 'johndoe', :password => 'bad password'} |
64 | 54 | assert_nil session[:user] |
65 | - assert_response :redirect | |
55 | + assert_response :success | |
66 | 56 | end |
67 | 57 | |
68 | 58 | def test_should_allow_signup |
... | ... | @@ -697,7 +687,6 @@ class AccountControllerTest < ActionController::TestCase |
697 | 687 | assert_nil assigns(:message) |
698 | 688 | post :login, :user => {:login => 'testuser', :password => 'test123'} |
699 | 689 | assert_nil session[:user] |
700 | - assert_redirected_to '/bli' | |
701 | 690 | end |
702 | 691 | |
703 | 692 | should 'not activate user when activation code is incorrect' do |
... | ... | @@ -707,7 +696,6 @@ class AccountControllerTest < ActionController::TestCase |
707 | 696 | assert_nil assigns(:message) |
708 | 697 | post :login, :user => {:login => 'testuser', :password => 'test123'} |
709 | 698 | assert_nil session[:user] |
710 | - assert_redirected_to '/bli' | |
711 | 699 | end |
712 | 700 | |
713 | 701 | should 'be able to upload an image' do |
... | ... | @@ -777,6 +765,122 @@ class AccountControllerTest < ActionController::TestCase |
777 | 765 | assert_tag :tag => 'strong', :content => 'Plugin2 text' |
778 | 766 | end |
779 | 767 | |
768 | + should 'login with an alternative authentication defined by plugin' do | |
769 | + class Plugin1 < Noosfero::Plugin | |
770 | + def alternative_authentication | |
771 | + User.new(:login => 'testuser') | |
772 | + end | |
773 | + end | |
774 | + Environment.default.enable_plugin(Plugin1.name) | |
775 | + | |
776 | + post :login, :user => {:login => "testuser"} | |
777 | + | |
778 | + assert_equal 'testuser', assigns(:current_user).login | |
779 | + assert_response :redirect | |
780 | + end | |
781 | + | |
782 | + should "login with the default autentication if the alternative authentication method doesn't login the user" do | |
783 | + class Plugin1 < Noosfero::Plugin | |
784 | + def alternative_authentication | |
785 | + nil | |
786 | + end | |
787 | + end | |
788 | + Environment.default.enable_plugin(Plugin1.name) | |
789 | + post :login, :user => {:login => 'johndoe', :password => 'test'} | |
790 | + assert session[:user] | |
791 | + assert_equal 'johndoe', assigns(:current_user).login | |
792 | + assert_response :redirect | |
793 | + end | |
794 | + | |
795 | + should "redirect user on signup if a plugin doesn't allow user registration" do | |
796 | + class TestRegistrationPlugin < Noosfero::Plugin | |
797 | + def allow_user_registration | |
798 | + false | |
799 | + end | |
800 | + end | |
801 | + Noosfero::Plugin::Manager.any_instance.stubs(:enabled_plugins).returns([TestRegistrationPlugin.new]) | |
802 | + | |
803 | + post :signup, :user => { :login => 'testuser', :password => '123456', :password_confirmation => '123456', :email => 'testuser@example.com' } | |
804 | + assert_response :redirect | |
805 | + end | |
806 | + | |
807 | + should "not display the new user button on login page if not allowed by any plugin" do | |
808 | + class Plugin1 < Noosfero::Plugin | |
809 | + def allow_user_registration | |
810 | + false | |
811 | + end | |
812 | + end | |
813 | + | |
814 | + class Plugin2 < Noosfero::Plugin | |
815 | + def allow_user_registration | |
816 | + true | |
817 | + end | |
818 | + end | |
819 | + Noosfero::Plugin::Manager.any_instance.stubs(:enabled_plugins).returns([Plugin1.new, Plugin2.new]) | |
820 | + | |
821 | + get :login | |
822 | + | |
823 | + assert_no_tag :tag => 'a', :attributes => {:href => '/account/signup'} | |
824 | + end | |
825 | + | |
826 | + should "redirect user on forgot_password action if a plugin doesn't allow user to recover its password" do | |
827 | + class TestRegistrationPlugin < Noosfero::Plugin | |
828 | + def allow_password_recovery | |
829 | + false | |
830 | + end | |
831 | + end | |
832 | + Noosfero::Plugin::Manager.any_instance.stubs(:enabled_plugins).returns([TestRegistrationPlugin.new]) | |
833 | + | |
834 | + #Redirect on get action | |
835 | + get :forgot_password | |
836 | + assert_response :redirect | |
837 | + | |
838 | + #Redirect on post action | |
839 | + post :forgot_password, :change_password => { :login => 'test', :email => 'test@localhost.localdomain' } | |
840 | + assert_response :redirect | |
841 | + end | |
842 | + | |
843 | + should "not display the forgot password button on login page if not allowed by any plugin" do | |
844 | + class Plugin1 < Noosfero::Plugin | |
845 | + def allow_password_recovery | |
846 | + false | |
847 | + end | |
848 | + end | |
849 | + | |
850 | + class Plugin2 < Noosfero::Plugin | |
851 | + def allow_password_recovery | |
852 | + true | |
853 | + end | |
854 | + end | |
855 | + Noosfero::Plugin::Manager.any_instance.stubs(:enabled_plugins).returns([Plugin1.new, Plugin2.new]) | |
856 | + | |
857 | + get :login | |
858 | + | |
859 | + assert_no_tag :tag => 'a', :attributes => {:href => '/account/forgot_password'} | |
860 | + end | |
861 | + | |
862 | + should 'add extra content on login form from plugins' do | |
863 | + class Plugin1 < Noosfero::Plugin | |
864 | + def login_extra_contents | |
865 | + lambda {"<strong>Plugin1 text</strong>"} | |
866 | + end | |
867 | + end | |
868 | + class Plugin2 < Noosfero::Plugin | |
869 | + def login_extra_contents | |
870 | + lambda {"<strong>Plugin2 text</strong>"} | |
871 | + end | |
872 | + end | |
873 | + | |
874 | + Environment.default.enable_plugin(Plugin1.name) | |
875 | + Environment.default.enable_plugin(Plugin2.name) | |
876 | + | |
877 | + get :login | |
878 | + | |
879 | + assert_tag :tag => 'strong', :content => 'Plugin1 text' | |
880 | + assert_tag :tag => 'strong', :content => 'Plugin2 text' | |
881 | + end | |
882 | + | |
883 | + | |
780 | 884 | protected |
781 | 885 | def new_user(options = {}, extra_options ={}) |
782 | 886 | data = {:profile_data => person_data} | ... | ... |
test/functional/home_controller_test.rb
... | ... | @@ -6,8 +6,11 @@ class HomeController; def rescue_action(e) raise e end; end |
6 | 6 | |
7 | 7 | class HomeControllerTest < ActionController::TestCase |
8 | 8 | |
9 | -# all_fixtures:profiles, :environments, :domains | |
10 | -all_fixtures | |
9 | + def teardown | |
10 | + Thread.current[:enabled_plugins] = nil | |
11 | + end | |
12 | + | |
13 | + all_fixtures | |
11 | 14 | def setup |
12 | 15 | @controller = HomeController.new |
13 | 16 | @request = ActionController::TestRequest.new |
... | ... | @@ -93,4 +96,44 @@ all_fixtures |
93 | 96 | assert_tag :content => /Noosfero terms of use/ |
94 | 97 | end |
95 | 98 | |
99 | + should 'provide a link to make the user authentication' do | |
100 | + class Plugin1 < Noosfero::Plugin | |
101 | + def alternative_authentication_link | |
102 | + lambda {"<a href='plugin1'>Plugin1 link</a>"} | |
103 | + end | |
104 | + end | |
105 | + class Plugin2 < Noosfero::Plugin | |
106 | + def alternative_authentication_link | |
107 | + lambda {"<a href='plugin2'>Plugin2 link</a>"} | |
108 | + end | |
109 | + end | |
110 | + | |
111 | + Environment.default.enable_plugin(Plugin1) | |
112 | + Environment.default.enable_plugin(Plugin2) | |
113 | + | |
114 | + get :index | |
115 | + | |
116 | + assert_tag :tag => 'a', :content => 'Plugin1 link' | |
117 | + assert_tag :tag => 'a', :content => 'Plugin2 link' | |
118 | + end | |
119 | + | |
120 | + should "not display the new user button on login page if now allowed by any plugin" do | |
121 | + class Plugin1 < Noosfero::Plugin | |
122 | + def allow_user_registration | |
123 | + false | |
124 | + end | |
125 | + end | |
126 | + | |
127 | + class Plugin2 < Noosfero::Plugin | |
128 | + def allow_user_registration | |
129 | + true | |
130 | + end | |
131 | + end | |
132 | + Noosfero::Plugin::Manager.any_instance.stubs(:enabled_plugins).returns([Plugin1.new, Plugin2.new]) | |
133 | + | |
134 | + get :index | |
135 | + | |
136 | + assert_no_tag :tag => 'a', :attributes => {:href => '/account/signup'} | |
137 | + end | |
138 | + | |
96 | 139 | end | ... | ... |
test/unit/user_test.rb
... | ... | @@ -403,12 +403,29 @@ class UserTest < ActiveSupport::TestCase |
403 | 403 | assert_equal 'Test User', user.name |
404 | 404 | end |
405 | 405 | |
406 | - should 'respond name with login, if there is no person related' do | |
406 | + should 'respond name with login, if there is no person related and name defined' do | |
407 | 407 | user = create_user('testuser') |
408 | 408 | user.person = nil |
409 | + user.name = nil | |
409 | 410 | assert_equal 'testuser', user.name |
410 | 411 | end |
411 | 412 | |
413 | + should 'respond name with user name attribute' do | |
414 | + user = create_user('testuser') | |
415 | + user.person = nil | |
416 | + user.name = 'Another User' | |
417 | + user.login = 'Login User' | |
418 | + assert_equal 'Another User', user.name | |
419 | + end | |
420 | + | |
421 | + should 'respond name with related person name although user name attribute is defined' do | |
422 | + user = create_user('testuser') | |
423 | + user.person.name = 'Person Name' | |
424 | + user.name = 'Another User' | |
425 | + user.login = 'Login User' | |
426 | + assert_equal 'Person Name', user.name | |
427 | + end | |
428 | + | |
412 | 429 | should 'have activation code' do |
413 | 430 | user = create_user('testuser') |
414 | 431 | assert_respond_to user, :activation_code |
... | ... | @@ -499,6 +516,12 @@ class UserTest < ActiveSupport::TestCase |
499 | 516 | assert !user.activate |
500 | 517 | end |
501 | 518 | |
519 | + should 'be able to skip the password requirement' do | |
520 | + user = User.new(:login => 'quire', :email => 'quire@example.com') | |
521 | + user.not_require_password! | |
522 | + assert user.save! | |
523 | + end | |
524 | + | |
502 | 525 | protected |
503 | 526 | def new_user(options = {}) |
504 | 527 | user = User.new({ :login => 'quire', :email => 'quire@example.com', :password => 'quire', :password_confirmation => 'quire' }.merge(options)) | ... | ... |