authkit 0.5.0 → 0.7.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +1 -0
- data/CHANGELOG.md +12 -0
- data/README.md +11 -3
- data/Rakefile +15 -8
- data/authkit.gemspec +2 -2
- data/lib/authkit/version.rb +1 -1
- data/lib/generators/authkit/install_generator.rb +8 -1
- data/lib/generators/authkit/templates/app/controllers/application_controller.rb +23 -20
- data/lib/generators/authkit/templates/app/controllers/auths_controller.rb +4 -4
- data/lib/generators/authkit/templates/app/controllers/email_confirmation_controller.rb +3 -6
- data/lib/generators/authkit/templates/app/controllers/password_change_controller.rb +4 -5
- data/lib/generators/authkit/templates/app/controllers/signup_controller.rb +4 -1
- data/lib/generators/authkit/templates/app/controllers/upload_controller.rb +3 -3
- data/lib/generators/authkit/templates/app/controllers/users_controller.rb +1 -3
- data/lib/generators/authkit/templates/app/forms/signup.rb +10 -2
- data/lib/generators/authkit/templates/app/models/user.rb +2 -22
- data/lib/generators/authkit/templates/app/models/user_session.rb +55 -0
- data/lib/generators/authkit/templates/app/views/password_reset/show.html.erb +0 -2
- data/lib/generators/authkit/templates/db/migrate/add_authkit_fields_to_users.rb +1 -10
- data/lib/generators/authkit/templates/db/migrate/create_auths.rb +6 -2
- data/lib/generators/authkit/templates/db/migrate/create_avatars.rb +3 -2
- data/lib/generators/authkit/templates/db/migrate/create_user_sessions.rb +27 -0
- data/lib/generators/authkit/templates/db/migrate/create_users.rb +2 -2
- data/lib/generators/authkit/templates/spec/controllers/application_controller_spec.rb +40 -47
- data/lib/generators/authkit/templates/spec/controllers/email_confirmation_controller_spec.rb +11 -11
- data/lib/generators/authkit/templates/spec/controllers/password_change_controller_spec.rb +21 -26
- data/lib/generators/authkit/templates/spec/controllers/password_reset_controller_spec.rb +11 -16
- data/lib/generators/authkit/templates/spec/controllers/sessions_controller_spec.rb +17 -23
- data/lib/generators/authkit/templates/spec/controllers/signup_controller_spec.rb +21 -29
- data/lib/generators/authkit/templates/spec/controllers/users_controller_spec.rb +14 -18
- data/lib/generators/authkit/templates/spec/factories/user_session.rb +6 -0
- data/lib/generators/authkit/templates/spec/forms/signup_spec.rb +1 -1
- data/lib/generators/authkit/templates/spec/models/user_session_spec.rb +81 -0
- data/lib/generators/authkit/templates/spec/models/user_spec.rb +18 -45
- data/lib/generators/authkit/templates/spec/support/factory_girl.rb +5 -0
- data/lib/generators/authkit/templates/spec/support/shoulda_matchers.rb +6 -0
- metadata +13 -6
@@ -1,12 +1,13 @@
|
|
1
1
|
require 'rails_helper'
|
2
2
|
|
3
|
-
describe UsersController do
|
3
|
+
RSpec.describe UsersController do
|
4
4
|
render_views
|
5
5
|
|
6
|
-
let(:
|
6
|
+
let(:user_session) { create(:user_session) }
|
7
|
+
let(:user) { user_session.user }
|
7
8
|
let(:user_params) { attributes_for(:user) }
|
8
9
|
let(:invalid_params) { user_params.merge(password: 'newpassword', password_confirmation: 'wrongpassword') }
|
9
|
-
let(:logged_in_session) { {
|
10
|
+
let(:logged_in_session) { { user_session_id: user_session.id } }
|
10
11
|
|
11
12
|
describe "GET 'edit'" do
|
12
13
|
it "redirects if there is no current user" do
|
@@ -15,14 +16,14 @@ describe UsersController do
|
|
15
16
|
end
|
16
17
|
|
17
18
|
it "edits the current user" do
|
18
|
-
get :edit,
|
19
|
+
get :edit, session: logged_in_session
|
19
20
|
expect(response).to be_success
|
20
21
|
end
|
21
22
|
end
|
22
23
|
|
23
24
|
describe "PUT 'update'" do
|
24
25
|
it "redirects if there is no current user" do
|
25
|
-
put :update, {user: user_params.merge(first_name: "Alvarez")}
|
26
|
+
put :update, params: { user: user_params.merge(first_name: "Alvarez") }
|
26
27
|
expect(response).to be_redirect
|
27
28
|
end
|
28
29
|
|
@@ -36,18 +37,18 @@ describe UsersController do
|
|
36
37
|
user.email = user.confirmation_email
|
37
38
|
user.confirmation_email = nil
|
38
39
|
expect(user).to_not receive(:send_confirmation)
|
39
|
-
put :update, {user: user_params.merge(confirmation_email: user.email)}, logged_in_session
|
40
|
+
put :update, params: { user: user_params.merge(confirmation_email: user.email) }, session: logged_in_session
|
40
41
|
end
|
41
42
|
|
42
43
|
it "doesn't reconfirm if the confirmation email is unchanged" do
|
43
44
|
expect(user).to_not receive(:send_confirmation)
|
44
|
-
put :update, {user: user_params.merge(confirmation_email: user.email)}, logged_in_session
|
45
|
+
put :update, params: { user: user_params.merge(confirmation_email: user.email) }, session: logged_in_session
|
45
46
|
end
|
46
47
|
|
47
48
|
it "confirms the confirmation email" do
|
48
49
|
user.email = "old@example.com"
|
49
50
|
expect(user).to receive(:send_confirmation).and_return(true)
|
50
|
-
put :update, {user: user_params.merge(confirmation_email: "new@example.com")}, logged_in_session
|
51
|
+
put :update, params: { user: user_params.merge(confirmation_email: "new@example.com") }, session: logged_in_session
|
51
52
|
end
|
52
53
|
end
|
53
54
|
|
@@ -58,12 +59,12 @@ describe UsersController do
|
|
58
59
|
|
59
60
|
it "updates the user" do
|
60
61
|
expect {
|
61
|
-
put :update, {user: user_params.merge(first_name: "Alvarez")}, logged_in_session
|
62
|
+
put :update, params: { user: user_params.merge(first_name: "Alvarez")}, session: logged_in_session
|
62
63
|
}.to change(user, :first_name)
|
63
64
|
end
|
64
65
|
|
65
66
|
it "redirects the user" do
|
66
|
-
put :update, {user: user_params}, logged_in_session
|
67
|
+
put :update, params: { user: user_params }, session: logged_in_session
|
67
68
|
expect(response).to be_redirect
|
68
69
|
end
|
69
70
|
end
|
@@ -75,7 +76,7 @@ describe UsersController do
|
|
75
76
|
|
76
77
|
it "updates the user" do
|
77
78
|
expect {
|
78
|
-
put :update, {user: user_params.merge(first_name: "Alvarez"), format: 'json'}, logged_in_session
|
79
|
+
put :update, params: { user: user_params.merge(first_name: "Alvarez"), format: 'json' }, session: logged_in_session
|
79
80
|
}.to change(user, :first_name)
|
80
81
|
end
|
81
82
|
end
|
@@ -88,12 +89,7 @@ describe UsersController do
|
|
88
89
|
|
89
90
|
describe "from html" do
|
90
91
|
before(:each) do
|
91
|
-
put :update, {user: invalid_params}, logged_in_session
|
92
|
-
end
|
93
|
-
|
94
|
-
it "renders the edit page" do
|
95
|
-
expect(response).to render_template('edit')
|
96
|
-
expect(response).to be_success
|
92
|
+
put :update, params: { user: invalid_params }, session: logged_in_session
|
97
93
|
end
|
98
94
|
|
99
95
|
it "sets the errors" do
|
@@ -103,7 +99,7 @@ describe UsersController do
|
|
103
99
|
|
104
100
|
describe "from json" do
|
105
101
|
before(:each) do
|
106
|
-
put :update, {user: invalid_params, format: 'json'}, logged_in_session
|
102
|
+
put :update, params: { user: invalid_params, format: 'json' }, session: logged_in_session
|
107
103
|
end
|
108
104
|
|
109
105
|
it "returns a 422" do
|
@@ -0,0 +1,81 @@
|
|
1
|
+
require 'rails_helper'
|
2
|
+
|
3
|
+
RSpec.describe UserSession, type: :model do
|
4
|
+
|
5
|
+
let(:user_session) { create(:user_session) }
|
6
|
+
let(:user) { user_session.user }
|
7
|
+
|
8
|
+
it { should belong_to(:user) }
|
9
|
+
|
10
|
+
describe "validations" do
|
11
|
+
it { should validate_presence_of(:user) }
|
12
|
+
end
|
13
|
+
|
14
|
+
describe "scopes" do
|
15
|
+
it "finds active sessions" do
|
16
|
+
user_session
|
17
|
+
revoked_session = create(:user_session, revoked_at: 1.year.ago)
|
18
|
+
logged_out_session = create(:user_session, logged_out_at: 1.year.ago)
|
19
|
+
|
20
|
+
all = UserSession.active.all
|
21
|
+
expect(all).to include(user_session)
|
22
|
+
expect(all.length).to eq(1)
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
describe "tokens" do
|
27
|
+
it "sets the remember token" do
|
28
|
+
user_session.remember_token = nil
|
29
|
+
user_session.save
|
30
|
+
expect(user_session.remember_token).to_not be_blank
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
it "is active" do
|
35
|
+
user_session = UserSession.new
|
36
|
+
expect(user_session).to be_active
|
37
|
+
user_session.revoked_at = Time.now
|
38
|
+
expect(user_session).to_not be_active
|
39
|
+
end
|
40
|
+
|
41
|
+
it "is logged out" do
|
42
|
+
user_session = UserSession.new
|
43
|
+
expect(user_session).to_not be_logged_out
|
44
|
+
user_session.logged_out_at = Time.now
|
45
|
+
expect(user_session).to be_logged_out
|
46
|
+
end
|
47
|
+
|
48
|
+
it "is revoked" do
|
49
|
+
user_session = UserSession.new
|
50
|
+
expect(user_session).to_not be_revoked
|
51
|
+
user_session.revoked_at = Time.now
|
52
|
+
expect(user_session).to be_revoked
|
53
|
+
end
|
54
|
+
|
55
|
+
it "is super user" do
|
56
|
+
user_session = UserSession.new
|
57
|
+
expect(user_session).to_not be_sudo
|
58
|
+
user_session.sudo_enabled_at = Time.now
|
59
|
+
expect(user_session).to be_sudo
|
60
|
+
user_session.sudo_enabled_at = 2.hours.ago
|
61
|
+
expect(user_session).to_not be_sudo
|
62
|
+
end
|
63
|
+
|
64
|
+
it "logs out" do
|
65
|
+
token = user_session.remember_token
|
66
|
+
expect(user_session).to_not be_logged_out
|
67
|
+
user_session.logout
|
68
|
+
expect(user_session).to be_logged_out
|
69
|
+
expect(user_session.logged_out_at).to be_present
|
70
|
+
end
|
71
|
+
|
72
|
+
it "records the access" do
|
73
|
+
now = Time.now
|
74
|
+
allow(Time).to receive(:now).and_return(now)
|
75
|
+
request = double
|
76
|
+
expect(request).to receive(:remote_ip).and_return('1.1.1.1')
|
77
|
+
expect(request).to receive(:user_agent).and_return('webkit')
|
78
|
+
user_session.access(request)
|
79
|
+
expect(user_session.accessed_at).to eq(now)
|
80
|
+
end
|
81
|
+
end
|
@@ -1,8 +1,10 @@
|
|
1
1
|
require 'rails_helper'
|
2
2
|
|
3
|
-
describe User do
|
3
|
+
RSpec.describe User, type: :model do
|
4
4
|
let(:user_params) { attributes_for(:user) }
|
5
5
|
|
6
|
+
it { should have_many(:sessions) }
|
7
|
+
|
6
8
|
it "has secure password support" do
|
7
9
|
expect(User.new).to respond_to(:authenticate)
|
8
10
|
end
|
@@ -27,9 +29,9 @@ describe User do
|
|
27
29
|
before(:each) do
|
28
30
|
create(:user)
|
29
31
|
end
|
30
|
-
<% if username? %>it { should validate_uniqueness_of(:username) }
|
31
|
-
<% end %>it { should validate_uniqueness_of(:email) }
|
32
|
-
it "validates the uniqueness of the
|
32
|
+
<% if username? %>it { should validate_uniqueness_of(:username).case_insensitive }
|
33
|
+
<% end %>it { should validate_uniqueness_of(:email).case_insensitive }
|
34
|
+
it "validates the uniqueness of the confirmation email" do
|
33
35
|
existing_user = create(:user)
|
34
36
|
user = build(:user, email: "old@example.com")
|
35
37
|
user.confirmation_email = "new@example.com"
|
@@ -45,26 +47,6 @@ describe User do
|
|
45
47
|
|
46
48
|
end
|
47
49
|
|
48
|
-
describe "tokens" do
|
49
|
-
it "sets the remember token" do
|
50
|
-
user = User.new
|
51
|
-
expect(user).to receive(:save!).and_return(true)
|
52
|
-
user.set_remember_token
|
53
|
-
expect(user.remember_token).to_not be_blank
|
54
|
-
expect(user.remember_token_created_at).to_not be_blank
|
55
|
-
end
|
56
|
-
|
57
|
-
it "clears the remember token" do
|
58
|
-
user = User.new
|
59
|
-
expect(user).to receive(:save!).and_return(true)
|
60
|
-
user.remember_token = "TOKEN"
|
61
|
-
user.remember_token_created_at = Time.now
|
62
|
-
user.clear_remember_token
|
63
|
-
expect(user.remember_token).to be_nil
|
64
|
-
expect(user.remember_token_created_at).to be_nil
|
65
|
-
end
|
66
|
-
end
|
67
|
-
|
68
50
|
describe "token expiry" do
|
69
51
|
it "should expire reset password tokens" do
|
70
52
|
user = User.new
|
@@ -83,15 +65,6 @@ describe User do
|
|
83
65
|
user.confirmation_token_created_at = 3.days.ago
|
84
66
|
expect(user.confirmation_token_expired?).to eq(true)
|
85
67
|
end
|
86
|
-
|
87
|
-
it "should expire remember tokens" do
|
88
|
-
user = User.new
|
89
|
-
expect(user.remember_token_expired?).to eq(true)
|
90
|
-
user.remember_token_created_at = 30.days.ago
|
91
|
-
expect(user.remember_token_expired?).to eq(false)
|
92
|
-
user.remember_token_created_at = 1.years.ago
|
93
|
-
expect(user.remember_token_expired?).to eq(true)
|
94
|
-
end
|
95
68
|
end
|
96
69
|
|
97
70
|
describe "display name" do
|
@@ -147,17 +120,17 @@ describe User do
|
|
147
120
|
|
148
121
|
describe "with valid params" do
|
149
122
|
it "confirms the email" do
|
150
|
-
user =
|
123
|
+
user = build(:user)
|
151
124
|
expect(user).to receive(:save!).and_return(true)
|
152
125
|
allow(Time).to receive(:now).and_return(time = Time.now)
|
153
126
|
|
154
127
|
user.send_confirmation
|
155
|
-
expect(user.confirmation_token_created_at).to eq(time)
|
128
|
+
expect(user.confirmation_token_created_at).to eq(time.to_s)
|
156
129
|
expect(user.confirmation_token).to_not be_blank
|
157
130
|
end
|
158
131
|
|
159
132
|
it "generates a token before it sends confirmation email instructions" do
|
160
|
-
user =
|
133
|
+
user = build(:user)
|
161
134
|
expect(user).to receive(:save!).and_return(true)
|
162
135
|
user.send_confirmation
|
163
136
|
expect(user.confirmation_token).to_not be_blank
|
@@ -165,7 +138,7 @@ describe User do
|
|
165
138
|
end
|
166
139
|
|
167
140
|
it "sends confirmation email instructions" do
|
168
|
-
user =
|
141
|
+
user = build(:user)
|
169
142
|
expect(user).to receive(:save!).and_return(true)
|
170
143
|
user.send_confirmation
|
171
144
|
end
|
@@ -219,20 +192,20 @@ describe User do
|
|
219
192
|
expect(user).to receive(:save).and_return(true)
|
220
193
|
user.change_password("password", "password")
|
221
194
|
expect(user.password_digest).to_not be_blank
|
222
|
-
expect(user.
|
223
|
-
expect(user.
|
195
|
+
expect(user.reset_password_token).to be_nil
|
196
|
+
expect(user.reset_password_token_created_at).to be_nil
|
224
197
|
end
|
225
198
|
|
226
199
|
it "doesn't change the password if it doesn't match" do
|
227
|
-
user =
|
228
|
-
user.
|
200
|
+
user = build(:user)
|
201
|
+
user.reset_password_token = "token"
|
229
202
|
user.change_password("password", "typotypo")
|
230
203
|
expect(user).to_not be_valid
|
231
|
-
expect(user.
|
204
|
+
expect(user.reset_password_token).to eq("token")
|
232
205
|
end
|
233
206
|
|
234
207
|
it "resets the password" do
|
235
|
-
user =
|
208
|
+
user = build(:user)
|
236
209
|
expect(user).to receive(:save!).and_return(true)
|
237
210
|
allow(Time).to receive(:now).and_return(time = Time.now)
|
238
211
|
|
@@ -242,7 +215,7 @@ describe User do
|
|
242
215
|
end
|
243
216
|
|
244
217
|
it "generates a token before it sends reset password instructions" do
|
245
|
-
user =
|
218
|
+
user = build(:user)
|
246
219
|
expect(user).to receive(:save!).and_return(true)
|
247
220
|
user.send_reset_password
|
248
221
|
expect(user.reset_password_token).to_not be_blank
|
@@ -250,7 +223,7 @@ describe User do
|
|
250
223
|
end
|
251
224
|
|
252
225
|
it "sends reset password instructions" do
|
253
|
-
user =
|
226
|
+
user = build(:user)
|
254
227
|
expect(user).to receive(:save!).and_return(true)
|
255
228
|
user.send_reset_password
|
256
229
|
end
|
@@ -0,0 +1,6 @@
|
|
1
|
+
# Shoulda matchers allow you to quickly verify validations and relationships
|
2
|
+
# The syntax methods give you inline matcher syntax
|
3
|
+
RSpec.configure do |config|
|
4
|
+
config.include(Shoulda::Matchers::ActiveModel, type: :model)
|
5
|
+
config.include(Shoulda::Matchers::ActiveRecord, type: :model)
|
6
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: authkit
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.7.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jeff Rafter
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2017-01-11 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -39,7 +39,7 @@ dependencies:
|
|
39
39
|
- !ruby/object:Gem::Version
|
40
40
|
version: '0'
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
|
-
name: rspec
|
42
|
+
name: rspec
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
44
44
|
requirements:
|
45
45
|
- - ">="
|
@@ -53,7 +53,7 @@ dependencies:
|
|
53
53
|
- !ruby/object:Gem::Version
|
54
54
|
version: '0'
|
55
55
|
- !ruby/object:Gem::Dependency
|
56
|
-
name:
|
56
|
+
name: rspec-rails
|
57
57
|
requirement: !ruby/object:Gem::Requirement
|
58
58
|
requirements:
|
59
59
|
- - ">="
|
@@ -67,7 +67,7 @@ dependencies:
|
|
67
67
|
- !ruby/object:Gem::Version
|
68
68
|
version: '0'
|
69
69
|
- !ruby/object:Gem::Dependency
|
70
|
-
name:
|
70
|
+
name: rails
|
71
71
|
requirement: !ruby/object:Gem::Requirement
|
72
72
|
requirements:
|
73
73
|
- - ">="
|
@@ -88,6 +88,7 @@ extensions: []
|
|
88
88
|
extra_rdoc_files: []
|
89
89
|
files:
|
90
90
|
- ".gitignore"
|
91
|
+
- CHANGELOG.md
|
91
92
|
- FEATURES.md
|
92
93
|
- Gemfile
|
93
94
|
- LICENSE.txt
|
@@ -115,6 +116,7 @@ files:
|
|
115
116
|
- lib/generators/authkit/templates/app/models/auth.rb
|
116
117
|
- lib/generators/authkit/templates/app/models/avatar.rb
|
117
118
|
- lib/generators/authkit/templates/app/models/user.rb
|
119
|
+
- lib/generators/authkit/templates/app/models/user_session.rb
|
118
120
|
- lib/generators/authkit/templates/app/views/auths/connect.html.erb
|
119
121
|
- lib/generators/authkit/templates/app/views/password_change/show.html.erb
|
120
122
|
- lib/generators/authkit/templates/app/views/password_reset/show.html.erb
|
@@ -129,6 +131,7 @@ files:
|
|
129
131
|
- lib/generators/authkit/templates/db/migrate/add_authkit_fields_to_users.rb
|
130
132
|
- lib/generators/authkit/templates/db/migrate/create_auths.rb
|
131
133
|
- lib/generators/authkit/templates/db/migrate/create_avatars.rb
|
134
|
+
- lib/generators/authkit/templates/db/migrate/create_user_sessions.rb
|
132
135
|
- lib/generators/authkit/templates/db/migrate/create_users.rb
|
133
136
|
- lib/generators/authkit/templates/lib/email_format_validator.rb
|
134
137
|
- lib/generators/authkit/templates/lib/full_name_splitter.rb
|
@@ -142,9 +145,13 @@ files:
|
|
142
145
|
- lib/generators/authkit/templates/spec/controllers/signup_controller_spec.rb
|
143
146
|
- lib/generators/authkit/templates/spec/controllers/users_controller_spec.rb
|
144
147
|
- lib/generators/authkit/templates/spec/factories/user.rb
|
148
|
+
- lib/generators/authkit/templates/spec/factories/user_session.rb
|
145
149
|
- lib/generators/authkit/templates/spec/forms/signup_spec.rb
|
146
150
|
- lib/generators/authkit/templates/spec/models/auth_spec.rb
|
151
|
+
- lib/generators/authkit/templates/spec/models/user_session_spec.rb
|
147
152
|
- lib/generators/authkit/templates/spec/models/user_spec.rb
|
153
|
+
- lib/generators/authkit/templates/spec/support/factory_girl.rb
|
154
|
+
- lib/generators/authkit/templates/spec/support/shoulda_matchers.rb
|
148
155
|
- spec/rails_helper.rb
|
149
156
|
- spec/spec_helper.rb
|
150
157
|
homepage: https://github.com/jeffrafter/authkit
|
@@ -167,7 +174,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
167
174
|
version: '0'
|
168
175
|
requirements: []
|
169
176
|
rubyforge_project:
|
170
|
-
rubygems_version: 2.
|
177
|
+
rubygems_version: 2.6.6
|
171
178
|
signing_key:
|
172
179
|
specification_version: 4
|
173
180
|
summary: Auth for your Rails application
|