thoughtbot-clearance 0.3.8 → 0.3.9
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/README.textile +17 -16
- data/Rakefile +8 -7
- data/TODO.textile +3 -3
- data/generators/clearance/clearance_generator.rb +1 -1
- data/generators/clearance/templates/app/views/clearance_mailer/change_password.html.erb +1 -1
- data/generators/clearance/templates/app/views/passwords/edit.html.erb +1 -1
- data/generators/clearance/templates/app/views/sessions/new.html.erb +2 -2
- data/generators/clearance/templates/db/migrate/create_users_with_clearance_columns.rb +3 -3
- data/generators/clearance/templates/db/migrate/update_users_with_clearance_columns.rb +14 -13
- data/generators/clearance/templates/test/factories/clearance.rb +16 -0
- data/lib/clearance/app/controllers/application_controller.rb +26 -14
- data/lib/clearance/app/controllers/confirmations_controller.rb +6 -3
- data/lib/clearance/app/controllers/passwords_controller.rb +15 -9
- data/lib/clearance/app/controllers/sessions_controller.rb +21 -17
- data/lib/clearance/app/controllers/users_controller.rb +4 -3
- data/lib/clearance/app/models/clearance_mailer.rb +1 -1
- data/lib/clearance/app/models/user.rb +15 -16
- data/lib/clearance/test/functional/confirmations_controller_test.rb +18 -30
- data/lib/clearance/test/functional/passwords_controller_test.rb +27 -45
- data/lib/clearance/test/functional/sessions_controller_test.rb +23 -27
- data/lib/clearance/test/functional/users_controller_test.rb +38 -28
- data/lib/clearance/test/test_helper.rb +7 -2
- data/lib/clearance/test/unit/clearance_mailer_test.rb +7 -5
- data/lib/clearance/test/unit/user_test.rb +107 -138
- data/shoulda_macros/clearance.rb +134 -6
- metadata +7 -3
- data/generators/clearance/templates/test/factories/clearance_user.rb +0 -9
@@ -3,15 +3,19 @@ module Clearance
|
|
3
3
|
module Functional
|
4
4
|
module UsersControllerTest
|
5
5
|
|
6
|
-
def self.included(
|
7
|
-
|
6
|
+
def self.included(controller_test)
|
7
|
+
controller_test.class_eval do
|
8
|
+
|
9
|
+
should_filter_params :password
|
10
|
+
|
8
11
|
public_context do
|
9
|
-
|
10
|
-
context "on GET to /users/new" do
|
12
|
+
context "When getting new User view" do
|
11
13
|
setup { get :new }
|
14
|
+
|
12
15
|
should_respond_with :success
|
13
16
|
should_render_template :new
|
14
17
|
should_not_set_the_flash
|
18
|
+
|
15
19
|
should "display a form to register" do
|
16
20
|
assert_select "form[action=#{users_path}][method=post]",
|
17
21
|
true, "There must be a form to register" do
|
@@ -25,48 +29,54 @@ module Clearance
|
|
25
29
|
"There must be a submit button"
|
26
30
|
end
|
27
31
|
end
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
32
|
+
end
|
33
|
+
|
34
|
+
context "Given email parameter when getting new User view" do
|
35
|
+
setup do
|
36
|
+
@email = "a@example.com"
|
37
|
+
get :new, :user => { :email => @email }
|
38
|
+
end
|
34
39
|
|
35
|
-
|
36
|
-
|
37
|
-
assert_equal @email, assigns(:user).email
|
38
|
-
end
|
40
|
+
should "set assigned user's email" do
|
41
|
+
assert_equal @email, assigns(:user).email
|
39
42
|
end
|
40
43
|
end
|
41
44
|
|
42
|
-
context "
|
45
|
+
context "Given valid attributes when creating a new user" do
|
43
46
|
setup do
|
44
|
-
|
45
|
-
|
46
|
-
:password_confirmation => 'skerit'})
|
47
|
+
user_attributes = Factory.attributes_for(:registered_user)
|
48
|
+
post :create, :user => user_attributes
|
47
49
|
end
|
48
50
|
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
51
|
+
should_create_user_successfully
|
52
|
+
end
|
53
|
+
|
54
|
+
context "Given valid email confirmation attributes when creating a new user" do
|
55
|
+
setup do
|
56
|
+
user_attributes = Factory.attributes_for(:email_confirmed_user)
|
57
|
+
post :create, :user => user_attributes
|
58
|
+
end
|
59
|
+
|
60
|
+
should_create_user_successfully
|
61
|
+
|
62
|
+
should "not confirm email" do
|
63
|
+
assert ! assigns(:user).email_confirmed
|
64
|
+
end
|
53
65
|
end
|
54
|
-
|
55
66
|
end
|
56
67
|
|
57
|
-
|
68
|
+
signed_in_user_context do
|
58
69
|
context "GET to new" do
|
59
70
|
setup { get :new }
|
60
|
-
should_redirect_to
|
71
|
+
should_redirect_to "root_url"
|
61
72
|
end
|
62
73
|
|
63
74
|
context "POST to create" do
|
64
75
|
setup { post :create, :user => {} }
|
65
|
-
should_redirect_to
|
76
|
+
should_redirect_to "root_url"
|
66
77
|
end
|
67
|
-
|
68
|
-
should_filter_params :password
|
69
78
|
end
|
79
|
+
|
70
80
|
end
|
71
81
|
end
|
72
82
|
end
|
@@ -5,14 +5,19 @@ module Clearance
|
|
5
5
|
def self.included(test_helper)
|
6
6
|
test_helper.class_eval do
|
7
7
|
|
8
|
-
def
|
9
|
-
user
|
8
|
+
def sign_in_as(user = nil)
|
9
|
+
unless user
|
10
|
+
user = Factory(:registered_user)
|
11
|
+
user.confirm_email!
|
12
|
+
end
|
10
13
|
@request.session[:user_id] = user.id
|
14
|
+
@request.session[:salt] = user.salt
|
11
15
|
return user
|
12
16
|
end
|
13
17
|
|
14
18
|
def logout
|
15
19
|
@request.session[:user_id] = nil
|
20
|
+
@request.session[:salt] = nil
|
16
21
|
end
|
17
22
|
|
18
23
|
end
|
@@ -3,11 +3,12 @@ module Clearance
|
|
3
3
|
module Unit
|
4
4
|
module ClearanceMailerTest
|
5
5
|
|
6
|
-
def self.included(
|
7
|
-
|
6
|
+
def self.included(mailer_test)
|
7
|
+
mailer_test.class_eval do
|
8
|
+
|
8
9
|
context "A change password email" do
|
9
10
|
setup do
|
10
|
-
@user
|
11
|
+
@user = Factory(:registered_user)
|
11
12
|
@email = ClearanceMailer.create_change_password @user
|
12
13
|
end
|
13
14
|
|
@@ -17,7 +18,7 @@ module Clearance
|
|
17
18
|
|
18
19
|
should "contain a link to edit the user's password" do
|
19
20
|
host = ActionMailer::Base.default_url_options[:host]
|
20
|
-
regexp = %r{http://#{host}/users/#{@user.id}/password/edit\?email=#{@user.email.gsub("@", "%40")}&password=#{@user.
|
21
|
+
regexp = %r{http://#{host}/users/#{@user.id}/password/edit\?email=#{@user.email.gsub("@", "%40")}&password=#{@user.encrypted_password}}
|
21
22
|
assert_match regexp, @email.body
|
22
23
|
end
|
23
24
|
|
@@ -32,7 +33,7 @@ module Clearance
|
|
32
33
|
|
33
34
|
context "A confirmation email" do
|
34
35
|
setup do
|
35
|
-
@user
|
36
|
+
@user = Factory(:registered_user)
|
36
37
|
@email = ClearanceMailer.create_confirmation @user
|
37
38
|
end
|
38
39
|
|
@@ -54,6 +55,7 @@ module Clearance
|
|
54
55
|
assert_match regexp, @email.body
|
55
56
|
end
|
56
57
|
end
|
58
|
+
|
57
59
|
end
|
58
60
|
end
|
59
61
|
|
@@ -3,188 +3,157 @@ module Clearance
|
|
3
3
|
module Unit
|
4
4
|
module UserTest
|
5
5
|
|
6
|
-
def self.included(
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
6
|
+
def self.included(unit_test)
|
7
|
+
unit_test.class_eval do
|
8
|
+
|
9
|
+
# registering
|
10
|
+
|
11
|
+
context "When registering" do
|
12
|
+
should_require_attributes :email
|
13
|
+
should_allow_values_for :email, "foo@example.com"
|
14
|
+
should_not_allow_values_for :email, "foo"
|
15
|
+
should_not_allow_values_for :email, "example.com"
|
16
|
+
|
17
|
+
should_validate_confirmation_of :password,
|
18
|
+
:factory => :registered_user
|
19
|
+
|
20
|
+
should "initialize salt" do
|
21
|
+
assert_not_nil Factory(:registered_user).salt
|
22
|
+
end
|
23
|
+
|
24
|
+
context "encrypt password" do
|
25
|
+
setup do
|
26
|
+
@salt = "salt"
|
27
|
+
User.any_instance.stubs(:initialize_salt)
|
12
28
|
|
13
|
-
|
14
|
-
|
15
|
-
assert !user.save
|
16
|
-
assert_match(/confirmation/i, user.errors.on(:password))
|
17
|
-
end
|
29
|
+
@user = Factory(:registered_user, :salt => @salt)
|
30
|
+
@password = @user.password
|
18
31
|
|
19
|
-
|
20
|
-
|
21
|
-
|
32
|
+
@user.encrypt(@password)
|
33
|
+
@expected = Digest::SHA512.hexdigest("--#{@salt}--#{@password}--")
|
34
|
+
end
|
22
35
|
|
23
|
-
|
36
|
+
should "create an encrypted password using SHA512 encryption" do
|
37
|
+
assert_equal @expected, @user.encrypted_password
|
38
|
+
assert_not_equal @password, @user.encrypted_password
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
should "store email in lower case" do
|
43
|
+
user = Factory(:registered_user, :email => "John.Doe@example.com")
|
44
|
+
assert_equal "john.doe@example.com", user.email
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
context "When multiple users have registerd" do
|
49
|
+
setup { @user = Factory(:registered_user) }
|
50
|
+
|
51
|
+
should_require_unique_attributes :email
|
52
|
+
end
|
53
|
+
|
54
|
+
# confirming email
|
55
|
+
|
56
|
+
context "A registered user without email confirmation" do
|
24
57
|
setup do
|
25
|
-
@user = Factory(:
|
26
|
-
|
27
|
-
@crypt = @user.crypted_password
|
28
|
-
assert_not_nil @user.salt
|
29
|
-
@salt = @user.salt
|
30
|
-
@user.password = 'a_new_password'
|
31
|
-
@user.password_confirmation = 'a_new_password'
|
32
|
-
assert @user.save
|
58
|
+
@user = Factory(:registered_user)
|
59
|
+
assert ! @user.email_confirmed?
|
33
60
|
end
|
34
61
|
|
35
|
-
|
36
|
-
|
37
|
-
|
62
|
+
context "after #confirm_email!" do
|
63
|
+
setup do
|
64
|
+
assert @user.confirm_email!
|
65
|
+
@user.reload
|
66
|
+
end
|
67
|
+
|
68
|
+
should "have confirmed their email" do
|
69
|
+
assert @user.email_confirmed?
|
70
|
+
end
|
38
71
|
end
|
39
72
|
end
|
73
|
+
|
74
|
+
# authenticating
|
40
75
|
|
41
|
-
context
|
76
|
+
context "A user" do
|
42
77
|
setup do
|
43
|
-
@
|
44
|
-
User.any_instance.stubs(:initialize_salt)
|
45
|
-
|
46
|
-
@user = Factory(:clearance_user, :salt => @salt)
|
78
|
+
@user = Factory(:registered_user)
|
47
79
|
@password = @user.password
|
48
80
|
end
|
49
|
-
|
50
|
-
should "require password validation on update" do
|
51
|
-
@user.update_attributes :password => "blah",
|
52
|
-
:password_confirmation => "boogidy"
|
53
|
-
assert !@user.save
|
54
|
-
assert_match(/confirmation/i, @user.errors.on(:password))
|
55
|
-
end
|
56
|
-
|
57
|
-
should_require_unique_attributes :email
|
58
|
-
|
59
|
-
should 'store email in lower case' do
|
60
|
-
@user.update_attributes(:email => 'John.Doe@example.com')
|
61
|
-
assert_equal 'john.doe@example.com', @user.email
|
62
|
-
end
|
63
81
|
|
64
82
|
should "authenticate with good credentials" do
|
65
83
|
assert User.authenticate(@user.email, @password)
|
84
|
+
assert @user.authenticated?(@password)
|
66
85
|
end
|
67
86
|
|
68
87
|
should "authenticate with good credentials, email in uppercase" do
|
69
88
|
assert User.authenticate(@user.email.upcase, @password)
|
89
|
+
assert @user.authenticated?(@password)
|
70
90
|
end
|
71
91
|
|
72
92
|
should "not authenticate with bad credentials" do
|
73
93
|
assert ! User.authenticate(@user.email, 'horribly_wrong_password')
|
74
|
-
end
|
75
|
-
|
76
|
-
should "be authenticated with a good password" do
|
77
|
-
assert @user.authenticated?(@password)
|
78
|
-
end
|
79
|
-
|
80
|
-
should "not be authenticated with a bad password" do
|
81
94
|
assert ! @user.authenticated?('horribly_wrong_password')
|
82
95
|
end
|
96
|
+
end
|
83
97
|
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
assert_not_equal @password, @crypted
|
93
|
-
end
|
98
|
+
# remember me
|
99
|
+
|
100
|
+
context "When registering with remember_me!" do
|
101
|
+
setup do
|
102
|
+
@user = Factory(:registered_user)
|
103
|
+
assert_nil @user.remember_token
|
104
|
+
assert_nil @user.remember_token_expires_at
|
105
|
+
@user.remember_me!
|
94
106
|
end
|
95
107
|
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
assert_nil @user.remember_token_expires_at
|
100
|
-
@user.remember_me!
|
101
|
-
end
|
102
|
-
|
103
|
-
should 'set the remember token and expiration date' do
|
104
|
-
assert_not_nil @user.remember_token
|
105
|
-
assert_not_nil @user.remember_token_expires_at
|
106
|
-
end
|
107
|
-
|
108
|
-
should 'remember_token?' do
|
109
|
-
assert @user.remember_token?
|
110
|
-
end
|
111
|
-
|
112
|
-
context 'forget_me!' do
|
113
|
-
setup { @user.forget_me! }
|
114
|
-
|
115
|
-
should 'unset the remember token and expiration date' do
|
116
|
-
assert_nil @user.remember_token
|
117
|
-
assert_nil @user.remember_token_expires_at
|
118
|
-
end
|
119
|
-
|
120
|
-
should 'not remember_token?' do
|
121
|
-
assert ! @user.remember_token?
|
122
|
-
end
|
123
|
-
end
|
108
|
+
should "set the remember token and expiration date" do
|
109
|
+
assert_not_nil @user.remember_token
|
110
|
+
assert_not_nil @user.remember_token_expires_at
|
124
111
|
end
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
2.weeks.from_now.utc
|
131
|
-
end
|
132
|
-
|
133
|
-
should 'be true' do
|
134
|
-
assert @user.remember_token?
|
135
|
-
end
|
136
|
-
end
|
137
|
-
|
138
|
-
context 'when token expired' do
|
139
|
-
setup do
|
140
|
-
@user.update_attribute :remember_token_expires_at,
|
141
|
-
2.weeks.ago.utc
|
142
|
-
end
|
143
|
-
|
144
|
-
should 'be false' do
|
145
|
-
assert ! @user.remember_token?
|
146
|
-
end
|
147
|
-
end
|
112
|
+
|
113
|
+
should "remember user when token expires in the future" do
|
114
|
+
@user.update_attribute :remember_token_expires_at,
|
115
|
+
2.weeks.from_now.utc
|
116
|
+
assert @user.remember?
|
148
117
|
end
|
149
118
|
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
-
should "find that user" do
|
156
|
-
assert_equal @user, @found_user
|
157
|
-
end
|
119
|
+
should "not remember user when token has already expired" do
|
120
|
+
@user.update_attribute :remember_token_expires_at,
|
121
|
+
2.weeks.ago.utc
|
122
|
+
assert ! @user.remember?
|
158
123
|
end
|
124
|
+
|
125
|
+
# logging out
|
126
|
+
|
127
|
+
context "forget_me!" do
|
128
|
+
setup { @user.forget_me! }
|
159
129
|
|
160
|
-
|
161
|
-
|
162
|
-
@
|
130
|
+
should "unset the remember token and expiration date" do
|
131
|
+
assert_nil @user.remember_token
|
132
|
+
assert_nil @user.remember_token_expires_at
|
163
133
|
end
|
164
134
|
|
165
|
-
should "
|
166
|
-
|
135
|
+
should "not remember user" do
|
136
|
+
assert ! @user.remember?
|
167
137
|
end
|
168
138
|
end
|
169
139
|
end
|
140
|
+
|
141
|
+
# updating password
|
142
|
+
|
143
|
+
context "An email confirmed user" do
|
144
|
+
setup { @user = Factory(:email_confirmed_user) }
|
170
145
|
|
171
|
-
|
172
|
-
setup do
|
173
|
-
@user = Factory(:clearance_user)
|
174
|
-
end
|
175
|
-
|
176
|
-
context 'when sent #confirm!' do
|
146
|
+
context "who changes and confirms password" do
|
177
147
|
setup do
|
178
|
-
|
179
|
-
|
180
|
-
@user.
|
148
|
+
@user.password = "new_password"
|
149
|
+
@user.password_confirmation = "new_password"
|
150
|
+
@user.save
|
181
151
|
end
|
182
152
|
|
183
|
-
|
184
|
-
assert @user.confirmed?
|
185
|
-
end
|
153
|
+
should_change "@user.encrypted_password"
|
186
154
|
end
|
187
155
|
end
|
156
|
+
|
188
157
|
end
|
189
158
|
end
|
190
159
|
|