authkit 0.5.0 → 0.7.0
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.
- 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
|