caleb-restful-authentication 1.1.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (54) hide show
  1. data/CHANGELOG +68 -0
  2. data/README.textile +240 -0
  3. data/Rakefile +32 -0
  4. data/TODO +15 -0
  5. data/generators/authenticated/USAGE +1 -0
  6. data/generators/authenticated/authenticated_generator.rb +508 -0
  7. data/generators/authenticated/lib/insert_routes.rb +54 -0
  8. data/generators/authenticated/templates/_model_partial.html.erb +8 -0
  9. data/generators/authenticated/templates/activation.erb +3 -0
  10. data/generators/authenticated/templates/authenticated_system.rb +189 -0
  11. data/generators/authenticated/templates/authenticated_test_helper.rb +22 -0
  12. data/generators/authenticated/templates/controller.rb +43 -0
  13. data/generators/authenticated/templates/helper.rb +2 -0
  14. data/generators/authenticated/templates/login.html.erb +21 -0
  15. data/generators/authenticated/templates/mailer.rb +33 -0
  16. data/generators/authenticated/templates/migration.rb +29 -0
  17. data/generators/authenticated/templates/model.rb +101 -0
  18. data/generators/authenticated/templates/model_controller.rb +117 -0
  19. data/generators/authenticated/templates/model_helper.rb +93 -0
  20. data/generators/authenticated/templates/model_helper_spec.rb +158 -0
  21. data/generators/authenticated/templates/observer.rb +14 -0
  22. data/generators/authenticated/templates/signup.html.erb +21 -0
  23. data/generators/authenticated/templates/signup_notification.erb +8 -0
  24. data/generators/authenticated/templates/site_keys.rb +38 -0
  25. data/generators/authenticated/templates/spec/controllers/access_control_spec.rb +90 -0
  26. data/generators/authenticated/templates/spec/controllers/authenticated_system_spec.rb +102 -0
  27. data/generators/authenticated/templates/spec/controllers/sessions_controller_spec.rb +139 -0
  28. data/generators/authenticated/templates/spec/controllers/users_controller_spec.rb +200 -0
  29. data/generators/authenticated/templates/spec/fixtures/users.yml +66 -0
  30. data/generators/authenticated/templates/spec/helpers/users_helper_spec.rb +141 -0
  31. data/generators/authenticated/templates/spec/models/user_spec.rb +295 -0
  32. data/generators/authenticated/templates/stories/rest_auth_stories.rb +22 -0
  33. data/generators/authenticated/templates/stories/rest_auth_stories_helper.rb +81 -0
  34. data/generators/authenticated/templates/stories/steps/ra_navigation_steps.rb +49 -0
  35. data/generators/authenticated/templates/stories/steps/ra_resource_steps.rb +179 -0
  36. data/generators/authenticated/templates/stories/steps/ra_response_steps.rb +171 -0
  37. data/generators/authenticated/templates/stories/steps/user_steps.rb +153 -0
  38. data/generators/authenticated/templates/stories/users/accounts.story +194 -0
  39. data/generators/authenticated/templates/stories/users/sessions.story +134 -0
  40. data/generators/authenticated/templates/test/functional_test.rb +82 -0
  41. data/generators/authenticated/templates/test/mailer_test.rb +31 -0
  42. data/generators/authenticated/templates/test/model_functional_test.rb +95 -0
  43. data/generators/authenticated/templates/test/unit_test.rb +166 -0
  44. data/init.rb +1 -0
  45. data/lib/authentication.rb +40 -0
  46. data/lib/authentication/by_cookie_token.rb +82 -0
  47. data/lib/authentication/by_password.rb +64 -0
  48. data/lib/authorization.rb +14 -0
  49. data/lib/authorization/aasm_roles.rb +64 -0
  50. data/lib/authorization/stateful_roles.rb +63 -0
  51. data/lib/trustification.rb +14 -0
  52. data/lib/trustification/email_validation.rb +20 -0
  53. data/rails/init.rb +6 -0
  54. metadata +115 -0
