jump_in 0.0.1
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 +7 -0
- data/MIT-LICENSE +20 -0
- data/README.rdoc +0 -0
- data/Rakefile +23 -0
- data/lib/jump_in/authentication/by_password.rb +13 -0
- data/lib/jump_in/authentication/strategy.rb +16 -0
- data/lib/jump_in/authentication.rb +97 -0
- data/lib/jump_in/password_reset.rb +54 -0
- data/lib/jump_in/tokenizer.rb +21 -0
- data/lib/jump_in/version.rb +3 -0
- data/lib/jump_in.rb +8 -0
- data/lib/tasks/jump_in_tasks.rake +4 -0
- data/spec/dummy/README.rdoc +28 -0
- data/spec/dummy/Rakefile +6 -0
- data/spec/dummy/app/controllers/application_controller.rb +8 -0
- data/spec/dummy/app/controllers/password_resets_controller.rb +34 -0
- data/spec/dummy/app/controllers/sessions_controller.rb +16 -0
- data/spec/dummy/app/controllers/users_controller.rb +32 -0
- data/spec/dummy/app/mailers/system_mailer.rb +8 -0
- data/spec/dummy/app/models/user.rb +3 -0
- data/spec/dummy/app/views/layouts/application.html.erb +18 -0
- data/spec/dummy/app/views/password_resets/edit.html.erb +9 -0
- data/spec/dummy/app/views/password_resets/new.html.erb +7 -0
- data/spec/dummy/app/views/sessions/new.html.erb +7 -0
- data/spec/dummy/app/views/system_mailer/password_reset.html.erb +2 -0
- data/spec/dummy/app/views/users/show.html.erb +1 -0
- data/spec/dummy/bin/bundle +3 -0
- data/spec/dummy/bin/rails +4 -0
- data/spec/dummy/bin/rake +4 -0
- data/spec/dummy/bin/setup +29 -0
- data/spec/dummy/config/application.rb +32 -0
- data/spec/dummy/config/boot.rb +5 -0
- data/spec/dummy/config/database.yml +25 -0
- data/spec/dummy/config/environment.rb +5 -0
- data/spec/dummy/config/environments/development.rb +41 -0
- data/spec/dummy/config/environments/production.rb +79 -0
- data/spec/dummy/config/environments/test.rb +42 -0
- data/spec/dummy/config/initializers/assets.rb +11 -0
- data/spec/dummy/config/initializers/backtrace_silencers.rb +7 -0
- data/spec/dummy/config/initializers/cookies_serializer.rb +3 -0
- data/spec/dummy/config/initializers/filter_parameter_logging.rb +4 -0
- data/spec/dummy/config/initializers/inflections.rb +16 -0
- data/spec/dummy/config/initializers/mime_types.rb +4 -0
- data/spec/dummy/config/initializers/session_store.rb +3 -0
- data/spec/dummy/config/initializers/wrap_parameters.rb +14 -0
- data/spec/dummy/config/locales/en.yml +23 -0
- data/spec/dummy/config/routes.rb +10 -0
- data/spec/dummy/config/secrets.yml +22 -0
- data/spec/dummy/config.ru +4 -0
- data/spec/dummy/db/migrate/20150706144746_create_users.rb +11 -0
- data/spec/dummy/db/migrate/20150717123339_add_password_reset_token_to_users.rb +5 -0
- data/spec/dummy/db/schema.rb +25 -0
- data/spec/dummy/public/404.html +67 -0
- data/spec/dummy/public/422.html +67 -0
- data/spec/dummy/public/500.html +66 -0
- data/spec/dummy/public/favicon.ico +0 -0
- data/spec/dummy/spec/controllers/password_resets_controller_spec.rb +53 -0
- data/spec/dummy/spec/controllers/sessions_controller_spec.rb +36 -0
- data/spec/dummy/spec/controllers/users_controller_spec.rb +20 -0
- data/spec/dummy/spec/factories.rb +9 -0
- data/spec/dummy/spec/integration/logging_spec.rb +18 -0
- data/spec/dummy/spec/integration/reset_password_spec.rb +39 -0
- data/spec/dummy/spec/modules/authentication_spec.rb +157 -0
- data/spec/dummy/spec/modules/password_reset_spec.rb +206 -0
- data/spec/dummy/spec/modules/tokenizer_spec.rb +19 -0
- data/spec/dummy/spec/rails_helper.rb +23 -0
- data/spec/dummy/spec/spec_helper.rb +15 -0
- data/spec/dummy/spec/support/common_methods.rb +64 -0
- metadata +170 -0
@@ -0,0 +1,39 @@
|
|
1
|
+
# require_relative '../spec_helper.rb'
|
2
|
+
|
3
|
+
# describe "Resetting password" do
|
4
|
+
# let!(:user) { FactoryGirl.create(:user) }
|
5
|
+
|
6
|
+
# it 'allows user to send reset password link' do
|
7
|
+
# visit new_password_resets_path
|
8
|
+
# expect(page).to have_content('Reset Password Page')
|
9
|
+
# fill_in 'email', with: user.email
|
10
|
+
# click_button 'Reset password'
|
11
|
+
# expect(page).to have_content('Login Page')
|
12
|
+
# end
|
13
|
+
|
14
|
+
# it 'redirects to login path after password update' do
|
15
|
+
# user.update_attribute(:password_reset_token, JumpIn::Tokenizer.generate_token)
|
16
|
+
# visit edit_password_resets_path(token: user.password_reset_token)
|
17
|
+
# expect(page).to have_content("Edit for PasswordReset")
|
18
|
+
# fill_in "password", with: 'new_password'
|
19
|
+
# fill_in "password_confirmation", with: 'new_password'
|
20
|
+
# click_button "Set new password"
|
21
|
+
# expect(page).to have_content("Login Page")
|
22
|
+
# end
|
23
|
+
|
24
|
+
# it 'doest allow for password reset if token too old' do
|
25
|
+
# user.update_attribute(:password_reset_token, Base64.encode64("#{SecureRandom.hex(10)}.#{5.days.ago}"))
|
26
|
+
# visit edit_password_resets_path(token: user.password_reset_token)
|
27
|
+
# expect(page).to have_content("password-reset-token is too old")
|
28
|
+
# end
|
29
|
+
|
30
|
+
# it 'displays edit page when password does not match password_confirmation' do
|
31
|
+
# user.update_attribute(:password_reset_token, JumpIn::Tokenizer.generate_token)
|
32
|
+
# visit edit_password_resets_path(token: user.password_reset_token)
|
33
|
+
# expect(page).to have_content('Edit for PasswordReset')
|
34
|
+
# fill_in 'password', with: 'new_password'
|
35
|
+
# fill_in 'password_confirmation', with: 'another_password'
|
36
|
+
# click_button 'Set new password'
|
37
|
+
# expect(page).to have_content('Edit for PasswordReset')
|
38
|
+
# end
|
39
|
+
# end
|
@@ -0,0 +1,157 @@
|
|
1
|
+
require_relative '../spec_helper'
|
2
|
+
|
3
|
+
class AuthenticationController < ActionController::Base
|
4
|
+
include JumpIn::Authentication
|
5
|
+
end
|
6
|
+
|
7
|
+
describe AuthenticationController, type: :controller do
|
8
|
+
let(:user) { FactoryGirl.create(:user) }
|
9
|
+
|
10
|
+
context "#jump_in" do
|
11
|
+
it "returns false if user logged_in" do
|
12
|
+
allow_to_receive_logged_in_and_return(true)
|
13
|
+
expect(subject.jump_in(user: user, password: user.password)).to eq(false)
|
14
|
+
end
|
15
|
+
|
16
|
+
it "calls detect_strategy with proper params" do
|
17
|
+
allow_to_receive_logged_in_and_return(false)
|
18
|
+
expect(subject).to receive(:detected_strategy).with(user: user, params: { password: user.password }).
|
19
|
+
exactly(1).times.and_return(JumpIn::Authentication::ByPassword.new(user: user, params: { password: user.password }))
|
20
|
+
subject.jump_in(user: user, password: user.password)
|
21
|
+
end
|
22
|
+
|
23
|
+
it "returns false if user not logged_in and wrong login data provided" do
|
24
|
+
allow_to_receive_logged_in_and_return(false)
|
25
|
+
expect(subject.jump_in(user: user, password:'something')).to eq(false)
|
26
|
+
end
|
27
|
+
|
28
|
+
context 'when user not logged_in and authentication successful' do
|
29
|
+
it "returns true" do
|
30
|
+
allow_to_receive_logged_in_and_return(false)
|
31
|
+
expect(subject.jump_in(user: user, password: user.password)).to eq(true)
|
32
|
+
end
|
33
|
+
|
34
|
+
it "calls 'login' with permanent=false for permanent false by default" do
|
35
|
+
allow_to_receive_logged_in_and_return(false)
|
36
|
+
expect(subject).to receive(:login).with(user:user, permanent:false, expires:nil).exactly(1).times.and_return(true)
|
37
|
+
subject.jump_in(user: user, password: user.password)
|
38
|
+
end
|
39
|
+
|
40
|
+
it "calls 'login' with permanent=false for permanent passed as false" do
|
41
|
+
allow_to_receive_logged_in_and_return(false)
|
42
|
+
expect(subject).to receive(:login).with(user:user, permanent:false, expires:nil).exactly(1).times.and_return(true)
|
43
|
+
subject.jump_in(user: user, password: user.password, permanent: false)
|
44
|
+
end
|
45
|
+
|
46
|
+
it "calls 'login' with permanent=true for permanent passed as true" do
|
47
|
+
allow_to_receive_logged_in_and_return(false)
|
48
|
+
expect(subject).to receive(:login).with(user:user, permanent:true, expires:nil).exactly(1).times.and_return(true)
|
49
|
+
subject.jump_in(user: user, password: user.password, permanent: true)
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
context "#login" do
|
55
|
+
it "sets session when permanent not passed (default)" do
|
56
|
+
subject.login(user: user)
|
57
|
+
expect_only_session_set_for(user)
|
58
|
+
end
|
59
|
+
|
60
|
+
it "sets session when permanent passed as false" do
|
61
|
+
subject.login(user: user, permanent: false)
|
62
|
+
expect_only_session_set_for(user)
|
63
|
+
end
|
64
|
+
|
65
|
+
it "sets cookies when permanent passed as true" do
|
66
|
+
subject.login(user: user, permanent: true)
|
67
|
+
expect_only_cookies_set_for(user)
|
68
|
+
end
|
69
|
+
|
70
|
+
context 'sets proper value for cookies[:expires]' do
|
71
|
+
before(:each) do
|
72
|
+
@cookies = OpenStruct.new(permanent: nil, signed: nil, jump_in_class: {}, jump_in_id: {})
|
73
|
+
allow(subject).to receive(:cookies).and_return(@cookies)
|
74
|
+
allow(@cookies).to receive(:permanent).and_return(@cookies)
|
75
|
+
allow(@cookies).to receive(:signed).and_return(@cookies)
|
76
|
+
end
|
77
|
+
|
78
|
+
it "sets 20 years if param not passed" do
|
79
|
+
subject.login(user: user, permanent: true)
|
80
|
+
expect(@cookies.signed[:jump_in_class][:expires]).to be_between(Time.now + 19.years, Time.now + 21.years)
|
81
|
+
expect(@cookies.signed[:jump_in_id][:expires]).to be_between(Time.now + 19.years, Time.now + 21.years)
|
82
|
+
end
|
83
|
+
|
84
|
+
it "sets correct value if param passed" do
|
85
|
+
subject.login(user: user, permanent: true, expires: 2.hours)
|
86
|
+
expect(@cookies.signed[:jump_in_class][:expires]).to eq(@cookies.signed[:jump_in_id][:expires])
|
87
|
+
expect(@cookies.signed[:jump_in_class][:expires]).to be_between(Time.now + 1.hours, Time.now + 3.hours)
|
88
|
+
expect(@cookies.signed[:jump_in_id][:expires]).to be_between(Time.now + 1.hours, Time.now + 3.hours)
|
89
|
+
end
|
90
|
+
end
|
91
|
+
end
|
92
|
+
|
93
|
+
context "#jump_out" do
|
94
|
+
it "clears session when session set" do
|
95
|
+
set_session(user)
|
96
|
+
expect_session_eq(klass: user.class.to_s, id: user.id)
|
97
|
+
subject.jump_out
|
98
|
+
expect_session_eq(klass: nil, id: nil)
|
99
|
+
end
|
100
|
+
|
101
|
+
it "clears cookies when cookies set" do
|
102
|
+
set_cookies(user, nil)
|
103
|
+
expect_cookies_eq(klass: user.class.to_s, id: user.id)
|
104
|
+
subject.jump_out
|
105
|
+
expect_cookies_eq(klass: nil, id: nil)
|
106
|
+
end
|
107
|
+
|
108
|
+
it "returns true if logged out from session" do
|
109
|
+
set_session(user)
|
110
|
+
expect(subject.jump_out).to eq(true)
|
111
|
+
end
|
112
|
+
|
113
|
+
it "returns true if logged out from cookies" do
|
114
|
+
set_cookies(user, nil)
|
115
|
+
expect(subject.jump_out).to eq(true)
|
116
|
+
end
|
117
|
+
|
118
|
+
it "returns true if logged out from empty session & cookies" do
|
119
|
+
expect(subject.jump_out).to eq(true)
|
120
|
+
end
|
121
|
+
end
|
122
|
+
|
123
|
+
context "#current_user" do
|
124
|
+
it "returns user based on session" do
|
125
|
+
set_session(user)
|
126
|
+
expect(subject.current_user).to eq(user)
|
127
|
+
end
|
128
|
+
|
129
|
+
it "returns user based on cookies" do
|
130
|
+
set_cookies(user, nil)
|
131
|
+
expect(subject.current_user).to eq(user)
|
132
|
+
end
|
133
|
+
|
134
|
+
it "returns nil when session and cookie empty" do
|
135
|
+
expect(subject.current_user).to eq(nil)
|
136
|
+
end
|
137
|
+
end
|
138
|
+
|
139
|
+
context "#logged_in?" do
|
140
|
+
it "returns true if current user is set in session" do
|
141
|
+
set_session(user)
|
142
|
+
expect(subject.logged_in?).to eq(true)
|
143
|
+
end
|
144
|
+
|
145
|
+
it "returns true if current user is set in cookies" do
|
146
|
+
set_cookies(user, nil)
|
147
|
+
expect(subject.logged_in?).to eq(true)
|
148
|
+
end
|
149
|
+
end
|
150
|
+
|
151
|
+
context "#helper_methods" do
|
152
|
+
it "includes current_user and logged_in?" do
|
153
|
+
expect(subject._helper_methods.include? :logged_in?).to eq(true)
|
154
|
+
expect(subject._helper_methods.include? :current_user).to eq(true)
|
155
|
+
end
|
156
|
+
end
|
157
|
+
end
|
@@ -0,0 +1,206 @@
|
|
1
|
+
require_relative '../spec_helper'
|
2
|
+
include ActiveSupport::Testing::TimeHelpers
|
3
|
+
|
4
|
+
class PasswordResetController < ActionController::Base
|
5
|
+
include JumpIn::PasswordReset
|
6
|
+
end
|
7
|
+
|
8
|
+
describe PasswordResetController, type: :controller do
|
9
|
+
let(:user) { FactoryGirl.create(:user) }
|
10
|
+
|
11
|
+
context "#set_password_reset_for" do
|
12
|
+
context "token not uniq_or_empty" do
|
13
|
+
it "calls token_uniq_or_empty? with proper params" do
|
14
|
+
token = 'token'
|
15
|
+
expect(subject).to receive_token_uniq_or_empty_and_return(user, token, false)
|
16
|
+
subject.set_password_reset_for(user:user, token:token)
|
17
|
+
end
|
18
|
+
|
19
|
+
it "returns false if token not uniq_or_empty" do
|
20
|
+
token = 'token'
|
21
|
+
allow(subject).to receive_token_uniq_or_empty_and_return(user, token, false)
|
22
|
+
expect(subject.set_password_reset_for(user:user, token:token)).to eq(false)
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
context "token uniq_or_empty" do
|
27
|
+
it "calls set_token with given user & token if token uniq_or_empty" do
|
28
|
+
token = 'token'
|
29
|
+
expect(subject).to receive_token_uniq_or_empty_and_return(user, token, true)
|
30
|
+
expect_set_token_and_return(user, token, true)
|
31
|
+
subject.set_password_reset_for(user:user, token:token)
|
32
|
+
end
|
33
|
+
|
34
|
+
it "calls set_token with given user & token=nil if token uniq_or_empty & no token given" do
|
35
|
+
token = nil
|
36
|
+
expect(subject).to receive_token_uniq_or_empty_and_return(user, token, true)
|
37
|
+
expect_set_token_and_return(user, token, true)
|
38
|
+
subject.set_password_reset_for(user:user)
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
context "#set_token" do
|
44
|
+
it "set's given token as user.token" do
|
45
|
+
token = 'token'
|
46
|
+
subject.set_token(user:user, token:token)
|
47
|
+
expect(user.password_reset_token).to eq(token)
|
48
|
+
end
|
49
|
+
|
50
|
+
it "generates token for user if token=nil given" do
|
51
|
+
expect(user.password_reset_token).to eq(nil)
|
52
|
+
subject.set_token(user:user, token:nil)
|
53
|
+
expect(user.password_reset_token).to_not eq(nil)
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
context "#generate_unique_token_for" do
|
58
|
+
it 'generates token' do
|
59
|
+
token = subject.generate_unique_token_for(user:user)
|
60
|
+
expect(token).to_not eq(nil)
|
61
|
+
end
|
62
|
+
|
63
|
+
it 'calls methods #generate_token & #token_uniq?' do
|
64
|
+
token = 'token'
|
65
|
+
expect(subject).to receive(:generate_token).and_return(token)
|
66
|
+
expect(subject).to receive(:token_uniq?).with(user:user, token:token).and_return(true)
|
67
|
+
subject.generate_unique_token_for(user:user)
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
context "#generate_token" do
|
72
|
+
it 'generates token' do
|
73
|
+
token = subject.generate_token
|
74
|
+
expect(token).to_not eq(nil)
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
78
|
+
context "#token_uniq_or_empty?" do
|
79
|
+
it 'returns true if token is nil' do
|
80
|
+
expect(subject.token_uniq_or_empty?(user:user, token:nil)).to eq(true)
|
81
|
+
end
|
82
|
+
|
83
|
+
it 'returns true if token given & unique' do
|
84
|
+
token = 'token'
|
85
|
+
allow(subject).to receive(:token_uniq?).with(user:user, token:token).and_return(true)
|
86
|
+
expect(subject.token_uniq_or_empty?(user:user, token:token)).to eq(true)
|
87
|
+
end
|
88
|
+
|
89
|
+
it 'returns false if token give & not unique' do
|
90
|
+
token = 'token'
|
91
|
+
allow(subject).to receive(:token_uniq?).with(user:user, token:token).and_return(false)
|
92
|
+
expect(subject.token_uniq_or_empty?(user:user, token:token)).to eq(false)
|
93
|
+
end
|
94
|
+
end
|
95
|
+
|
96
|
+
context "#token_uniq?" do
|
97
|
+
it 'returns true if token unique for user.class' do
|
98
|
+
token = subject.generate_token
|
99
|
+
expect(subject.token_uniq?(user:user, token:token)).to eq(true)
|
100
|
+
end
|
101
|
+
|
102
|
+
it 'returns false if token not unique for user.class' do
|
103
|
+
token = subject.generate_token
|
104
|
+
user.update_attribute('password_reset_token', token)
|
105
|
+
expect(subject.token_uniq?(user:user, token:token)).to eq(false)
|
106
|
+
end
|
107
|
+
end
|
108
|
+
|
109
|
+
context "#password_reset_valid?" do
|
110
|
+
it "returns true for token valid with default expiration time(2.hours)" do
|
111
|
+
token = JumpIn::Tokenizer.generate_token
|
112
|
+
expect(subject.password_reset_valid?(password_reset_token: token)).to eq(true)
|
113
|
+
end
|
114
|
+
|
115
|
+
it "returns false for token too old with default expiration time(2.hours)" do
|
116
|
+
token = ''
|
117
|
+
travel_to(3.hours.ago) do
|
118
|
+
token = JumpIn::Tokenizer.generate_token
|
119
|
+
end
|
120
|
+
expect(subject.password_reset_valid?(password_reset_token: token)).to eq(false)
|
121
|
+
end
|
122
|
+
|
123
|
+
it "returns true for token valid with custom expiration time(2.days)" do
|
124
|
+
token = ''
|
125
|
+
travel_to(1.day.ago) do
|
126
|
+
token = JumpIn::Tokenizer.generate_token
|
127
|
+
end
|
128
|
+
expect(subject.password_reset_valid?(password_reset_token: token, expiration_time: 2.days)).to eq(true)
|
129
|
+
end
|
130
|
+
|
131
|
+
it "returns false for token too old with custom expiration time(2.days)" do
|
132
|
+
token = ''
|
133
|
+
travel_to(3.days.ago) do
|
134
|
+
token = JumpIn::Tokenizer.generate_token
|
135
|
+
end
|
136
|
+
expect(subject.password_reset_valid?(password_reset_token: token, expiration_time: 2.days)).to eq(false)
|
137
|
+
end
|
138
|
+
|
139
|
+
end
|
140
|
+
|
141
|
+
context "#update_password_for" do
|
142
|
+
let(:new_password) { 'new_secret_password'}
|
143
|
+
let!(:old_password_digest) { user.password_digest }
|
144
|
+
|
145
|
+
it "updates password if token belongs to user and is not too old" do
|
146
|
+
user.update_attribute(:password_reset_token, JumpIn::Tokenizer.generate_token)
|
147
|
+
token = user.password_reset_token
|
148
|
+
allow_to_receive_token_correct_and_return(user, token, true)
|
149
|
+
|
150
|
+
expect(
|
151
|
+
subject.update_password_for(user: user, password: new_password, password_confirmation: new_password, password_reset_token: token)
|
152
|
+
).to eq(true)
|
153
|
+
expect(user.password_digest).to_not eq(old_password_digest)
|
154
|
+
end
|
155
|
+
|
156
|
+
it "updates password if token belongs to user and is old" do
|
157
|
+
travel_to(3.days.ago) do
|
158
|
+
user.update_attribute(:password_reset_token, JumpIn::Tokenizer.generate_token)
|
159
|
+
end
|
160
|
+
token = user.password_reset_token
|
161
|
+
allow_to_receive_token_correct_and_return(user, token, true)
|
162
|
+
|
163
|
+
expect(
|
164
|
+
subject.update_password_for(user: user, password: new_password, password_confirmation: new_password, password_reset_token: token)
|
165
|
+
).to eq(true)
|
166
|
+
expect(user.password_digest).to_not eq(old_password_digest)
|
167
|
+
end
|
168
|
+
|
169
|
+
it "does not update password and returns false if token does not belong to user" do
|
170
|
+
user.update_attribute(:password_reset_token, JumpIn::Tokenizer.generate_token)
|
171
|
+
token = JumpIn::Tokenizer.generate_token
|
172
|
+
allow_to_receive_token_correct_and_return(user, token, false)
|
173
|
+
|
174
|
+
expect(
|
175
|
+
subject.update_password_for(user: user, password: new_password, password_confirmation: new_password, password_reset_token: token)
|
176
|
+
).to eq(false)
|
177
|
+
expect(user.password_digest).to eq(old_password_digest)
|
178
|
+
end
|
179
|
+
|
180
|
+
it "does not update password and returns false if new password invalid" do
|
181
|
+
user.update_attribute(:password_reset_token, JumpIn::Tokenizer.generate_token)
|
182
|
+
token = user.password_reset_token
|
183
|
+
allow_to_receive_token_correct_and_return(user, token, true)
|
184
|
+
|
185
|
+
expect(
|
186
|
+
subject.update_password_for(user: user, password: new_password, password_confirmation: 'password', password_reset_token: token)
|
187
|
+
).to eq(false)
|
188
|
+
user.reload
|
189
|
+
expect(user.password_digest).to eq(old_password_digest)
|
190
|
+
end
|
191
|
+
end
|
192
|
+
|
193
|
+
context "#token_correct?" do
|
194
|
+
it "returns true if given token eq user.token" do
|
195
|
+
user.update_attribute(:password_reset_token, JumpIn::Tokenizer.generate_token)
|
196
|
+
token = user.password_reset_token
|
197
|
+
expect(subject.token_correct?(user_token:user.password_reset_token, received_token:token)).to eq(true)
|
198
|
+
end
|
199
|
+
|
200
|
+
it "returns false if given token doesn't eq user.token" do
|
201
|
+
user.update_attribute(:password_reset_token, JumpIn::Tokenizer.generate_token)
|
202
|
+
token = JumpIn::Tokenizer.generate_token
|
203
|
+
expect(subject.token_correct?(user_token:user.password_reset_token, received_token:token)).to eq(false)
|
204
|
+
end
|
205
|
+
end
|
206
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
require_relative '../spec_helper'
|
2
|
+
|
3
|
+
describe JumpIn::Tokenizer do
|
4
|
+
|
5
|
+
context ".generate_token" do
|
6
|
+
it 'generates token' do
|
7
|
+
token = JumpIn::Tokenizer.generate_token
|
8
|
+
expect(token).to_not eq(nil)
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
context ".decode_time" do
|
13
|
+
it "decodes time correctly" do
|
14
|
+
time = Time.now.xmlschema
|
15
|
+
token = Base64.encode64 [SecureRandom.hex(12), time].join(JumpIn::Tokenizer::DELIMITER)
|
16
|
+
expect(JumpIn::Tokenizer.decode_time(token)).to eq(time)
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
ENV['RAILS_ENV'] ||= 'test'
|
2
|
+
require File.expand_path('../../config/environment', __FILE__)
|
3
|
+
# Prevent database truncation if the environment is production
|
4
|
+
abort("The Rails environment is running in production mode!") if Rails.env.production?
|
5
|
+
require 'rspec/rails'
|
6
|
+
require 'factory_girl_rails'
|
7
|
+
require 'capybara/rails'
|
8
|
+
require 'capybara/rspec'
|
9
|
+
ENGINE_RAILS_ROOT=File.join(File.dirname(__FILE__), '../')
|
10
|
+
#
|
11
|
+
# Dir[Rails.root.join('spec/support/**/*.rb')].each { |f| require f }
|
12
|
+
|
13
|
+
ActiveRecord::Migration.maintain_test_schema!
|
14
|
+
|
15
|
+
RSpec.configure do |config|
|
16
|
+
# Remove this line if you're not using ActiveRecord or ActiveRecord fixtures
|
17
|
+
config.fixture_path = "#{::Rails.root}/spec/fixtures"
|
18
|
+
config.include FactoryGirl::Syntax::Methods
|
19
|
+
|
20
|
+
config.use_transactional_fixtures = true
|
21
|
+
|
22
|
+
config.infer_spec_type_from_file_location!
|
23
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
require_relative 'rails_helper.rb'
|
2
|
+
require_relative 'support/common_methods.rb'
|
3
|
+
|
4
|
+
RSpec.configure do |config|
|
5
|
+
config.include Capybara::DSL
|
6
|
+
|
7
|
+
config.expect_with :rspec do |expectations|
|
8
|
+
expectations.include_chain_clauses_in_custom_matcher_descriptions = true
|
9
|
+
end
|
10
|
+
|
11
|
+
config.mock_with :rspec do |mocks|
|
12
|
+
mocks.verify_partial_doubles = true
|
13
|
+
end
|
14
|
+
|
15
|
+
end
|
@@ -0,0 +1,64 @@
|
|
1
|
+
# module Authentication
|
2
|
+
|
3
|
+
def set_session(object)
|
4
|
+
session[:jump_in_class] = object.class.to_s
|
5
|
+
session[:jump_in_id] = object.id
|
6
|
+
end
|
7
|
+
|
8
|
+
def set_cookies(object, expires)
|
9
|
+
cookies.permanent.signed[:jump_in_class] = { :value => object.class.to_s, :expires => expires }
|
10
|
+
cookies.permanent.signed[:jump_in_id] = { :value => object.id, :expires => expires }
|
11
|
+
end
|
12
|
+
|
13
|
+
def expect_session_eq(klass:, id:)
|
14
|
+
expect(session[:jump_in_class]).to eq(klass)
|
15
|
+
expect(session[:jump_in_id]).to eq(id)
|
16
|
+
end
|
17
|
+
|
18
|
+
def expect_cookies_eq(klass:, id:)
|
19
|
+
expect(cookies.signed[:jump_in_class]).to eq(klass)
|
20
|
+
expect(cookies.signed[:jump_in_id]).to eq(id)
|
21
|
+
end
|
22
|
+
|
23
|
+
def expect_only_session_set_for(user)
|
24
|
+
expect_session_eq(klass: user.class.to_s, id: user.id)
|
25
|
+
expect_cookies_eq(klass: nil, id: nil)
|
26
|
+
end
|
27
|
+
|
28
|
+
def expect_only_cookies_set_for(user)
|
29
|
+
expect_cookies_eq(klass: user.class.to_s, id: user.id)
|
30
|
+
expect_session_eq(klass: nil, id: nil)
|
31
|
+
end
|
32
|
+
|
33
|
+
def allow_to_receive_logged_in_and_return(boolean)
|
34
|
+
allow(subject).to receive(:logged_in?).and_return(boolean)
|
35
|
+
end
|
36
|
+
|
37
|
+
# module PasswordReset
|
38
|
+
|
39
|
+
def receive_token_uniq_or_empty_and_return(user, token, boolean)
|
40
|
+
receive(:token_uniq_or_empty?).
|
41
|
+
with(user: user, token: token).exactly(1).times.
|
42
|
+
and_return(boolean)
|
43
|
+
end
|
44
|
+
|
45
|
+
def expect_set_token_and_return(user, token, boolean)
|
46
|
+
expect(subject).to receive(:set_token).
|
47
|
+
with(user: user, token: token).exactly(1).times.
|
48
|
+
and_return(true)
|
49
|
+
end
|
50
|
+
|
51
|
+
def allow_to_receive_token_correct_and_return(user, token, boolean)
|
52
|
+
allow(subject).to receive(:token_correct?).
|
53
|
+
with(user_token: user.password_reset_token, received_token: token).
|
54
|
+
and_return(boolean)
|
55
|
+
end
|
56
|
+
|
57
|
+
# dummy App
|
58
|
+
|
59
|
+
def log_in(email, password)
|
60
|
+
fill_in "session_email", with: email
|
61
|
+
fill_in "session_password", with: password
|
62
|
+
click_button "Log in"
|
63
|
+
end
|
64
|
+
|