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.
- data/CHANGELOG +68 -0
- data/README.textile +224 -0
- data/Rakefile +32 -0
- data/TODO +15 -0
- data/generators/authenticated/USAGE +1 -0
- data/generators/authenticated/authenticated_generator.rb +478 -0
- data/generators/authenticated/lib/insert_routes.rb +54 -0
- data/generators/authenticated/templates/_model_partial.html.erb +8 -0
- data/generators/authenticated/templates/activation.erb +3 -0
- data/generators/authenticated/templates/authenticated_system.rb +189 -0
- data/generators/authenticated/templates/authenticated_test_helper.rb +22 -0
- data/generators/authenticated/templates/controller.rb +43 -0
- data/generators/authenticated/templates/helper.rb +2 -0
- data/generators/authenticated/templates/login.html.erb +16 -0
- data/generators/authenticated/templates/mailer.rb +25 -0
- data/generators/authenticated/templates/migration.rb +26 -0
- data/generators/authenticated/templates/model.rb +83 -0
- data/generators/authenticated/templates/model_controller.rb +85 -0
- data/generators/authenticated/templates/model_helper.rb +93 -0
- data/generators/authenticated/templates/model_helper_spec.rb +158 -0
- data/generators/authenticated/templates/observer.rb +11 -0
- data/generators/authenticated/templates/signup.html.erb +19 -0
- data/generators/authenticated/templates/signup_notification.erb +8 -0
- data/generators/authenticated/templates/site_keys.rb +38 -0
- data/generators/authenticated/templates/spec/controllers/access_control_spec.rb +90 -0
- data/generators/authenticated/templates/spec/controllers/authenticated_system_spec.rb +102 -0
- data/generators/authenticated/templates/spec/controllers/sessions_controller_spec.rb +139 -0
- data/generators/authenticated/templates/spec/controllers/users_controller_spec.rb +198 -0
- data/generators/authenticated/templates/spec/fixtures/users.yml +60 -0
- data/generators/authenticated/templates/spec/helpers/users_helper_spec.rb +141 -0
- data/generators/authenticated/templates/spec/models/user_spec.rb +290 -0
- data/generators/authenticated/templates/stories/rest_auth_stories.rb +22 -0
- data/generators/authenticated/templates/stories/rest_auth_stories_helper.rb +81 -0
- data/generators/authenticated/templates/stories/steps/ra_navigation_steps.rb +49 -0
- data/generators/authenticated/templates/stories/steps/ra_resource_steps.rb +179 -0
- data/generators/authenticated/templates/stories/steps/ra_response_steps.rb +171 -0
- data/generators/authenticated/templates/stories/steps/user_steps.rb +153 -0
- data/generators/authenticated/templates/stories/users/accounts.story +186 -0
- data/generators/authenticated/templates/stories/users/sessions.story +134 -0
- data/generators/authenticated/templates/test/functional_test.rb +82 -0
- data/generators/authenticated/templates/test/mailer_test.rb +31 -0
- data/generators/authenticated/templates/test/model_functional_test.rb +93 -0
- data/generators/authenticated/templates/test/unit_test.rb +164 -0
- data/init.rb +1 -0
- data/lib/authentication.rb +40 -0
- data/lib/authentication/by_cookie_token.rb +82 -0
- data/lib/authentication/by_password.rb +64 -0
- data/lib/authorization.rb +14 -0
- data/lib/authorization/aasm_roles.rb +63 -0
- data/lib/authorization/stateful_roles.rb +62 -0
- data/lib/trustification.rb +14 -0
- data/lib/trustification/email_validation.rb +20 -0
- data/rails/init.rb +3 -0
- metadata +115 -0
@@ -0,0 +1,141 @@
|
|
1
|
+
require File.dirname(__FILE__) + '<%= ('/..'*model_controller_class_nesting_depth) + '/../spec_helper' %>'
|
2
|
+
include ApplicationHelper
|
3
|
+
include <%= model_controller_class_name %>Helper
|
4
|
+
include AuthenticatedTestHelper
|
5
|
+
|
6
|
+
describe <%= model_controller_class_name %>Helper do
|
7
|
+
before do
|
8
|
+
@<%= file_name %> = mock_<%= file_name %>
|
9
|
+
end
|
10
|
+
|
11
|
+
describe "if_authorized" do
|
12
|
+
it "yields if authorized" do
|
13
|
+
should_receive(:authorized?).with('a','r').and_return(true)
|
14
|
+
if_authorized?('a','r'){|action,resource| [action,resource,'hi'] }.should == ['a','r','hi']
|
15
|
+
end
|
16
|
+
it "does nothing if not authorized" do
|
17
|
+
should_receive(:authorized?).with('a','r').and_return(false)
|
18
|
+
if_authorized?('a','r'){ 'hi' }.should be_nil
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
describe "link_to_<%= file_name %>" do
|
23
|
+
it "should give an error on a nil <%= file_name %>" do
|
24
|
+
lambda { link_to_<%= file_name %>(nil) }.should raise_error('Invalid <%= file_name %>')
|
25
|
+
end
|
26
|
+
it "should link to the given <%= file_name %>" do
|
27
|
+
should_receive(:<%= model_controller_routing_name.singularize %>_path).at_least(:once).and_return('/<%= model_controller_file_path %>/1')
|
28
|
+
link_to_<%= file_name %>(@<%= file_name %>).should have_tag("a[href='/<%= model_controller_file_path %>/1']")
|
29
|
+
end
|
30
|
+
it "should use given link text if :content_text is specified" do
|
31
|
+
link_to_<%= file_name %>(@<%= file_name %>, :content_text => 'Hello there!').should have_tag("a", 'Hello there!')
|
32
|
+
end
|
33
|
+
it "should use the login as link text with no :content_method specified" do
|
34
|
+
link_to_<%= file_name %>(@<%= file_name %>).should have_tag("a", 'user_name')
|
35
|
+
end
|
36
|
+
it "should use the name as link text with :content_method => :name" do
|
37
|
+
link_to_<%= file_name %>(@<%= file_name %>, :content_method => :name).should have_tag("a", 'U. Surname')
|
38
|
+
end
|
39
|
+
it "should use the login as title with no :title_method specified" do
|
40
|
+
link_to_<%= file_name %>(@<%= file_name %>).should have_tag("a[title='user_name']")
|
41
|
+
end
|
42
|
+
it "should use the name as link title with :content_method => :name" do
|
43
|
+
link_to_<%= file_name %>(@<%= file_name %>, :title_method => :name).should have_tag("a[title='U. Surname']")
|
44
|
+
end
|
45
|
+
it "should have nickname as a class by default" do
|
46
|
+
link_to_<%= file_name %>(@<%= file_name %>).should have_tag("a.nickname")
|
47
|
+
end
|
48
|
+
it "should take other classes and no longer have the nickname class" do
|
49
|
+
result = link_to_<%= file_name %>(@<%= file_name %>, :class => 'foo bar')
|
50
|
+
result.should have_tag("a.foo")
|
51
|
+
result.should have_tag("a.bar")
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
describe "link_to_login_with_IP" do
|
56
|
+
it "should link to the login_path" do
|
57
|
+
link_to_login_with_IP().should have_tag("a[href='/login']")
|
58
|
+
end
|
59
|
+
it "should use given link text if :content_text is specified" do
|
60
|
+
link_to_login_with_IP('Hello there!').should have_tag("a", 'Hello there!')
|
61
|
+
end
|
62
|
+
it "should use the login as link text with no :content_method specified" do
|
63
|
+
link_to_login_with_IP().should have_tag("a", '0.0.0.0')
|
64
|
+
end
|
65
|
+
it "should use the ip address as title" do
|
66
|
+
link_to_login_with_IP().should have_tag("a[title='0.0.0.0']")
|
67
|
+
end
|
68
|
+
it "should by default be like school in summer and have no class" do
|
69
|
+
link_to_login_with_IP().should_not have_tag("a.nickname")
|
70
|
+
end
|
71
|
+
it "should have some class if you tell it to" do
|
72
|
+
result = link_to_login_with_IP(nil, :class => 'foo bar')
|
73
|
+
result.should have_tag("a.foo")
|
74
|
+
result.should have_tag("a.bar")
|
75
|
+
end
|
76
|
+
it "should have some class if you tell it to" do
|
77
|
+
result = link_to_login_with_IP(nil, :tag => 'abbr')
|
78
|
+
result.should have_tag("abbr[title='0.0.0.0']")
|
79
|
+
end
|
80
|
+
end
|
81
|
+
|
82
|
+
describe "link_to_current_<%= file_name %>, When logged in" do
|
83
|
+
before do
|
84
|
+
stub!(:current_<%= file_name %>).and_return(@<%= file_name %>)
|
85
|
+
end
|
86
|
+
it "should link to the given <%= file_name %>" do
|
87
|
+
should_receive(:<%= model_controller_routing_name.singularize %>_path).at_least(:once).and_return('/<%= model_controller_file_path %>/1')
|
88
|
+
link_to_current_<%= file_name %>().should have_tag("a[href='/<%= model_controller_file_path %>/1']")
|
89
|
+
end
|
90
|
+
it "should use given link text if :content_text is specified" do
|
91
|
+
link_to_current_<%= file_name %>(:content_text => 'Hello there!').should have_tag("a", 'Hello there!')
|
92
|
+
end
|
93
|
+
it "should use the login as link text with no :content_method specified" do
|
94
|
+
link_to_current_<%= file_name %>().should have_tag("a", 'user_name')
|
95
|
+
end
|
96
|
+
it "should use the name as link text with :content_method => :name" do
|
97
|
+
link_to_current_<%= file_name %>(:content_method => :name).should have_tag("a", 'U. Surname')
|
98
|
+
end
|
99
|
+
it "should use the login as title with no :title_method specified" do
|
100
|
+
link_to_current_<%= file_name %>().should have_tag("a[title='user_name']")
|
101
|
+
end
|
102
|
+
it "should use the name as link title with :content_method => :name" do
|
103
|
+
link_to_current_<%= file_name %>(:title_method => :name).should have_tag("a[title='U. Surname']")
|
104
|
+
end
|
105
|
+
it "should have nickname as a class" do
|
106
|
+
link_to_current_<%= file_name %>().should have_tag("a.nickname")
|
107
|
+
end
|
108
|
+
it "should take other classes and no longer have the nickname class" do
|
109
|
+
result = link_to_current_<%= file_name %>(:class => 'foo bar')
|
110
|
+
result.should have_tag("a.foo")
|
111
|
+
result.should have_tag("a.bar")
|
112
|
+
end
|
113
|
+
end
|
114
|
+
|
115
|
+
describe "link_to_current_<%= file_name %>, When logged out" do
|
116
|
+
before do
|
117
|
+
stub!(:current_<%= file_name %>).and_return(nil)
|
118
|
+
end
|
119
|
+
it "should link to the login_path" do
|
120
|
+
link_to_current_<%= file_name %>().should have_tag("a[href='/login']")
|
121
|
+
end
|
122
|
+
it "should use given link text if :content_text is specified" do
|
123
|
+
link_to_current_<%= file_name %>(:content_text => 'Hello there!').should have_tag("a", 'Hello there!')
|
124
|
+
end
|
125
|
+
it "should use 'not signed in' as link text with no :content_method specified" do
|
126
|
+
link_to_current_<%= file_name %>().should have_tag("a", 'not signed in')
|
127
|
+
end
|
128
|
+
it "should use the ip address as title" do
|
129
|
+
link_to_current_<%= file_name %>().should have_tag("a[title='0.0.0.0']")
|
130
|
+
end
|
131
|
+
it "should by default be like school in summer and have no class" do
|
132
|
+
link_to_current_<%= file_name %>().should_not have_tag("a.nickname")
|
133
|
+
end
|
134
|
+
it "should have some class if you tell it to" do
|
135
|
+
result = link_to_current_<%= file_name %>(:class => 'foo bar')
|
136
|
+
result.should have_tag("a.foo")
|
137
|
+
result.should have_tag("a.bar")
|
138
|
+
end
|
139
|
+
end
|
140
|
+
|
141
|
+
end
|
@@ -0,0 +1,290 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
require File.dirname(__FILE__) + '<%= ('/..'*model_controller_class_nesting_depth) + '/../spec_helper' %>'
|
3
|
+
|
4
|
+
# Be sure to include AuthenticatedTestHelper in spec/spec_helper.rb instead.
|
5
|
+
# Then, you can remove it from this and the functional test.
|
6
|
+
include AuthenticatedTestHelper
|
7
|
+
|
8
|
+
describe <%= class_name %> do
|
9
|
+
fixtures :<%= table_name %>
|
10
|
+
|
11
|
+
describe 'being created' do
|
12
|
+
before do
|
13
|
+
@<%= file_name %> = nil
|
14
|
+
@creating_<%= file_name %> = lambda do
|
15
|
+
@<%= file_name %> = create_<%= file_name %>
|
16
|
+
violated "#{@<%= file_name %>.errors.full_messages.to_sentence}" if @<%= file_name %>.new_record?
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
it 'increments <%= class_name %>#count' do
|
21
|
+
@creating_<%= file_name %>.should change(<%= class_name %>, :count).by(1)
|
22
|
+
end
|
23
|
+
<% if options[:include_activation] %>
|
24
|
+
it 'initializes #activation_code' do
|
25
|
+
@creating_<%= file_name %>.call
|
26
|
+
@<%= file_name %>.reload
|
27
|
+
@<%= file_name %>.activation_code.should_not be_nil
|
28
|
+
end
|
29
|
+
<% end %><% if options[:stateful] %>
|
30
|
+
it 'starts in pending state' do
|
31
|
+
@creating_<%= file_name %>.call
|
32
|
+
@<%= file_name %>.reload
|
33
|
+
@<%= file_name %>.should be_pending
|
34
|
+
end
|
35
|
+
<% end %> end
|
36
|
+
|
37
|
+
#
|
38
|
+
# Validations
|
39
|
+
#
|
40
|
+
|
41
|
+
it 'requires login' do
|
42
|
+
lambda do
|
43
|
+
u = create_<%= file_name %>(:login => nil)
|
44
|
+
u.errors.on(:login).should_not be_nil
|
45
|
+
end.should_not change(<%= class_name %>, :count)
|
46
|
+
end
|
47
|
+
|
48
|
+
describe 'allows legitimate logins:' do
|
49
|
+
['123', '1234567890_234567890_234567890_234567890',
|
50
|
+
'hello.-_there@funnychar.com'].each do |login_str|
|
51
|
+
it "'#{login_str}'" do
|
52
|
+
lambda do
|
53
|
+
u = create_<%= file_name %>(:login => login_str)
|
54
|
+
u.errors.on(:login).should be_nil
|
55
|
+
end.should change(<%= class_name %>, :count).by(1)
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
59
|
+
describe 'disallows illegitimate logins:' do
|
60
|
+
['12', '1234567890_234567890_234567890_234567890_', "tab\t", "newline\n",
|
61
|
+
"Iñtërnâtiônàlizætiøn hasn't happened to ruby 1.8 yet",
|
62
|
+
'semicolon;', 'quote"', 'tick\'', 'backtick`', 'percent%', 'plus+', 'space '].each do |login_str|
|
63
|
+
it "'#{login_str}'" do
|
64
|
+
lambda do
|
65
|
+
u = create_<%= file_name %>(:login => login_str)
|
66
|
+
u.errors.on(:login).should_not be_nil
|
67
|
+
end.should_not change(<%= class_name %>, :count)
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
it 'requires password' do
|
73
|
+
lambda do
|
74
|
+
u = create_<%= file_name %>(:password => nil)
|
75
|
+
u.errors.on(:password).should_not be_nil
|
76
|
+
end.should_not change(<%= class_name %>, :count)
|
77
|
+
end
|
78
|
+
|
79
|
+
it 'requires password confirmation' do
|
80
|
+
lambda do
|
81
|
+
u = create_<%= file_name %>(:password_confirmation => nil)
|
82
|
+
u.errors.on(:password_confirmation).should_not be_nil
|
83
|
+
end.should_not change(<%= class_name %>, :count)
|
84
|
+
end
|
85
|
+
|
86
|
+
it 'requires email' do
|
87
|
+
lambda do
|
88
|
+
u = create_<%= file_name %>(:email => nil)
|
89
|
+
u.errors.on(:email).should_not be_nil
|
90
|
+
end.should_not change(<%= class_name %>, :count)
|
91
|
+
end
|
92
|
+
|
93
|
+
describe 'allows legitimate emails:' do
|
94
|
+
['foo@bar.com', 'foo@newskool-tld.museum', 'foo@twoletter-tld.de', 'foo@nonexistant-tld.qq',
|
95
|
+
'r@a.wk', '1234567890-234567890-234567890-234567890-234567890-234567890-234567890-234567890-234567890@gmail.com',
|
96
|
+
'hello.-_there@funnychar.com', 'uucp%addr@gmail.com', 'hello+routing-str@gmail.com',
|
97
|
+
'domain@can.haz.many.sub.doma.in', 'student.name@university.edu'
|
98
|
+
].each do |email_str|
|
99
|
+
it "'#{email_str}'" do
|
100
|
+
lambda do
|
101
|
+
u = create_<%= file_name %>(:email => email_str)
|
102
|
+
u.errors.on(:email).should be_nil
|
103
|
+
end.should change(<%= class_name %>, :count).by(1)
|
104
|
+
end
|
105
|
+
end
|
106
|
+
end
|
107
|
+
describe 'disallows illegitimate emails' do
|
108
|
+
['!!@nobadchars.com', 'foo@no-rep-dots..com', 'foo@badtld.xxx', 'foo@toolongtld.abcdefg',
|
109
|
+
'Iñtërnâtiônàlizætiøn@hasnt.happened.to.email', 'need.domain.and.tld@de', "tab\t", "newline\n",
|
110
|
+
'r@.wk', '1234567890-234567890-234567890-234567890-234567890-234567890-234567890-234567890-234567890@gmail2.com',
|
111
|
+
# these are technically allowed but not seen in practice:
|
112
|
+
'uucp!addr@gmail.com', 'semicolon;@gmail.com', 'quote"@gmail.com', 'tick\'@gmail.com', 'backtick`@gmail.com', 'space @gmail.com', 'bracket<@gmail.com', 'bracket>@gmail.com'
|
113
|
+
].each do |email_str|
|
114
|
+
it "'#{email_str}'" do
|
115
|
+
lambda do
|
116
|
+
u = create_<%= file_name %>(:email => email_str)
|
117
|
+
u.errors.on(:email).should_not be_nil
|
118
|
+
end.should_not change(<%= class_name %>, :count)
|
119
|
+
end
|
120
|
+
end
|
121
|
+
end
|
122
|
+
|
123
|
+
describe 'allows legitimate names:' do
|
124
|
+
['Andre The Giant (7\'4", 520 lb.) -- has a posse',
|
125
|
+
'', '1234567890_234567890_234567890_234567890_234567890_234567890_234567890_234567890_234567890_234567890',
|
126
|
+
].each do |name_str|
|
127
|
+
it "'#{name_str}'" do
|
128
|
+
lambda do
|
129
|
+
u = create_<%= file_name %>(:name => name_str)
|
130
|
+
u.errors.on(:name).should be_nil
|
131
|
+
end.should change(<%= class_name %>, :count).by(1)
|
132
|
+
end
|
133
|
+
end
|
134
|
+
end
|
135
|
+
describe "disallows illegitimate names" do
|
136
|
+
["tab\t", "newline\n",
|
137
|
+
'1234567890_234567890_234567890_234567890_234567890_234567890_234567890_234567890_234567890_234567890_',
|
138
|
+
].each do |name_str|
|
139
|
+
it "'#{name_str}'" do
|
140
|
+
lambda do
|
141
|
+
u = create_<%= file_name %>(:name => name_str)
|
142
|
+
u.errors.on(:name).should_not be_nil
|
143
|
+
end.should_not change(<%= class_name %>, :count)
|
144
|
+
end
|
145
|
+
end
|
146
|
+
end
|
147
|
+
|
148
|
+
it 'resets password' do
|
149
|
+
<%= table_name %>(:quentin).update_attributes(:password => 'new password', :password_confirmation => 'new password')
|
150
|
+
<%= class_name %>.authenticate('quentin', 'new password').should == <%= table_name %>(:quentin)
|
151
|
+
end
|
152
|
+
|
153
|
+
it 'does not rehash password' do
|
154
|
+
<%= table_name %>(:quentin).update_attributes(:login => 'quentin2')
|
155
|
+
<%= class_name %>.authenticate('quentin2', 'monkey').should == <%= table_name %>(:quentin)
|
156
|
+
end
|
157
|
+
|
158
|
+
#
|
159
|
+
# Authentication
|
160
|
+
#
|
161
|
+
|
162
|
+
it 'authenticates <%= file_name %>' do
|
163
|
+
<%= class_name %>.authenticate('quentin', 'monkey').should == <%= table_name %>(:quentin)
|
164
|
+
end
|
165
|
+
|
166
|
+
it "doesn't authenticate <%= file_name %> with bad password" do
|
167
|
+
<%= class_name %>.authenticate('quentin', 'invalid_password').should be_nil
|
168
|
+
end
|
169
|
+
|
170
|
+
if REST_AUTH_SITE_KEY.blank?
|
171
|
+
# old-school passwords
|
172
|
+
it "authenticates a user against a hard-coded old-style password" do
|
173
|
+
<%= class_name %>.authenticate('old_password_holder', 'test').should == <%= table_name %>(:old_password_holder)
|
174
|
+
end
|
175
|
+
else
|
176
|
+
it "doesn't authenticate a user against a hard-coded old-style password" do
|
177
|
+
<%= class_name %>.authenticate('old_password_holder', 'test').should be_nil
|
178
|
+
end
|
179
|
+
|
180
|
+
# New installs should bump this up and set REST_AUTH_DIGEST_STRETCHES to give a 10ms encrypt time or so
|
181
|
+
desired_encryption_expensiveness_ms = 0.1
|
182
|
+
it "takes longer than #{desired_encryption_expensiveness_ms}ms to encrypt a password" do
|
183
|
+
test_reps = 100
|
184
|
+
start_time = Time.now; test_reps.times{ <%= class_name %>.authenticate('quentin', 'monkey'+rand.to_s) }; end_time = Time.now
|
185
|
+
auth_time_ms = 1000 * (end_time - start_time)/test_reps
|
186
|
+
auth_time_ms.should > desired_encryption_expensiveness_ms
|
187
|
+
end
|
188
|
+
end
|
189
|
+
|
190
|
+
#
|
191
|
+
# Authentication
|
192
|
+
#
|
193
|
+
|
194
|
+
it 'sets remember token' do
|
195
|
+
<%= table_name %>(:quentin).remember_me
|
196
|
+
<%= table_name %>(:quentin).remember_token.should_not be_nil
|
197
|
+
<%= table_name %>(:quentin).remember_token_expires_at.should_not be_nil
|
198
|
+
end
|
199
|
+
|
200
|
+
it 'unsets remember token' do
|
201
|
+
<%= table_name %>(:quentin).remember_me
|
202
|
+
<%= table_name %>(:quentin).remember_token.should_not be_nil
|
203
|
+
<%= table_name %>(:quentin).forget_me
|
204
|
+
<%= table_name %>(:quentin).remember_token.should be_nil
|
205
|
+
end
|
206
|
+
|
207
|
+
it 'remembers me for one week' do
|
208
|
+
before = 1.week.from_now.utc
|
209
|
+
<%= table_name %>(:quentin).remember_me_for 1.week
|
210
|
+
after = 1.week.from_now.utc
|
211
|
+
<%= table_name %>(:quentin).remember_token.should_not be_nil
|
212
|
+
<%= table_name %>(:quentin).remember_token_expires_at.should_not be_nil
|
213
|
+
<%= table_name %>(:quentin).remember_token_expires_at.between?(before, after).should be_true
|
214
|
+
end
|
215
|
+
|
216
|
+
it 'remembers me until one week' do
|
217
|
+
time = 1.week.from_now.utc
|
218
|
+
<%= table_name %>(:quentin).remember_me_until time
|
219
|
+
<%= table_name %>(:quentin).remember_token.should_not be_nil
|
220
|
+
<%= table_name %>(:quentin).remember_token_expires_at.should_not be_nil
|
221
|
+
<%= table_name %>(:quentin).remember_token_expires_at.should == time
|
222
|
+
end
|
223
|
+
|
224
|
+
it 'remembers me default two weeks' do
|
225
|
+
before = 2.weeks.from_now.utc
|
226
|
+
<%= table_name %>(:quentin).remember_me
|
227
|
+
after = 2.weeks.from_now.utc
|
228
|
+
<%= table_name %>(:quentin).remember_token.should_not be_nil
|
229
|
+
<%= table_name %>(:quentin).remember_token_expires_at.should_not be_nil
|
230
|
+
<%= table_name %>(:quentin).remember_token_expires_at.between?(before, after).should be_true
|
231
|
+
end
|
232
|
+
<% if options[:stateful] %>
|
233
|
+
it 'registers passive <%= file_name %>' do
|
234
|
+
<%= file_name %> = create_<%= file_name %>(:password => nil, :password_confirmation => nil)
|
235
|
+
<%= file_name %>.should be_passive
|
236
|
+
<%= file_name %>.update_attributes(:password => 'new password', :password_confirmation => 'new password')
|
237
|
+
<%= file_name %>.register!
|
238
|
+
<%= file_name %>.should be_pending
|
239
|
+
end
|
240
|
+
|
241
|
+
it 'suspends <%= file_name %>' do
|
242
|
+
<%= table_name %>(:quentin).suspend!
|
243
|
+
<%= table_name %>(:quentin).should be_suspended
|
244
|
+
end
|
245
|
+
|
246
|
+
it 'does not authenticate suspended <%= file_name %>' do
|
247
|
+
<%= table_name %>(:quentin).suspend!
|
248
|
+
<%= class_name %>.authenticate('quentin', 'monkey').should_not == <%= table_name %>(:quentin)
|
249
|
+
end
|
250
|
+
|
251
|
+
it 'deletes <%= file_name %>' do
|
252
|
+
<%= table_name %>(:quentin).deleted_at.should be_nil
|
253
|
+
<%= table_name %>(:quentin).delete!
|
254
|
+
<%= table_name %>(:quentin).deleted_at.should_not be_nil
|
255
|
+
<%= table_name %>(:quentin).should be_deleted
|
256
|
+
end
|
257
|
+
|
258
|
+
describe "being unsuspended" do
|
259
|
+
fixtures :<%= table_name %>
|
260
|
+
|
261
|
+
before do
|
262
|
+
@<%= file_name %> = <%= table_name %>(:quentin)
|
263
|
+
@<%= file_name %>.suspend!
|
264
|
+
end
|
265
|
+
|
266
|
+
it 'reverts to active state' do
|
267
|
+
@<%= file_name %>.unsuspend!
|
268
|
+
@<%= file_name %>.should be_active
|
269
|
+
end
|
270
|
+
|
271
|
+
it 'reverts to passive state if activation_code and activated_at are nil' do
|
272
|
+
<%= class_name %>.update_all :activation_code => nil, :activated_at => nil
|
273
|
+
@<%= file_name %>.reload.unsuspend!
|
274
|
+
@<%= file_name %>.should be_passive
|
275
|
+
end
|
276
|
+
|
277
|
+
it 'reverts to pending state if activation_code is set and activated_at is nil' do
|
278
|
+
<%= class_name %>.update_all :activation_code => 'foo-bar', :activated_at => nil
|
279
|
+
@<%= file_name %>.reload.unsuspend!
|
280
|
+
@<%= file_name %>.should be_pending
|
281
|
+
end
|
282
|
+
end
|
283
|
+
<% end %>
|
284
|
+
protected
|
285
|
+
def create_<%= file_name %>(options = {})
|
286
|
+
record = <%= class_name %>.new({ :login => 'quire', :email => 'quire@example.com', :password => 'quire69', :password_confirmation => 'quire69' }.merge(options))
|
287
|
+
record.<% if options[:stateful] %>register! if record.valid?<% else %>save<% end %>
|
288
|
+
record
|
289
|
+
end
|
290
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
ENV["RAILS_ENV"] = "test"
|
3
|
+
require File.expand_path(File.dirname(__FILE__) + "/../config/environment")
|
4
|
+
require 'spec/rails/story_adapter'
|
5
|
+
require 'spec/story'
|
6
|
+
require File.expand_path(File.dirname(__FILE__) + "/rest_auth_stories_helper.rb")
|
7
|
+
|
8
|
+
# Make visible for testing
|
9
|
+
ApplicationController.send(:public, :logged_in?, :current_user, :authorized?)
|
10
|
+
|
11
|
+
this_dir = File.dirname(__FILE__)
|
12
|
+
Dir[File.join(this_dir, "steps/*.rb")].each do |file|
|
13
|
+
puts file.to_s
|
14
|
+
require file
|
15
|
+
end
|
16
|
+
|
17
|
+
with_steps_for :ra_navigation, :ra_response, :ra_resource, :<%= file_name %> do
|
18
|
+
story_files = Dir[File.join(this_dir, "<%= table_name %>", '*.story')]
|
19
|
+
story_files.each do |file|
|
20
|
+
run file, :type => RailsStory
|
21
|
+
end
|
22
|
+
end
|