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.
Files changed (69) hide show
  1. checksums.yaml +7 -0
  2. data/MIT-LICENSE +20 -0
  3. data/README.rdoc +0 -0
  4. data/Rakefile +23 -0
  5. data/lib/jump_in/authentication/by_password.rb +13 -0
  6. data/lib/jump_in/authentication/strategy.rb +16 -0
  7. data/lib/jump_in/authentication.rb +97 -0
  8. data/lib/jump_in/password_reset.rb +54 -0
  9. data/lib/jump_in/tokenizer.rb +21 -0
  10. data/lib/jump_in/version.rb +3 -0
  11. data/lib/jump_in.rb +8 -0
  12. data/lib/tasks/jump_in_tasks.rake +4 -0
  13. data/spec/dummy/README.rdoc +28 -0
  14. data/spec/dummy/Rakefile +6 -0
  15. data/spec/dummy/app/controllers/application_controller.rb +8 -0
  16. data/spec/dummy/app/controllers/password_resets_controller.rb +34 -0
  17. data/spec/dummy/app/controllers/sessions_controller.rb +16 -0
  18. data/spec/dummy/app/controllers/users_controller.rb +32 -0
  19. data/spec/dummy/app/mailers/system_mailer.rb +8 -0
  20. data/spec/dummy/app/models/user.rb +3 -0
  21. data/spec/dummy/app/views/layouts/application.html.erb +18 -0
  22. data/spec/dummy/app/views/password_resets/edit.html.erb +9 -0
  23. data/spec/dummy/app/views/password_resets/new.html.erb +7 -0
  24. data/spec/dummy/app/views/sessions/new.html.erb +7 -0
  25. data/spec/dummy/app/views/system_mailer/password_reset.html.erb +2 -0
  26. data/spec/dummy/app/views/users/show.html.erb +1 -0
  27. data/spec/dummy/bin/bundle +3 -0
  28. data/spec/dummy/bin/rails +4 -0
  29. data/spec/dummy/bin/rake +4 -0
  30. data/spec/dummy/bin/setup +29 -0
  31. data/spec/dummy/config/application.rb +32 -0
  32. data/spec/dummy/config/boot.rb +5 -0
  33. data/spec/dummy/config/database.yml +25 -0
  34. data/spec/dummy/config/environment.rb +5 -0
  35. data/spec/dummy/config/environments/development.rb +41 -0
  36. data/spec/dummy/config/environments/production.rb +79 -0
  37. data/spec/dummy/config/environments/test.rb +42 -0
  38. data/spec/dummy/config/initializers/assets.rb +11 -0
  39. data/spec/dummy/config/initializers/backtrace_silencers.rb +7 -0
  40. data/spec/dummy/config/initializers/cookies_serializer.rb +3 -0
  41. data/spec/dummy/config/initializers/filter_parameter_logging.rb +4 -0
  42. data/spec/dummy/config/initializers/inflections.rb +16 -0
  43. data/spec/dummy/config/initializers/mime_types.rb +4 -0
  44. data/spec/dummy/config/initializers/session_store.rb +3 -0
  45. data/spec/dummy/config/initializers/wrap_parameters.rb +14 -0
  46. data/spec/dummy/config/locales/en.yml +23 -0
  47. data/spec/dummy/config/routes.rb +10 -0
  48. data/spec/dummy/config/secrets.yml +22 -0
  49. data/spec/dummy/config.ru +4 -0
  50. data/spec/dummy/db/migrate/20150706144746_create_users.rb +11 -0
  51. data/spec/dummy/db/migrate/20150717123339_add_password_reset_token_to_users.rb +5 -0
  52. data/spec/dummy/db/schema.rb +25 -0
  53. data/spec/dummy/public/404.html +67 -0
  54. data/spec/dummy/public/422.html +67 -0
  55. data/spec/dummy/public/500.html +66 -0
  56. data/spec/dummy/public/favicon.ico +0 -0
  57. data/spec/dummy/spec/controllers/password_resets_controller_spec.rb +53 -0
  58. data/spec/dummy/spec/controllers/sessions_controller_spec.rb +36 -0
  59. data/spec/dummy/spec/controllers/users_controller_spec.rb +20 -0
  60. data/spec/dummy/spec/factories.rb +9 -0
  61. data/spec/dummy/spec/integration/logging_spec.rb +18 -0
  62. data/spec/dummy/spec/integration/reset_password_spec.rb +39 -0
  63. data/spec/dummy/spec/modules/authentication_spec.rb +157 -0
  64. data/spec/dummy/spec/modules/password_reset_spec.rb +206 -0
  65. data/spec/dummy/spec/modules/tokenizer_spec.rb +19 -0
  66. data/spec/dummy/spec/rails_helper.rb +23 -0
  67. data/spec/dummy/spec/spec_helper.rb +15 -0
  68. data/spec/dummy/spec/support/common_methods.rb +64 -0
  69. 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
+