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.
Files changed (38) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +1 -0
  3. data/CHANGELOG.md +12 -0
  4. data/README.md +11 -3
  5. data/Rakefile +15 -8
  6. data/authkit.gemspec +2 -2
  7. data/lib/authkit/version.rb +1 -1
  8. data/lib/generators/authkit/install_generator.rb +8 -1
  9. data/lib/generators/authkit/templates/app/controllers/application_controller.rb +23 -20
  10. data/lib/generators/authkit/templates/app/controllers/auths_controller.rb +4 -4
  11. data/lib/generators/authkit/templates/app/controllers/email_confirmation_controller.rb +3 -6
  12. data/lib/generators/authkit/templates/app/controllers/password_change_controller.rb +4 -5
  13. data/lib/generators/authkit/templates/app/controllers/signup_controller.rb +4 -1
  14. data/lib/generators/authkit/templates/app/controllers/upload_controller.rb +3 -3
  15. data/lib/generators/authkit/templates/app/controllers/users_controller.rb +1 -3
  16. data/lib/generators/authkit/templates/app/forms/signup.rb +10 -2
  17. data/lib/generators/authkit/templates/app/models/user.rb +2 -22
  18. data/lib/generators/authkit/templates/app/models/user_session.rb +55 -0
  19. data/lib/generators/authkit/templates/app/views/password_reset/show.html.erb +0 -2
  20. data/lib/generators/authkit/templates/db/migrate/add_authkit_fields_to_users.rb +1 -10
  21. data/lib/generators/authkit/templates/db/migrate/create_auths.rb +6 -2
  22. data/lib/generators/authkit/templates/db/migrate/create_avatars.rb +3 -2
  23. data/lib/generators/authkit/templates/db/migrate/create_user_sessions.rb +27 -0
  24. data/lib/generators/authkit/templates/db/migrate/create_users.rb +2 -2
  25. data/lib/generators/authkit/templates/spec/controllers/application_controller_spec.rb +40 -47
  26. data/lib/generators/authkit/templates/spec/controllers/email_confirmation_controller_spec.rb +11 -11
  27. data/lib/generators/authkit/templates/spec/controllers/password_change_controller_spec.rb +21 -26
  28. data/lib/generators/authkit/templates/spec/controllers/password_reset_controller_spec.rb +11 -16
  29. data/lib/generators/authkit/templates/spec/controllers/sessions_controller_spec.rb +17 -23
  30. data/lib/generators/authkit/templates/spec/controllers/signup_controller_spec.rb +21 -29
  31. data/lib/generators/authkit/templates/spec/controllers/users_controller_spec.rb +14 -18
  32. data/lib/generators/authkit/templates/spec/factories/user_session.rb +6 -0
  33. data/lib/generators/authkit/templates/spec/forms/signup_spec.rb +1 -1
  34. data/lib/generators/authkit/templates/spec/models/user_session_spec.rb +81 -0
  35. data/lib/generators/authkit/templates/spec/models/user_spec.rb +18 -45
  36. data/lib/generators/authkit/templates/spec/support/factory_girl.rb +5 -0
  37. data/lib/generators/authkit/templates/spec/support/shoulda_matchers.rb +6 -0
  38. 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(:user) { create(:user) }
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) { { user_id: user.id } }
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, {}, logged_in_session
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,6 @@
1
+ FactoryGirl.define do
2
+ factory :user_session do
3
+ user
4
+ end
5
+ end
6
+
@@ -1,6 +1,6 @@
1
1
  require 'rails_helper'
2
2
 
3
- describe Signup do
3
+ RSpec.describe Signup, type: :model do
4
4
  let(:signup) { Signup.new }
5
5
 
6
6
  it "should not be persisted" 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 the confirmation email" do
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 = User.new
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 = User.new
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 = User.new
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.remember_token).to be_nil
223
- expect(user.remember_token_created_at).to be_nil
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 = User.new
228
- user.remember_token = "token"
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.remember_token).to eq("token")
204
+ expect(user.reset_password_token).to eq("token")
232
205
  end
233
206
 
234
207
  it "resets the password" do
235
- user = User.new
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 = User.new
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 = User.new
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,5 @@
1
+ # FactoryGirl allows you to quickly create template based objects
2
+ # The syntax methods give you inline `create` and a `build` commands
3
+ RSpec.configure do |config|
4
+ config.include FactoryGirl::Syntax::Methods
5
+ 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.5.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: 2014-10-13 00:00:00.000000000 Z
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-rails
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: factory_girl_rails
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: active_model_otp
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.2.2
177
+ rubygems_version: 2.6.6
171
178
  signing_key:
172
179
  specification_version: 4
173
180
  summary: Auth for your Rails application