authkit 0.5.0 → 0.7.0

Sign up to get free protection for your applications and to get access to all the features.
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