Commit 7bac7ef7dcdee879741ea74da7f334be2e5bc8ca
Committed by
Daniela Feitosa
1 parent
54151a76
Exists in
master
and in
29 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)) | ... | ... |