ggoodale-restful-authentication 1.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (54) hide show
  1. data/CHANGELOG +68 -0
  2. data/README.textile +224 -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 +478 -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 +16 -0
  15. data/generators/authenticated/templates/mailer.rb +25 -0
  16. data/generators/authenticated/templates/migration.rb +26 -0
  17. data/generators/authenticated/templates/model.rb +83 -0
  18. data/generators/authenticated/templates/model_controller.rb +85 -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 +11 -0
  22. data/generators/authenticated/templates/signup.html.erb +19 -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 +198 -0
  29. data/generators/authenticated/templates/spec/fixtures/users.yml +60 -0
  30. data/generators/authenticated/templates/spec/helpers/users_helper_spec.rb +141 -0
  31. data/generators/authenticated/templates/spec/models/user_spec.rb +290 -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 +186 -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 +93 -0
  43. data/generators/authenticated/templates/test/unit_test.rb +164 -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 +63 -0
  50. data/lib/authorization/stateful_roles.rb +62 -0
  51. data/lib/trustification.rb +14 -0
  52. data/lib/trustification/email_validation.rb +20 -0
  53. data/rails/init.rb +3 -0
  54. metadata +115 -0
@@ -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 = { :login => 'quentin', :password => 'test' }
12
+ <%= class_name %>.stub!(:authenticate).with(@login_params[:login], @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 '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,198 @@
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
+ it 'requires login on signup' do
32
+ lambda do
33
+ create_<%= file_name %>(:login => nil)
34
+ assigns[:<%= file_name %>].errors.on(:login).should_not be_nil
35
+ response.should be_success
36
+ end.should_not change(<%= class_name %>, :count)
37
+ end
38
+
39
+ it 'requires password on signup' do
40
+ lambda do
41
+ create_<%= file_name %>(:password => nil)
42
+ assigns[:<%= file_name %>].errors.on(:password).should_not be_nil
43
+ response.should be_success
44
+ end.should_not change(<%= class_name %>, :count)
45
+ end
46
+
47
+ it 'requires password confirmation on signup' do
48
+ lambda do
49
+ create_<%= file_name %>(:password_confirmation => nil)
50
+ assigns[:<%= file_name %>].errors.on(:password_confirmation).should_not be_nil
51
+ response.should be_success
52
+ end.should_not change(<%= class_name %>, :count)
53
+ end
54
+
55
+ it 'requires email on signup' do
56
+ lambda do
57
+ create_<%= file_name %>(:email => nil)
58
+ assigns[:<%= file_name %>].errors.on(:email).should_not be_nil
59
+ response.should be_success
60
+ end.should_not change(<%= class_name %>, :count)
61
+ end
62
+
63
+ <% if options[:include_activation] %>
64
+ it 'activates user' do
65
+ <%= class_name %>.authenticate('aaron', 'monkey').should be_nil
66
+ get :activate, :activation_code => <%= table_name %>(:aaron).activation_code
67
+ response.should redirect_to('/login')
68
+ flash[:notice].should_not be_nil
69
+ flash[:error ].should be_nil
70
+ <%= class_name %>.authenticate('aaron', 'monkey').should == <%= table_name %>(:aaron)
71
+ end
72
+
73
+ it 'does not activate user without key' do
74
+ get :activate
75
+ flash[:notice].should be_nil
76
+ flash[:error ].should_not be_nil
77
+ end
78
+
79
+ it 'does not activate user with blank key' do
80
+ get :activate, :activation_code => ''
81
+ flash[:notice].should be_nil
82
+ flash[:error ].should_not be_nil
83
+ end
84
+
85
+ it 'does not activate user with bogus key' do
86
+ get :activate, :activation_code => 'i_haxxor_joo'
87
+ flash[:notice].should be_nil
88
+ flash[:error ].should_not be_nil
89
+ end<% end %>
90
+
91
+ def create_<%= file_name %>(options = {})
92
+ post :create, :<%= file_name %> => { :login => 'quire', :email => 'quire@example.com',
93
+ :password => 'quire69', :password_confirmation => 'quire69' }.merge(options)
94
+ end
95
+ end
96
+
97
+ describe <%= model_controller_class_name %>Controller do
98
+ describe "route generation" do
99
+ it "should route <%= model_controller_controller_name %>'s 'index' action correctly" do
100
+ route_for(:controller => '<%= model_controller_controller_name %>', :action => 'index').should == "/<%= model_controller_routing_path %>"
101
+ end
102
+
103
+ it "should route <%= model_controller_controller_name %>'s 'new' action correctly" do
104
+ route_for(:controller => '<%= model_controller_controller_name %>', :action => 'new').should == "/signup"
105
+ end
106
+
107
+ it "should route {:controller => '<%= model_controller_controller_name %>', :action => 'create'} correctly" do
108
+ route_for(:controller => '<%= model_controller_controller_name %>', :action => 'create').should == "/register"
109
+ end
110
+
111
+ it "should route <%= model_controller_controller_name %>'s 'show' action correctly" do
112
+ route_for(:controller => '<%= model_controller_controller_name %>', :action => 'show', :id => '1').should == "/<%= model_controller_routing_path %>/1"
113
+ end
114
+
115
+ it "should route <%= model_controller_controller_name %>'s 'edit' action correctly" do
116
+ route_for(:controller => '<%= model_controller_controller_name %>', :action => 'edit', :id => '1').should == "/<%= model_controller_routing_path %>/1/edit"
117
+ end
118
+
119
+ it "should route <%= model_controller_controller_name %>'s 'update' action correctly" do
120
+ route_for(:controller => '<%= model_controller_controller_name %>', :action => 'update', :id => '1').should == "/<%= model_controller_routing_path %>/1"
121
+ end
122
+
123
+ it "should route <%= model_controller_controller_name %>'s 'destroy' action correctly" do
124
+ route_for(:controller => '<%= model_controller_controller_name %>', :action => 'destroy', :id => '1').should == "/<%= model_controller_routing_path %>/1"
125
+ end
126
+ end
127
+
128
+ describe "route recognition" do
129
+ it "should generate params for <%= model_controller_controller_name %>'s index action from GET /<%= model_controller_routing_path %>" do
130
+ params_from(:get, '/<%= model_controller_routing_path %>').should == {:controller => '<%= model_controller_controller_name %>', :action => 'index'}
131
+ params_from(:get, '/<%= model_controller_routing_path %>.xml').should == {:controller => '<%= model_controller_controller_name %>', :action => 'index', :format => 'xml'}
132
+ params_from(:get, '/<%= model_controller_routing_path %>.json').should == {:controller => '<%= model_controller_controller_name %>', :action => 'index', :format => 'json'}
133
+ end
134
+
135
+ it "should generate params for <%= model_controller_controller_name %>'s new action from GET /<%= model_controller_routing_path %>" do
136
+ params_from(:get, '/<%= model_controller_routing_path %>/new').should == {:controller => '<%= model_controller_controller_name %>', :action => 'new'}
137
+ params_from(:get, '/<%= model_controller_routing_path %>/new.xml').should == {:controller => '<%= model_controller_controller_name %>', :action => 'new', :format => 'xml'}
138
+ params_from(:get, '/<%= model_controller_routing_path %>/new.json').should == {:controller => '<%= model_controller_controller_name %>', :action => 'new', :format => 'json'}
139
+ end
140
+
141
+ it "should generate params for <%= model_controller_controller_name %>'s create action from POST /<%= model_controller_routing_path %>" do
142
+ params_from(:post, '/<%= model_controller_routing_path %>').should == {:controller => '<%= model_controller_controller_name %>', :action => 'create'}
143
+ params_from(:post, '/<%= model_controller_routing_path %>.xml').should == {:controller => '<%= model_controller_controller_name %>', :action => 'create', :format => 'xml'}
144
+ params_from(:post, '/<%= model_controller_routing_path %>.json').should == {:controller => '<%= model_controller_controller_name %>', :action => 'create', :format => 'json'}
145
+ end
146
+
147
+ it "should generate params for <%= model_controller_controller_name %>'s show action from GET /<%= model_controller_routing_path %>/1" do
148
+ params_from(:get , '/<%= model_controller_routing_path %>/1').should == {:controller => '<%= model_controller_controller_name %>', :action => 'show', :id => '1'}
149
+ params_from(:get , '/<%= model_controller_routing_path %>/1.xml').should == {:controller => '<%= model_controller_controller_name %>', :action => 'show', :id => '1', :format => 'xml'}
150
+ params_from(:get , '/<%= model_controller_routing_path %>/1.json').should == {:controller => '<%= model_controller_controller_name %>', :action => 'show', :id => '1', :format => 'json'}
151
+ end
152
+
153
+ it "should generate params for <%= model_controller_controller_name %>'s edit action from GET /<%= model_controller_routing_path %>/1/edit" do
154
+ params_from(:get , '/<%= model_controller_routing_path %>/1/edit').should == {:controller => '<%= model_controller_controller_name %>', :action => 'edit', :id => '1'}
155
+ end
156
+
157
+ it "should generate params {:controller => '<%= model_controller_controller_name %>', :action => update', :id => '1'} from PUT /<%= model_controller_routing_path %>/1" do
158
+ params_from(:put , '/<%= model_controller_routing_path %>/1').should == {:controller => '<%= model_controller_controller_name %>', :action => 'update', :id => '1'}
159
+ params_from(:put , '/<%= model_controller_routing_path %>/1.xml').should == {:controller => '<%= model_controller_controller_name %>', :action => 'update', :id => '1', :format => 'xml'}
160
+ params_from(:put , '/<%= model_controller_routing_path %>/1.json').should == {:controller => '<%= model_controller_controller_name %>', :action => 'update', :id => '1', :format => 'json'}
161
+ end
162
+
163
+ it "should generate params for <%= model_controller_controller_name %>'s destroy action from DELETE /<%= model_controller_routing_path %>/1" do
164
+ params_from(:delete, '/<%= model_controller_routing_path %>/1').should == {:controller => '<%= model_controller_controller_name %>', :action => 'destroy', :id => '1'}
165
+ params_from(:delete, '/<%= model_controller_routing_path %>/1.xml').should == {:controller => '<%= model_controller_controller_name %>', :action => 'destroy', :id => '1', :format => 'xml'}
166
+ params_from(:delete, '/<%= model_controller_routing_path %>/1.json').should == {:controller => '<%= model_controller_controller_name %>', :action => 'destroy', :id => '1', :format => 'json'}
167
+ end
168
+ end
169
+
170
+ describe "named routing" do
171
+ before(:each) do
172
+ get :new
173
+ end
174
+
175
+ it "should route <%= model_controller_routing_name %>_path() to /<%= model_controller_routing_path %>" do
176
+ <%= model_controller_routing_name %>_path().should == "/<%= model_controller_routing_path %>"
177
+ formatted_<%= model_controller_routing_name %>_path(:format => 'xml').should == "/<%= model_controller_routing_path %>.xml"
178
+ formatted_<%= model_controller_routing_name %>_path(:format => 'json').should == "/<%= model_controller_routing_path %>.json"
179
+ end
180
+
181
+ it "should route new_<%= model_controller_routing_name.singularize %>_path() to /<%= model_controller_routing_path %>/new" do
182
+ new_<%= model_controller_routing_name.singularize %>_path().should == "/<%= model_controller_routing_path %>/new"
183
+ formatted_new_<%= model_controller_routing_name.singularize %>_path(:format => 'xml').should == "/<%= model_controller_routing_path %>/new.xml"
184
+ formatted_new_<%= model_controller_routing_name.singularize %>_path(:format => 'json').should == "/<%= model_controller_routing_path %>/new.json"
185
+ end
186
+
187
+ it "should route <%= model_controller_routing_name.singularize %>_(:id => '1') to /<%= model_controller_routing_path %>/1" do
188
+ <%= model_controller_routing_name.singularize %>_path(:id => '1').should == "/<%= model_controller_routing_path %>/1"
189
+ formatted_<%= model_controller_routing_name.singularize %>_path(:id => '1', :format => 'xml').should == "/<%= model_controller_routing_path %>/1.xml"
190
+ formatted_<%= model_controller_routing_name.singularize %>_path(:id => '1', :format => 'json').should == "/<%= model_controller_routing_path %>/1.json"
191
+ end
192
+
193
+ it "should route edit_<%= model_controller_routing_name.singularize %>_path(:id => '1') to /<%= model_controller_routing_path %>/1/edit" do
194
+ edit_<%= model_controller_routing_name.singularize %>_path(:id => '1').should == "/<%= model_controller_routing_path %>/1/edit"
195
+ end
196
+ end
197
+
198
+ end
@@ -0,0 +1,60 @@
1
+ <%
2
+ ## this code must match that in templates/model.rb
3
+ require 'digest/sha1'
4
+ def make_fake_token
5
+ @fake_token_counter ||= 0
6
+ @fake_token_counter += 1
7
+ Digest::SHA1.hexdigest(@fake_token_counter.to_s)
8
+ end
9
+ salts = (1..2).map{ make_fake_token }
10
+ passwds = salts.map{ |salt| password_digest('monkey', salt) }
11
+ -%>
12
+
13
+ quentin:
14
+ id: 1
15
+ login: quentin
16
+ email: quentin@example.com
17
+ salt: <%= salts[0] %> # SHA1('0')
18
+ crypted_password: <%= passwds[0] %> # 'monkey'
19
+ created_at: <%%= 5.days.ago.to_s :db %>
20
+ remember_token_expires_at: <%%= 1.days.from_now.to_s %>
21
+ remember_token: <%= make_fake_token %>
22
+ <% if options[:include_activation] -%>
23
+ activation_code:
24
+ activated_at: <%%= 5.days.ago.to_s :db %>
25
+ <% end -%>
26
+ <% if options[:stateful] -%>
27
+ state: active
28
+ <% end -%>
29
+
30
+ aaron:
31
+ id: 2
32
+ login: aaron
33
+ email: aaron@example.com
34
+ salt: <%= salts[1] %> # SHA1('1')
35
+ crypted_password: <%= passwds[1] %> # 'monkey'
36
+ created_at: <%%= 1.days.ago.to_s :db %>
37
+ remember_token_expires_at:
38
+ remember_token:
39
+ <% if options[:include_activation] -%>
40
+ activation_code: <%= make_fake_token %>
41
+ activated_at:
42
+ <% end -%>
43
+ <% if options[:stateful] %>
44
+ state: pending
45
+ <% end -%>
46
+
47
+
48
+ old_password_holder:
49
+ id: 3
50
+ login: old_password_holder
51
+ email: salty_dog@example.com
52
+ salt: 7e3041ebc2fc05a40c60028e2c4901a81035d3cd
53
+ crypted_password: 00742970dc9e6319f8019fd54864d3ea740f04b1 # test
54
+ created_at: <%%= 1.days.ago.to_s :db %>
55
+ <% if options[:include_activation] %>
56
+ activation_code:
57
+ activated_at: <%%= 5.days.ago.to_s :db %>
58
+ <% end %>
59
+ <% if options[:stateful] %>
60
+ state: active<% end %>