@@ -0,0 +1,90 @@
1
+ require File.dirname(__FILE__) + '<%= ('/..'*controller_class_nesting_depth) + '/../spec_helper' %>'
2
+ # Be sure to include AuthenticatedTestHelper in spec/spec_helper.rb instead
3
+ # Then, you can remove it from this and the units test.
4
+ include AuthenticatedTestHelper
5
+
6
+ #
7
+ # A test controller with and without access controls
8
+ #
9
+ class AccessControlTestController < ApplicationController
10
+ before_filter :login_required, :only => :login_is_required
11
+ def login_is_required
12
+ respond_to do |format|
13
+ @foo = { 'success' => params[:format]||'no fmt given'}
14
+ format.html do render :text => "success" end
15
+ format.xml do render :xml => @foo, :status => :ok end
16
+ format.json do render :json => @foo, :status => :ok end
17
+ end
18
+ end
19
+ def login_not_required
20
+ respond_to do |format|
21
+ @foo = { 'success' => params[:format]||'no fmt given'}
22
+ format.html do render :text => "success" end
23
+ format.xml do render :xml => @foo, :status => :ok end
24
+ format.json do render :json => @foo, :status => :ok end
25
+ end
26
+ end
27
+ end
28
+
29
+ #
30
+ # Access Control
31
+ #
32
+
33
+ ACCESS_CONTROL_FORMATS = [
34
+ ['', "success"],
35
+ ['xml', "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<hash>\n <success>xml</success>\n</hash>\n"],
36
+ ['json', "{\"success\": \"json\"}"],]
37
+ ACCESS_CONTROL_AM_I_LOGGED_IN = [
38
+ [:i_am_logged_in, :quentin],
39
+ [:i_am_not_logged_in, nil],]
40
+ ACCESS_CONTROL_IS_LOGIN_REQD = [
41
+ :login_not_required,
42
+ :login_is_required,]
43
+
44
+ describe AccessControlTestController do
45
+ fixtures :<%= table_name %>
46
+ before do
47
+ # is there a better way to do this?
48
+ ActionController::Routing::Routes.add_route '/login_is_required', :controller => 'access_control_test', :action => 'login_is_required'
49
+ ActionController::Routing::Routes.add_route '/login_not_required', :controller => 'access_control_test', :action => 'login_not_required'
50
+ end
51
+
52
+ ACCESS_CONTROL_FORMATS.each do |format, success_text|
53
+ ACCESS_CONTROL_AM_I_LOGGED_IN.each do |logged_in_status, <%= file_name %>_login|
54
+ ACCESS_CONTROL_IS_LOGIN_REQD.each do |login_reqd_status|
55
+ describe "requesting #{format.blank? ? 'html' : format}; #{logged_in_status.to_s.humanize} and #{login_reqd_status.to_s.humanize}" do
56
+ before do
57
+ logout_keeping_session!
58
+ @<%= file_name %> = format.blank? ? login_as(<%= file_name %>_login) : authorize_as(<%= file_name %>_login)
59
+ get login_reqd_status.to_s, :format => format
60
+ end
61
+
62
+ if ((login_reqd_status == :login_not_required) ||
63
+ (login_reqd_status == :login_is_required && logged_in_status == :i_am_logged_in))
64
+ it "succeeds" do
65
+ response.should have_text(success_text)
66
+ response.code.to_s.should == '200'
67
+ end
68
+
69
+ elsif (login_reqd_status == :login_is_required && logged_in_status == :i_am_not_logged_in)
70
+ if ['html', ''].include? format
71
+ it "redirects me to the log in page" do
72
+ response.should redirect_to('/<%= controller_routing_path %>/new')
73
+ end
74
+ else
75
+ it "returns 'Access denied' and a 406 (Access Denied) status code" do
76
+ response.should have_text("HTTP Basic: Access denied.\n")
77
+ response.code.to_s.should == '401'
78
+ end
79
+ end
80
+
81
+ else
82
+ warn "Oops no case for #{format} and #{logged_in_status.to_s.humanize} and #{login_reqd_status.to_s.humanize}"
83
+ end
84
+ end # describe
85
+
86
+ end
87
+ end
88
+ end # cases
89
+
90
+ end
@@ -0,0 +1,102 @@
1
+ require File.dirname(__FILE__) + '<%= ('/..'*controller_class_nesting_depth) + '/../spec_helper' %>'
2
+
3
+ # Be sure to include AuthenticatedTestHelper in spec/spec_helper.rb instead
4
+ # Then, you can remove it from this and the units test.
5
+ include AuthenticatedTestHelper
6
+ include AuthenticatedSystem
7
+ def action_name() end
8
+
9
+ describe <%= controller_class_name %>Controller do
10
+ fixtures :<%= table_name %>
11
+
12
+ before do
13
+ # FIXME -- <%= controller_file_name %> controller not testing xml logins
14
+ stub!(:authenticate_with_http_basic).and_return nil
15
+ end
16
+ describe "logout_killing_session!" do
17
+ before do
18
+ login_as :quentin
19
+ stub!(:reset_session)
20
+ end
21
+ it 'resets the session' do should_receive(:reset_session); logout_killing_session! end
22
+ it 'kills my auth_token cookie' do should_receive(:kill_remember_cookie!); logout_killing_session! end
23
+ it 'nils the current <%= file_name %>' do logout_killing_session!; current_<%= file_name %>.should be_nil end
24
+ it 'kills :<%= file_name %>_id session' do
25
+ session.stub!(:[]=)
26
+ session.should_receive(:[]=).with(:<%= file_name %>_id, nil).at_least(:once)
27
+ logout_killing_session!
28
+ end
29
+ it 'forgets me' do
30
+ current_<%= file_name %>.remember_me
31
+ current_<%= file_name %>.remember_token.should_not be_nil; current_<%= file_name %>.remember_token_expires_at.should_not be_nil
32
+ <%= class_name %>.find(1).remember_token.should_not be_nil; <%= class_name %>.find(1).remember_token_expires_at.should_not be_nil
33
+ logout_killing_session!
34
+ <%= class_name %>.find(1).remember_token.should be_nil; <%= class_name %>.find(1).remember_token_expires_at.should be_nil
35
+ end
36
+ end
37
+
38
+ describe "logout_keeping_session!" do
39
+ before do
40
+ login_as :quentin
41
+ stub!(:reset_session)
42
+ end
43
+ it 'does not reset the session' do should_not_receive(:reset_session); logout_keeping_session! end
44
+ it 'kills my auth_token cookie' do should_receive(:kill_remember_cookie!); logout_keeping_session! end
45
+ it 'nils the current <%= file_name %>' do logout_keeping_session!; current_<%= file_name %>.should be_nil end
46
+ it 'kills :<%= file_name %>_id session' do
47
+ session.stub!(:[]=)
48
+ session.should_receive(:[]=).with(:<%= file_name %>_id, nil).at_least(:once)
49
+ logout_keeping_session!
50
+ end
51
+ it 'forgets me' do
52
+ current_<%= file_name %>.remember_me
53
+ current_<%= file_name %>.remember_token.should_not be_nil; current_<%= file_name %>.remember_token_expires_at.should_not be_nil
54
+ <%= class_name %>.find(1).remember_token.should_not be_nil; <%= class_name %>.find(1).remember_token_expires_at.should_not be_nil
55
+ logout_keeping_session!
56
+ <%= class_name %>.find(1).remember_token.should be_nil; <%= class_name %>.find(1).remember_token_expires_at.should be_nil
57
+ end
58
+ end
59
+
60
+ describe 'When logged out' do
61
+ it "should not be authorized?" do
62
+ authorized?().should be_false
63
+ end
64
+ end
65
+
66
+ #
67
+ # Cookie Login
68
+ #
69
+ describe "Logging in by cookie" do
70
+ def set_remember_token token, time
71
+ @<%= file_name %>[:remember_token] = token;
72
+ @<%= file_name %>[:remember_token_expires_at] = time
73
+ @<%= file_name %>.save!
74
+ end
75
+ before do
76
+ @<%= file_name %> = <%= class_name %>.find(:first);
77
+ set_remember_token 'hello!', 5.minutes.from_now
78
+ end
79
+ it 'logs in with cookie' do
80
+ stub!(:cookies).and_return({ :auth_token => 'hello!' })
81
+ logged_in?.should be_true
82
+ end
83
+
84
+ it 'fails cookie login with bad cookie' do
85
+ should_receive(:cookies).at_least(:once).and_return({ :auth_token => 'i_haxxor_joo' })
86
+ logged_in?.should_not be_true
87
+ end
88
+
89
+ it 'fails cookie login with no cookie' do
90
+ set_remember_token nil, nil
91
+ should_receive(:cookies).at_least(:once).and_return({ })
92
+ logged_in?.should_not be_true
93
+ end
94
+
95
+ it 'fails expired cookie login' do
96
+ set_remember_token 'hello!', 5.minutes.ago
97
+ stub!(:cookies).and_return({ :auth_token => 'hello!' })
98
+ logged_in?.should_not be_true
99
+ end
100
+ end
101
+
102
+ end
@@ -0,0 +1,139 @@
1
+ require File.dirname(__FILE__) + '<%= ('/..'*controller_class_nesting_depth) + '/../spec_helper' %>'
2
+
3
+ # Be sure to include AuthenticatedTestHelper in spec/spec_helper.rb instead
4
+ # Then, you can remove it from this and the units test.
5
+ include AuthenticatedTestHelper
6
+
7
+ describe <%= controller_class_name %>Controller do
8
+ fixtures :<%= table_name %>
9
+ before do
10
+ @<%= file_name %> = mock_<%= file_name %>
11
+ @login_params = { :<%= options[:login_field_name] -%> => 'quentin<%= "@example.com" if options[:email_as_login] -%>', :password => 'test' }
12
+ <%= class_name %>.stub!(:authenticate).with(@login_params[:<%= options[:login_field_name] -%>], @login_params[:password]).and_return(@<%= file_name %>)
13
+ end
14
+ def do_create
15
+ post :create, @login_params
16
+ end
17
+ describe "on successful login," do
18
+ [ [:nil, nil, nil],
19
+ [:expired, 'valid_token', 15.minutes.ago],
20
+ [:different, 'i_haxxor_joo', 15.minutes.from_now],
21
+ [:valid, 'valid_token', 15.minutes.from_now]
22
+ ].each do |has_request_token, token_value, token_expiry|
23
+ [ true, false ].each do |want_remember_me|
24
+ describe "my request cookie token is #{has_request_token.to_s}," do
25
+ describe "and ask #{want_remember_me ? 'to' : 'not to'} be remembered" do
26
+ before do
27
+ @ccookies = mock('cookies')
28
+ controller.stub!(:cookies).and_return(@ccookies)
29
+ @ccookies.stub!(:[]).with(:auth_token).and_return(token_value)
30
+ @ccookies.stub!(:delete).with(:auth_token)
31
+ @ccookies.stub!(:[]=)
32
+ @<%= file_name %>.stub!(:remember_me)
33
+ @<%= file_name %>.stub!(:refresh_token)
34
+ @<%= file_name %>.stub!(:forget_me)
35
+ @<%= file_name %>.stub!(:remember_token).and_return(token_value)
36
+ @<%= file_name %>.stub!(:remember_token_expires_at).and_return(token_expiry)
37
+ @<%= file_name %>.stub!(:remember_token?).and_return(has_request_token == :valid)
38
+ if want_remember_me
39
+ @login_params[:remember_me] = '1'
40
+ else
41
+ @login_params[:remember_me] = '0'
42
+ end
43
+ end
44
+ it "kills existing login" do controller.should_receive(:logout_keeping_session!); do_create; end
45
+ it "authorizes me" do do_create; controller.send(:authorized?).should be_true; end
46
+ it "logs me in" do do_create; controller.send(:logged_in?).should be_true end
47
+ it "greets me nicely" do do_create; response.flash[:notice].should =~ /success/i end
48
+ it "sets/resets/expires cookie" do controller.should_receive(:handle_remember_cookie!).with(want_remember_me); do_create end
49
+ it "sends a cookie" do controller.should_receive(:send_remember_cookie!); do_create end
50
+ it 'redirects to the home page' do do_create; response.should redirect_to('/') end
51
+ it "does not reset my session" do controller.should_not_receive(:reset_session).and_return nil; do_create end # change if you uncomment the reset_session path
52
+ if (has_request_token == :valid)
53
+ it 'does not make new token' do @<%= file_name %>.should_not_receive(:remember_me); do_create end
54
+ it 'does refresh token' do @<%= file_name %>.should_receive(:refresh_token); do_create end
55
+ it "sets an auth cookie" do do_create; end
56
+ else
57
+ if want_remember_me
58
+ it 'makes a new token' do @<%= file_name %>.should_receive(:remember_me); do_create end
59
+ it "does not refresh token" do @<%= file_name %>.should_not_receive(:refresh_token); do_create end
60
+ it "sets an auth cookie" do do_create; end
61
+ else
62
+ it 'does not make new token' do @<%= file_name %>.should_not_receive(:remember_me); do_create end
63
+ it 'does not refresh token' do @<%= file_name %>.should_not_receive(:refresh_token); do_create end
64
+ it 'kills user token' do @<%= file_name %>.should_receive(:forget_me); do_create end
65
+ end
66
+ end
67
+ end # inner describe
68
+ end
69
+ end
70
+ end
71
+ end
72
+
73
+ describe "on failed login" do
74
+ before do
75
+ <%= class_name %>.should_receive(:authenticate).with(anything(), anything()).and_return(nil)
76
+ login_as :quentin
77
+ end
78
+ it 'logs out keeping session' do controller.should_receive(:logout_keeping_session!); do_create end
79
+ it 'flashes an error' do do_create; flash[:error].should =~ /Couldn't log you in as '<%= options[:email_as_login] ? "quentin@example.com" : "quentin" %>'/ end
80
+ it 'renders the log in page' do do_create; response.should render_template('new') end
81
+ it "doesn't log me in" do do_create; controller.send(:logged_in?).should == false end
82
+ it "doesn't send password back" do
83
+ @login_params[:password] = 'FROBNOZZ'
84
+ do_create
85
+ response.should_not have_text(/FROBNOZZ/i)
86
+ end
87
+ end
88
+
89
+ describe "on signout" do
90
+ def do_destroy
91
+ get :destroy
92
+ end
93
+ before do
94
+ login_as :quentin
95
+ end
96
+ it 'logs me out' do controller.should_receive(:logout_killing_session!); do_destroy end
97
+ it 'redirects me to the home page' do do_destroy; response.should be_redirect end
98
+ end
99
+
100
+ end
101
+
102
+ describe <%= controller_class_name %>Controller do
103
+ describe "route generation" do
104
+ it "should route the new <%= controller_controller_name %> action correctly" do
105
+ route_for(:controller => '<%= controller_controller_name %>', :action => 'new').should == "/login"
106
+ end
107
+ it "should route the create <%= controller_controller_name %> correctly" do
108
+ route_for(:controller => '<%= controller_controller_name %>', :action => 'create').should == "/<%= controller_routing_path %>"
109
+ end
110
+ it "should route the destroy <%= controller_controller_name %> action correctly" do
111
+ route_for(:controller => '<%= controller_controller_name %>', :action => 'destroy').should == "/logout"
112
+ end
113
+ end
114
+
115
+ describe "route recognition" do
116
+ it "should generate params from GET /login correctly" do
117
+ params_from(:get, '/login').should == {:controller => '<%= controller_controller_name %>', :action => 'new'}
118
+ end
119
+ it "should generate params from POST /<%= controller_routing_path %> correctly" do
120
+ params_from(:post, '/<%= controller_routing_path %>').should == {:controller => '<%= controller_controller_name %>', :action => 'create'}
121
+ end
122
+ it "should generate params from DELETE /<%= controller_routing_path %> correctly" do
123
+ params_from(:delete, '/logout').should == {:controller => '<%= controller_controller_name %>', :action => 'destroy'}
124
+ end
125
+ end
126
+
127
+ describe "named routing" do
128
+ before(:each) do
129
+ get :new
130
+ end
131
+ it "should route <%= controller_routing_name %>_path() correctly" do
132
+ <%= controller_routing_name %>_path().should == "/<%= controller_routing_path %>"
133
+ end
134
+ it "should route new_<%= controller_routing_name %>_path() correctly" do
135
+ new_<%= controller_routing_name %>_path().should == "/<%= controller_routing_path %>/new"
136
+ end
137
+ end
138
+
139
+ end
@@ -0,0 +1,200 @@
1
+ require File.dirname(__FILE__) + '<%= ('/..'*model_controller_class_nesting_depth) + '/../spec_helper' %>'
2
+
3
+ # Be sure to include AuthenticatedTestHelper in spec/spec_helper.rb instead
4
+ # Then, you can remove it from this and the units test.
5
+ include AuthenticatedTestHelper
6
+
7
+ describe <%= model_controller_class_name %>Controller do
8
+ fixtures :<%= table_name %>
9
+
10
+ it 'allows signup' do
11
+ lambda do
12
+ create_<%= file_name %>
13
+ response.should be_redirect
14
+ end.should change(<%= class_name %>, :count).by(1)
15
+ end
16
+
17
+ <% if options[:stateful] %>
18
+ it 'signs up user in pending state' do
19
+ create_<%= file_name %>
20
+ assigns(:<%= file_name %>).reload
21
+ assigns(:<%= file_name %>).should be_pending
22
+ end<% end %>
23
+
24
+ <% if options[:include_activation] -%>
25
+ it 'signs up user with activation code' do
26
+ create_<%= file_name %>
27
+ assigns(:<%= file_name %>).reload
28
+ assigns(:<%= file_name %>).activation_code.should_not be_nil
29
+ end<% end -%>
30
+
31
+ <% unless options[:email_as_login] -%>
32
+ it 'requires login on signup' do
33
+ lambda do
34
+ create_<%= file_name %>(:login => nil)
35
+ assigns[:<%= file_name %>].errors.on(:login).should_not be_nil
36
+ response.should be_success
37
+ end.should_not change(<%= class_name %>, :count)
38
+ end
39
+ <% end -%>
40
+
41
+ it 'requires password on signup' do
42
+ lambda do
43
+ create_<%= file_name %>(:password => nil)
44
+ assigns[:<%= file_name %>].errors.on(:password).should_not be_nil
45
+ response.should be_success
46
+ end.should_not change(<%= class_name %>, :count)
47
+ end
48
+
49
+ it 'requires password confirmation on signup' do
50
+ lambda do
51
+ create_<%= file_name %>(:password_confirmation => nil)
52
+ assigns[:<%= file_name %>].errors.on(:password_confirmation).should_not be_nil
53
+ response.should be_success
54
+ end.should_not change(<%= class_name %>, :count)
55
+ end
56
+
57
+ it 'requires email on signup' do
58
+ lambda do
59
+ create_<%= file_name %>(:email => nil)
60
+ assigns[:<%= file_name %>].errors.on(:email).should_not be_nil
61
+ response.should be_success
62
+ end.should_not change(<%= class_name %>, :count)
63
+ end
64
+
65
+ <% if options[:include_activation] %>
66
+ it 'activates user' do
67
+ <%= class_name %>.authenticate('<%= options[:email_as_login] ? "aaron@example.com" : "aaron" %>', 'monkey').should be_nil
68
+ get :activate, :activation_code => <%= table_name %>(:aaron).activation_code
69
+ response.should redirect_to('/login')
70
+ flash[:notice].should_not be_nil
71
+ flash[:error ].should be_nil
72
+ <%= class_name %>.authenticate('<%= options[:email_as_login] ? "aaron@example.com" : "aaron" %>', 'monkey').should == <%= table_name %>(:aaron)
73
+ end
74
+
75
+ it 'does not activate user without key' do
76
+ get :activate
77
+ flash[:notice].should be_nil
78
+ flash[:error ].should_not be_nil
79
+ end
80
+
81
+ it 'does not activate user with blank key' do
82
+ get :activate, :activation_code => ''
83
+ flash[:notice].should be_nil
84
+ flash[:error ].should_not be_nil
85
+ end
86
+
87
+ it 'does not activate user with bogus key' do
88
+ get :activate, :activation_code => 'i_haxxor_joo'
89
+ flash[:notice].should be_nil
90
+ flash[:error ].should_not be_nil
91
+ end<% end %>
92
+
93
+ def create_<%= file_name %>(options = {})
94
+ post :create, :<%= file_name %> => { <% unless options[:email_as_login] -%>:login => 'quire', <% end -%>:email => 'quire@example.com',
95
+ :password => 'quire69', :password_confirmation => 'quire69' }.merge(options)
96
+ end
97
+ end
98
+
99
+ describe <%= model_controller_class_name %>Controller do
100
+ describe "route generation" do
101
+ it "should route <%= model_controller_controller_name %>'s 'index' action correctly" do
102
+ route_for(:controller => '<%= model_controller_controller_name %>', :action => 'index').should == "/<%= model_controller_routing_path %>"
103
+ end
104
+
105
+ it "should route <%= model_controller_controller_name %>'s 'new' action correctly" do
106
+ route_for(:controller => '<%= model_controller_controller_name %>', :action => 'new').should == "/signup"
107
+ end
108
+
109
+ it "should route {:controller => '<%= model_controller_controller_name %>', :action => 'create'} correctly" do
110
+ route_for(:controller => '<%= model_controller_controller_name %>', :action => 'create').should == "/register"
111
+ end
112
+
113
+ it "should route <%= model_controller_controller_name %>'s 'show' action correctly" do
114
+ route_for(:controller => '<%= model_controller_controller_name %>', :action => 'show', :id => '1').should == "/<%= model_controller_routing_path %>/1"
115
+ end
116
+
117
+ it "should route <%= model_controller_controller_name %>'s 'edit' action correctly" do
118
+ route_for(:controller => '<%= model_controller_controller_name %>', :action => 'edit', :id => '1').should == "/<%= model_controller_routing_path %>/1/edit"
119
+ end
120
+
121
+ it "should route <%= model_controller_controller_name %>'s 'update' action correctly" do
122
+ route_for(:controller => '<%= model_controller_controller_name %>', :action => 'update', :id => '1').should == "/<%= model_controller_routing_path %>/1"
123
+ end
124
+
125
+ it "should route <%= model_controller_controller_name %>'s 'destroy' action correctly" do
126
+ route_for(:controller => '<%= model_controller_controller_name %>', :action => 'destroy', :id => '1').should == "/<%= model_controller_routing_path %>/1"
127
+ end
128
+ end
129
+
130
+ describe "route recognition" do
131
+ it "should generate params for <%= model_controller_controller_name %>'s index action from GET /<%= model_controller_routing_path %>" do
132
+ params_from(:get, '/<%= model_controller_routing_path %>').should == {:controller => '<%= model_controller_controller_name %>', :action => 'index'}
133
+ params_from(:get, '/<%= model_controller_routing_path %>.xml').should == {:controller => '<%= model_controller_controller_name %>', :action => 'index', :format => 'xml'}
134
+ params_from(:get, '/<%= model_controller_routing_path %>.json').should == {:controller => '<%= model_controller_controller_name %>', :action => 'index', :format => 'json'}
135
+ end
136
+
137
+ it "should generate params for <%= model_controller_controller_name %>'s new action from GET /<%= model_controller_routing_path %>" do
138
+ params_from(:get, '/<%= model_controller_routing_path %>/new').should == {:controller => '<%= model_controller_controller_name %>', :action => 'new'}
139
+ params_from(:get, '/<%= model_controller_routing_path %>/new.xml').should == {:controller => '<%= model_controller_controller_name %>', :action => 'new', :format => 'xml'}
140
+ params_from(:get, '/<%= model_controller_routing_path %>/new.json').should == {:controller => '<%= model_controller_controller_name %>', :action => 'new', :format => 'json'}
141
+ end
142
+
143
+ it "should generate params for <%= model_controller_controller_name %>'s create action from POST /<%= model_controller_routing_path %>" do
144
+ params_from(:post, '/<%= model_controller_routing_path %>').should == {:controller => '<%= model_controller_controller_name %>', :action => 'create'}
145
+ params_from(:post, '/<%= model_controller_routing_path %>.xml').should == {:controller => '<%= model_controller_controller_name %>', :action => 'create', :format => 'xml'}
146
+ params_from(:post, '/<%= model_controller_routing_path %>.json').should == {:controller => '<%= model_controller_controller_name %>', :action => 'create', :format => 'json'}
147
+ end
148
+
149
+ it "should generate params for <%= model_controller_controller_name %>'s show action from GET /<%= model_controller_routing_path %>/1" do
150
+ params_from(:get , '/<%= model_controller_routing_path %>/1').should == {:controller => '<%= model_controller_controller_name %>', :action => 'show', :id => '1'}
151
+ params_from(:get , '/<%= model_controller_routing_path %>/1.xml').should == {:controller => '<%= model_controller_controller_name %>', :action => 'show', :id => '1', :format => 'xml'}
152
+ params_from(:get , '/<%= model_controller_routing_path %>/1.json').should == {:controller => '<%= model_controller_controller_name %>', :action => 'show', :id => '1', :format => 'json'}
153
+ end
154
+
155
+ it "should generate params for <%= model_controller_controller_name %>'s edit action from GET /<%= model_controller_routing_path %>/1/edit" do
156
+ params_from(:get , '/<%= model_controller_routing_path %>/1/edit').should == {:controller => '<%= model_controller_controller_name %>', :action => 'edit', :id => '1'}
157
+ end
158
+
159
+ it "should generate params {:controller => '<%= model_controller_controller_name %>', :action => update', :id => '1'} from PUT /<%= model_controller_routing_path %>/1" do
160
+ params_from(:put , '/<%= model_controller_routing_path %>/1').should == {:controller => '<%= model_controller_controller_name %>', :action => 'update', :id => '1'}
161
+ params_from(:put , '/<%= model_controller_routing_path %>/1.xml').should == {:controller => '<%= model_controller_controller_name %>', :action => 'update', :id => '1', :format => 'xml'}
162
+ params_from(:put , '/<%= model_controller_routing_path %>/1.json').should == {:controller => '<%= model_controller_controller_name %>', :action => 'update', :id => '1', :format => 'json'}
163
+ end
164
+
165
+ it "should generate params for <%= model_controller_controller_name %>'s destroy action from DELETE /<%= model_controller_routing_path %>/1" do
166
+ params_from(:delete, '/<%= model_controller_routing_path %>/1').should == {:controller => '<%= model_controller_controller_name %>', :action => 'destroy', :id => '1'}
167
+ params_from(:delete, '/<%= model_controller_routing_path %>/1.xml').should == {:controller => '<%= model_controller_controller_name %>', :action => 'destroy', :id => '1', :format => 'xml'}
168
+ params_from(:delete, '/<%= model_controller_routing_path %>/1.json').should == {:controller => '<%= model_controller_controller_name %>', :action => 'destroy', :id => '1', :format => 'json'}
169
+ end
170
+ end
171
+
172
+ describe "named routing" do
173
+ before(:each) do
174
+ get :new
175
+ end
176
+
177
+ it "should route <%= model_controller_routing_name %>_path() to /<%= model_controller_routing_path %>" do
178
+ <%= model_controller_routing_name %>_path().should == "/<%= model_controller_routing_path %>"
179
+ formatted_<%= model_controller_routing_name %>_path(:format => 'xml').should == "/<%= model_controller_routing_path %>.xml"
180
+ formatted_<%= model_controller_routing_name %>_path(:format => 'json').should == "/<%= model_controller_routing_path %>.json"
181
+ end
182
+
183
+ it "should route new_<%= model_controller_routing_name.singularize %>_path() to /<%= model_controller_routing_path %>/new" do
184
+ new_<%= model_controller_routing_name.singularize %>_path().should == "/<%= model_controller_routing_path %>/new"
185
+ formatted_new_<%= model_controller_routing_name.singularize %>_path(:format => 'xml').should == "/<%= model_controller_routing_path %>/new.xml"
186
+ formatted_new_<%= model_controller_routing_name.singularize %>_path(:format => 'json').should == "/<%= model_controller_routing_path %>/new.json"
187
+ end
188
+
189
+ it "should route <%= model_controller_routing_name.singularize %>_(:id => '1') to /<%= model_controller_routing_path %>/1" do
190
+ <%= model_controller_routing_name.singularize %>_path(:id => '1').should == "/<%= model_controller_routing_path %>/1"
191
+ formatted_<%= model_controller_routing_name.singularize %>_path(:id => '1', :format => 'xml').should == "/<%= model_controller_routing_path %>/1.xml"
192
+ formatted_<%= model_controller_routing_name.singularize %>_path(:id => '1', :format => 'json').should == "/<%= model_controller_routing_path %>/1.json"
193
+ end
194
+
195
+ it "should route edit_<%= model_controller_routing_name.singularize %>_path(:id => '1') to /<%= model_controller_routing_path %>/1/edit" do
196
+ edit_<%= model_controller_routing_name.singularize %>_path(:id => '1').should == "/<%= model_controller_routing_path %>/1/edit"
197
+ end
198
+ end
199
+
200
+ end