sorcery 0.8.6 → 0.9.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 (126) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +2 -1
  3. data/.travis.yml +75 -14
  4. data/CHANGELOG.md +32 -1
  5. data/Gemfile +1 -0
  6. data/README.md +138 -86
  7. data/gemfiles/active_record-rails40.gemfile +7 -0
  8. data/gemfiles/active_record-rails41.gemfile +3 -2
  9. data/gemfiles/mongo_mapper-rails40.gemfile +9 -0
  10. data/gemfiles/mongo_mapper-rails41.gemfile +2 -1
  11. data/gemfiles/mongoid-rails40.gemfile +9 -0
  12. data/gemfiles/mongoid-rails41.gemfile +3 -5
  13. data/gemfiles/mongoid3-rails32.gemfile +9 -0
  14. data/lib/generators/sorcery/USAGE +1 -1
  15. data/lib/generators/sorcery/install_generator.rb +19 -5
  16. data/lib/generators/sorcery/templates/initializer.rb +36 -10
  17. data/lib/generators/sorcery/templates/migration/brute_force_protection.rb +3 -1
  18. data/lib/generators/sorcery/templates/migration/core.rb +2 -2
  19. data/lib/generators/sorcery/templates/migration/external.rb +3 -1
  20. data/lib/sorcery/adapters/active_record_adapter.rb +120 -0
  21. data/lib/sorcery/adapters/base_adapter.rb +30 -0
  22. data/lib/sorcery/adapters/data_mapper_adapter.rb +176 -0
  23. data/lib/sorcery/adapters/mongo_mapper_adapter.rb +110 -0
  24. data/lib/sorcery/adapters/mongoid_adapter.rb +97 -0
  25. data/lib/sorcery/controller/config.rb +65 -0
  26. data/lib/sorcery/controller/submodules/activity_logging.rb +16 -21
  27. data/lib/sorcery/controller/submodules/brute_force_protection.rb +6 -6
  28. data/lib/sorcery/controller/submodules/external.rb +9 -29
  29. data/lib/sorcery/controller/submodules/remember_me.rb +4 -4
  30. data/lib/sorcery/controller/submodules/session_timeout.rb +10 -6
  31. data/lib/sorcery/controller.rb +5 -64
  32. data/lib/sorcery/model/config.rb +96 -0
  33. data/lib/sorcery/model/submodules/activity_logging.rb +29 -36
  34. data/lib/sorcery/model/submodules/brute_force_protection.rb +21 -37
  35. data/lib/sorcery/model/submodules/external.rb +53 -9
  36. data/lib/sorcery/model/submodules/remember_me.rb +12 -31
  37. data/lib/sorcery/model/submodules/reset_password.rb +21 -39
  38. data/lib/sorcery/model/submodules/user_activation.rb +21 -63
  39. data/lib/sorcery/model/temporary_token.rb +4 -4
  40. data/lib/sorcery/model.rb +47 -175
  41. data/lib/sorcery/providers/base.rb +11 -0
  42. data/lib/sorcery/providers/facebook.rb +16 -5
  43. data/lib/sorcery/providers/github.rb +11 -2
  44. data/lib/sorcery/providers/google.rb +1 -1
  45. data/lib/sorcery/providers/heroku.rb +57 -0
  46. data/lib/sorcery/providers/jira.rb +77 -0
  47. data/lib/sorcery/providers/linkedin.rb +1 -1
  48. data/lib/sorcery/providers/liveid.rb +1 -1
  49. data/lib/sorcery/providers/salesforce.rb +50 -0
  50. data/lib/sorcery/providers/twitter.rb +1 -1
  51. data/lib/sorcery/providers/vk.rb +6 -4
  52. data/lib/sorcery/providers/xing.rb +2 -2
  53. data/lib/sorcery/test_helpers/internal.rb +7 -3
  54. data/lib/sorcery/test_helpers/rails/controller.rb +5 -1
  55. data/lib/sorcery/version.rb +3 -0
  56. data/lib/sorcery.rb +75 -43
  57. data/sorcery.gemspec +6 -2
  58. data/spec/active_record/user_activity_logging_spec.rb +9 -0
  59. data/spec/controllers/controller_activity_logging_spec.rb +124 -0
  60. data/spec/controllers/controller_brute_force_protection_spec.rb +43 -0
  61. data/spec/{active_record → controllers}/controller_http_basic_auth_spec.rb +14 -11
  62. data/spec/{active_record → controllers}/controller_oauth2_spec.rb +151 -64
  63. data/spec/{active_record → controllers}/controller_oauth_spec.rb +94 -70
  64. data/spec/{active_record → controllers}/controller_remember_me_spec.rb +32 -12
  65. data/spec/{active_record → controllers}/controller_session_timeout_spec.rb +15 -5
  66. data/spec/{shared_examples/controller_shared_examples.rb → controllers/controller_spec.rb} +34 -19
  67. data/spec/{datamapper → data_mapper}/user_activation_spec.rb +1 -1
  68. data/spec/data_mapper/user_activity_logging_spec.rb +14 -0
  69. data/spec/{datamapper → data_mapper}/user_brute_force_protection_spec.rb +1 -1
  70. data/spec/{datamapper → data_mapper}/user_oauth_spec.rb +1 -1
  71. data/spec/{datamapper → data_mapper}/user_remember_me_spec.rb +1 -1
  72. data/spec/{datamapper → data_mapper}/user_reset_password_spec.rb +1 -1
  73. data/spec/{datamapper → data_mapper}/user_spec.rb +1 -1
  74. data/spec/mongoid/user_spec.rb +13 -0
  75. data/spec/orm/active_record.rb +12 -0
  76. data/spec/orm/{datamapper.rb → data_mapper.rb} +16 -2
  77. data/spec/orm/mongo_mapper.rb +0 -1
  78. data/spec/orm/mongoid.rb +4 -0
  79. data/spec/rails_app/app/controllers/sorcery_controller.rb +62 -1
  80. data/spec/rails_app/app/mongo_mapper/user.rb +2 -0
  81. data/spec/rails_app/config/routes.rb +9 -0
  82. data/spec/rails_app/db/migrate/core/20101224223620_create_users.rb +2 -2
  83. data/spec/shared_examples/user_activation_shared_examples.rb +7 -7
  84. data/spec/shared_examples/user_activity_logging_shared_examples.rb +73 -5
  85. data/spec/shared_examples/user_brute_force_protection_shared_examples.rb +127 -9
  86. data/spec/shared_examples/user_oauth_shared_examples.rb +3 -6
  87. data/spec/shared_examples/user_remember_me_shared_examples.rb +6 -3
  88. data/spec/shared_examples/user_reset_password_shared_examples.rb +10 -10
  89. data/spec/shared_examples/user_shared_examples.rb +146 -46
  90. data/spec/spec_helper.rb +7 -22
  91. metadata +36 -57
  92. data/Gemfile.rails4 +0 -22
  93. data/VERSION +0 -1
  94. data/lib/sorcery/model/adapters/active_record.rb +0 -54
  95. data/lib/sorcery/model/adapters/datamapper.rb +0 -123
  96. data/lib/sorcery/model/adapters/mongo_mapper.rb +0 -60
  97. data/lib/sorcery/model/adapters/mongoid.rb +0 -88
  98. data/lib/sorcery/test_helpers/rails.rb +0 -7
  99. data/spec/active_record/controller_activity_logging_spec.rb +0 -29
  100. data/spec/active_record/controller_brute_force_protection_spec.rb +0 -158
  101. data/spec/active_record/controller_spec.rb +0 -8
  102. data/spec/active_record/integration_spec.rb +0 -23
  103. data/spec/datamapper/controller_activity_logging_spec.rb +0 -17
  104. data/spec/datamapper/controller_spec.rb +0 -8
  105. data/spec/datamapper/user_activity_logging_spec.rb +0 -9
  106. data/spec/mongo_mapper/controller_spec.rb +0 -8
  107. data/spec/mongoid/controller_activity_logging_spec.rb +0 -16
  108. data/spec/mongoid/controller_spec.rb +0 -8
  109. data/spec/rails_app/public/404.html +0 -26
  110. data/spec/rails_app/public/422.html +0 -26
  111. data/spec/rails_app/public/500.html +0 -26
  112. data/spec/rails_app/public/favicon.ico +0 -0
  113. data/spec/rails_app/public/images/rails.png +0 -0
  114. data/spec/rails_app/public/javascripts/application.js +0 -2
  115. data/spec/rails_app/public/javascripts/controls.js +0 -965
  116. data/spec/rails_app/public/javascripts/dragdrop.js +0 -974
  117. data/spec/rails_app/public/javascripts/effects.js +0 -1123
  118. data/spec/rails_app/public/javascripts/prototype.js +0 -6001
  119. data/spec/rails_app/public/javascripts/rails.js +0 -175
  120. data/spec/rails_app/public/robots.txt +0 -5
  121. data/spec/rails_app/public/stylesheets/.gitkeep +0 -0
  122. data/spec/shared_examples/controller_activity_logging_shared_examples.rb +0 -125
  123. data/spec/shared_examples/controller_oauth2_shared_examples.rb +0 -52
  124. data/spec/shared_examples/controller_oauth_shared_examples.rb +0 -62
  125. /data/spec/rails_app/app/{datamapper → data_mapper}/authentication.rb +0 -0
  126. /data/spec/rails_app/app/{datamapper → data_mapper}/user.rb +0 -0
@@ -1,32 +1,79 @@
1
1
  require 'spec_helper'
2
2
 
3
- require 'shared_examples/controller_oauth2_shared_examples'
3
+ # require 'shared_examples/controller_oauth2_shared_examples'
4
4
 
5
5
  describe SorceryController, :active_record => true do
6
6
  before(:all) do
7
- ActiveRecord::Migrator.migrate("#{Rails.root}/db/migrate/external")
8
- User.reset_column_information
7
+ if SORCERY_ORM == :active_record
8
+ ActiveRecord::Migrator.migrate("#{Rails.root}/db/migrate/external")
9
+ User.reset_column_information
10
+ end
9
11
 
10
12
  sorcery_reload!([:external])
11
13
  set_external_property
12
14
  end
13
15
 
14
16
  after(:all) do
15
- ActiveRecord::Migrator.rollback("#{Rails.root}/db/migrate/external")
17
+ if SORCERY_ORM == :active_record
18
+ ActiveRecord::Migrator.rollback("#{Rails.root}/db/migrate/external")
19
+ end
16
20
  end
17
21
 
18
- it_behaves_like "oauth2_controller"
22
+ describe 'using create_from' do
23
+ before(:each) do
24
+ stub_all_oauth2_requests!
25
+ end
26
+
27
+ it 'creates a new user' do
28
+ sorcery_model_property_set(:authentications_class, Authentication)
29
+ sorcery_controller_external_property_set(:facebook, :user_info_mapping, { username: 'name' })
30
+
31
+ expect(User).to receive(:create_from_provider).with('facebook', '123', {username: 'Noam Ben Ari'})
32
+ get :test_create_from_provider, provider: 'facebook'
33
+ end
34
+
35
+ it 'supports nested attributes' do
36
+ sorcery_model_property_set(:authentications_class, Authentication)
37
+ sorcery_controller_external_property_set(:facebook, :user_info_mapping, { username: 'hometown/name' })
38
+ expect(User).to receive(:create_from_provider).with('facebook', '123', {username: 'Haifa, Israel'})
39
+
40
+ get :test_create_from_provider, provider: 'facebook'
41
+ end
42
+
43
+ it 'does not crash on missing nested attributes' do
44
+ sorcery_model_property_set(:authentications_class, Authentication)
45
+ sorcery_controller_external_property_set(:facebook, :user_info_mapping, { username: 'name', created_at: 'does/not/exist' })
46
+
47
+ expect(User).to receive(:create_from_provider).with('facebook', '123', {username: 'Noam Ben Ari'})
48
+
49
+ get :test_create_from_provider, provider: 'facebook'
50
+ end
51
+
52
+ describe 'with a block' do
53
+ it 'does not create user' do
54
+ sorcery_model_property_set(:authentications_class, Authentication)
55
+ sorcery_controller_external_property_set(:facebook, :user_info_mapping, { username: 'name' })
56
+
57
+ u = double('user')
58
+ expect(User).to receive(:create_from_provider).with('facebook', '123', {username: 'Noam Ben Ari'}).and_return(u).and_yield(u)
59
+ # test_create_from_provider_with_block in controller will check for uniqueness of username
60
+ get :test_create_from_provider_with_block, provider: 'facebook'
61
+ end
62
+ end
63
+ end
19
64
 
20
65
  # ----------------- OAuth -----------------------
21
66
  context "with OAuth features" do
22
67
 
68
+ let(:user) { double('user', id: 42) }
69
+
23
70
  before(:each) do
24
71
  stub_all_oauth2_requests!
25
72
  end
26
73
 
27
74
  after(:each) do
28
- User.delete_all
29
- Authentication.delete_all
75
+ User.sorcery_adapter.delete_all
76
+ Authentication.sorcery_adapter.delete_all
30
77
  end
31
78
 
32
79
  context "when callback_url begin with /" do
@@ -34,39 +81,52 @@ describe SorceryController, :active_record => true do
34
81
  sorcery_controller_external_property_set(:facebook, :callback_url, "/oauth/twitter/callback")
35
82
  end
36
83
  it "login_at redirects correctly" do
37
- create_new_user
38
84
  get :login_at_test_facebook
39
85
  expect(response).to be_a_redirect
40
- expect(response).to redirect_to("https://graph.facebook.com/oauth/authorize?client_id=#{::Sorcery::Controller::Config.facebook.key}&display=page&redirect_uri=http%3A%2F%2Ftest.host%2Foauth%2Ftwitter%2Fcallback&response_type=code&scope=email%2Coffline_access&state=")
86
+ expect(response).to redirect_to("https://www.facebook.com/dialog/oauth?client_id=#{::Sorcery::Controller::Config.facebook.key}&display=page&redirect_uri=http%3A%2F%2Ftest.host%2Foauth%2Ftwitter%2Fcallback&response_type=code&scope=email&state=")
41
87
  end
88
+
42
89
  it "logins with state" do
43
- create_new_user
44
90
  get :login_at_test_with_state
45
91
  expect(response).to be_a_redirect
46
- expect(response).to redirect_to("https://graph.facebook.com/oauth/authorize?client_id=#{::Sorcery::Controller::Config.facebook.key}&display=page&redirect_uri=http%3A%2F%2Ftest.host%2Foauth%2Ftwitter%2Fcallback&response_type=code&scope=email%2Coffline_access&state=bla")
92
+ expect(response).to redirect_to("https://www.facebook.com/dialog/oauth?client_id=#{::Sorcery::Controller::Config.facebook.key}&display=page&redirect_uri=http%3A%2F%2Ftest.host%2Foauth%2Ftwitter%2Fcallback&response_type=code&scope=email&state=bla")
93
+ end
94
+
95
+ it "logins with Graph API version" do
96
+ sorcery_controller_external_property_set(:facebook, :api_version, "v2.2")
97
+ get :login_at_test_with_state
98
+ expect(response).to be_a_redirect
99
+ expect(response).to redirect_to("https://www.facebook.com/v2.2/dialog/oauth?client_id=#{::Sorcery::Controller::Config.facebook.key}&display=page&redirect_uri=http%3A%2F%2Ftest.host%2Foauth%2Ftwitter%2Fcallback&response_type=code&scope=email&state=bla")
47
100
  end
101
+
102
+ it "logins without state after login with state" do
103
+ get :login_at_test_with_state
104
+ expect(response).to redirect_to("https://www.facebook.com/v2.2/dialog/oauth?client_id=#{::Sorcery::Controller::Config.facebook.key}&display=page&redirect_uri=http%3A%2F%2Ftest.host%2Foauth%2Ftwitter%2Fcallback&response_type=code&scope=email&state=bla")
105
+
106
+ get :login_at_test_facebook
107
+ expect(response).to redirect_to("https://www.facebook.com/v2.2/dialog/oauth?client_id=#{::Sorcery::Controller::Config.facebook.key}&display=page&redirect_uri=http%3A%2F%2Ftest.host%2Foauth%2Ftwitter%2Fcallback&response_type=code&scope=email&state=")
108
+ end
109
+
48
110
  after do
49
111
  sorcery_controller_external_property_set(:facebook, :callback_url, "http://blabla.com")
50
112
  end
51
113
  end
52
114
 
53
- #this test can never pass because of the previous test (the callback url can't change anymore)
54
- =begin
55
115
  context "when callback_url begin with http://" do
56
116
  it "login_at redirects correctly" do
57
117
  create_new_user
58
- get :login_at_test2
59
- response.should be_a_redirect
60
- response.should redirect_to("https://graph.facebook.com/oauth/authorize?response_type=code&client_id=#{::Sorcery::Controller::Config.facebook.key}&redirect_uri=http%3A%2F%2Fblabla.com&scope=email%2Coffline_access&display=page&state")
118
+ get :login_at_test_facebook
119
+ expect(response).to be_a_redirect
120
+ expect(response).to redirect_to("https://www.facebook.com/v2.2/dialog/oauth?client_id=#{::Sorcery::Controller::Config.facebook.key}&display=page&redirect_uri=http%3A%2F%2Ftest.host%2Foauth%2Ftwitter%2Fcallback&response_type=code&scope=email&state=")
61
121
  end
62
122
  end
63
- =end
123
+
64
124
  it "'login_from' logins if user exists" do
65
125
  # dirty hack for rails 4
66
126
  allow(subject).to receive(:register_last_activity_time_to_db)
67
127
 
68
128
  sorcery_model_property_set(:authentications_class, Authentication)
69
- create_new_external_user(:facebook)
129
+ expect(User).to receive(:load_from_provider).with(:facebook, '123').and_return(user)
70
130
  get :test_login_from_facebook
71
131
 
72
132
  expect(flash[:notice]).to eq "Success!"
@@ -74,7 +134,7 @@ describe SorceryController, :active_record => true do
74
134
 
75
135
  it "'login_from' fails if user doesn't exist" do
76
136
  sorcery_model_property_set(:authentications_class, Authentication)
77
- create_new_user
137
+ expect(User).to receive(:load_from_provider).with(:facebook, '123').and_return(nil)
78
138
  get :test_login_from_facebook
79
139
 
80
140
  expect(flash[:alert]).to eq "Failed!"
@@ -85,19 +145,18 @@ describe SorceryController, :active_record => true do
85
145
  allow(subject).to receive(:register_last_activity_time_to_db)
86
146
 
87
147
  sorcery_model_property_set(:authentications_class, Authentication)
88
- create_new_external_user(:facebook)
148
+ expect(User).to receive(:load_from_provider).with(:facebook, '123').and_return(user)
89
149
  get :test_return_to_with_external_facebook, {}, :return_to_url => "fuu"
90
150
 
91
151
  expect(response).to redirect_to("fuu")
92
152
  expect(flash[:notice]).to eq "Success!"
93
153
  end
94
154
 
95
- [:github, :google, :liveid].each do |provider|
155
+ [:github, :google, :liveid, :vk, :salesforce].each do |provider|
96
156
 
97
157
  describe "with #{provider}" do
98
158
 
99
159
  it "login_at redirects correctly" do
100
- create_new_user
101
160
  get :"login_at_test_#{provider}"
102
161
 
103
162
  expect(response).to be_a_redirect
@@ -109,7 +168,7 @@ describe SorceryController, :active_record => true do
109
168
  allow(subject).to receive(:register_last_activity_time_to_db)
110
169
 
111
170
  sorcery_model_property_set(:authentications_class, Authentication)
112
- create_new_external_user(provider)
171
+ expect(User).to receive(:load_from_provider).with(provider, '123').and_return(user)
113
172
  get :"test_login_from_#{provider}"
114
173
 
115
174
  expect(flash[:notice]).to eq "Success!"
@@ -117,18 +176,18 @@ describe SorceryController, :active_record => true do
117
176
 
118
177
  it "'login_from' fails if user doesn't exist" do
119
178
  sorcery_model_property_set(:authentications_class, Authentication)
120
- create_new_user
179
+ expect(User).to receive(:load_from_provider).with(provider, '123').and_return(nil)
121
180
  get :"test_login_from_#{provider}"
122
181
 
123
182
  expect(flash[:alert]).to eq "Failed!"
124
183
  end
125
184
 
126
- it "on successful login_from the user is redirected to the url he originally wanted (github)" do
185
+ it "on successful login_from the user is redirected to the url he originally wanted (#{provider})" do
127
186
  # dirty hack for rails 4
128
187
  allow(subject).to receive(:register_last_activity_time_to_db)
129
188
 
130
189
  sorcery_model_property_set(:authentications_class, Authentication)
131
- create_new_external_user(provider)
190
+ expect(User).to receive(:load_from_provider).with(provider, '123').and_return(user)
132
191
  get :"test_return_to_with_external_#{provider}", {}, :return_to_url => "fuu"
133
192
 
134
193
  expect(response).to redirect_to "fuu"
@@ -141,9 +200,13 @@ describe SorceryController, :active_record => true do
141
200
 
142
201
  describe "OAuth with User Activation features" do
143
202
  before(:all) do
144
- ActiveRecord::Migrator.migrate("#{Rails.root}/db/migrate/activation")
203
+ if SORCERY_ORM == :active_record
204
+ ActiveRecord::Migrator.migrate("#{Rails.root}/db/migrate/activation")
205
+ end
206
+
145
207
  sorcery_reload!([:user_activation,:external], :user_activation_mailer => ::SorceryMailer)
146
- sorcery_controller_property_set(:external_providers, [:facebook, :github, :google, :liveid])
208
+ sorcery_controller_property_set(:external_providers, [:facebook, :github, :google, :liveid, :vk, :salesforce])
209
+
147
210
  sorcery_controller_external_property_set(:facebook, :key, "eYVNBjBDi33aa9GkA3w")
148
211
  sorcery_controller_external_property_set(:facebook, :secret, "XpbeSdCoaKSmQGSeokz5qcUATClRW5u08QWNfv71N8")
149
212
  sorcery_controller_external_property_set(:facebook, :callback_url, "http://blabla.com")
@@ -156,15 +219,22 @@ describe SorceryController, :active_record => true do
156
219
  sorcery_controller_external_property_set(:liveid, :key, "eYVNBjBDi33aa9GkA3w")
157
220
  sorcery_controller_external_property_set(:liveid, :secret, "XpbeSdCoaKSmQGSeokz5qcUATClRW5u08QWNfv71N8")
158
221
  sorcery_controller_external_property_set(:liveid, :callback_url, "http://blabla.com")
159
-
222
+ sorcery_controller_external_property_set(:vk, :key, "eYVNBjBDi33aa9GkA3w")
223
+ sorcery_controller_external_property_set(:vk, :secret, "XpbeSdCoaKSmQGSeokz5qcUATClRW5u08QWNfv71N8")
224
+ sorcery_controller_external_property_set(:vk, :callback_url, "http://blabla.com")
225
+ sorcery_controller_external_property_set(:salesforce, :key, "eYVNBjBDi33aa9GkA3w")
226
+ sorcery_controller_external_property_set(:salesforce, :secret, "XpbeSdCoaKSmQGSeokz5qcUATClRW5u08QWNfv71N8")
227
+ sorcery_controller_external_property_set(:salesforce, :callback_url, "http://blabla.com")
160
228
  end
161
229
 
162
230
  after(:all) do
163
- ActiveRecord::Migrator.rollback("#{Rails.root}/db/migrate/activation")
231
+ if SORCERY_ORM == :active_record
232
+ ActiveRecord::Migrator.rollback("#{Rails.root}/db/migrate/activation")
233
+ end
164
234
  end
165
235
 
166
236
  after(:each) do
167
- User.delete_all
237
+ User.sorcery_adapter.delete_all
168
238
  end
169
239
 
170
240
  it "does not send activation email to external users" do
@@ -183,64 +253,65 @@ describe SorceryController, :active_record => true do
183
253
  expect(ActionMailer::Base.deliveries.size).to eq old_size
184
254
  end
185
255
 
186
- # provider: github
187
- [:github, :google, :liveid].each do |provider|
188
- it "does not send activation email to external users (github)" do
256
+ [:github, :google, :liveid, :vk, :salesforce].each do |provider|
257
+ it "does not send activation email to external users (#{provider})" do
189
258
  old_size = ActionMailer::Base.deliveries.size
190
259
  create_new_external_user provider
191
260
  expect(ActionMailer::Base.deliveries.size).to eq old_size
192
261
  end
193
262
 
194
- it "does not send external users an activation success email (github)" do
263
+ it "does not send external users an activation success email (#{provider})" do
195
264
  sorcery_model_property_set(:activation_success_email_method_name, nil)
196
265
  create_new_external_user provider
197
266
  old_size = ActionMailer::Base.deliveries.size
198
267
  @user.activate!
199
-
200
- expect(ActionMailer::Base.deliveries.size).to eq old_size
201
268
  end
202
269
  end
203
270
  end
204
271
 
205
272
  describe "OAuth with user activation features" do
273
+
274
+ let(:user) { double('user', id: 42) }
275
+
206
276
  before(:all) do
207
- ActiveRecord::Migrator.migrate("#{Rails.root}/db/migrate/external")
208
- ActiveRecord::Migrator.migrate("#{Rails.root}/db/migrate/activity_logging")
209
- User.reset_column_information
210
277
  sorcery_reload!([:activity_logging, :external])
211
278
  end
212
279
 
213
280
  after(:all) do
214
- ActiveRecord::Migrator.rollback("#{Rails.root}/db/migrate/external")
215
- ActiveRecord::Migrator.rollback("#{Rails.root}/db/migrate/activity_logging")
281
+ if SORCERY_ORM == :active_record
282
+ ActiveRecord::Migrator.rollback("#{Rails.root}/db/migrate/external")
283
+ ActiveRecord::Migrator.rollback("#{Rails.root}/db/migrate/activity_logging")
284
+ end
216
285
  end
217
286
 
218
- %w(facebook github google liveid).each do |provider|
287
+ %w(facebook github google liveid vk salesforce).each do |provider|
219
288
  context "when #{provider}" do
220
289
  before(:each) do
221
- User.delete_all
222
- Authentication.delete_all
223
290
  sorcery_controller_property_set(:register_login_time, true)
291
+ sorcery_controller_property_set(:register_logout_time, false)
292
+ sorcery_controller_property_set(:register_last_activity_time, false)
293
+ sorcery_controller_property_set(:register_last_ip_address, false)
224
294
  stub_all_oauth2_requests!
225
295
  sorcery_model_property_set(:authentications_class, Authentication)
226
- create_new_external_user(provider.to_sym)
227
296
  end
228
297
 
229
298
  it "registers login time" do
230
299
  now = Time.now.in_time_zone
300
+ Timecop.freeze(now)
301
+ expect(User).to receive(:load_from_provider).and_return(user)
302
+ expect(user).to receive(:set_last_login_at).with(be_within(0.1).of(now))
231
303
  get "test_login_from_#{provider}".to_sym
232
-
233
- expect(User.last.last_login_at).not_to be_nil
234
- expect(User.last.last_login_at.to_s(:db)).to be >= now.to_s(:db)
235
- expect(User.last.last_login_at.to_s(:db)).to be <= (now+2).to_s(:db)
304
+ Timecop.return
236
305
  end
237
306
 
238
307
  it "does not register login time if configured so" do
239
308
  sorcery_controller_property_set(:register_login_time, false)
240
309
  now = Time.now.in_time_zone
310
+ Timecop.freeze(now)
311
+ expect(User).to receive(:load_from_provider).and_return(user)
312
+ expect(user).to receive(:set_last_login_at).never
241
313
  get "test_login_from_#{provider}".to_sym
242
314
 
243
- expect(User.last.last_login_at).to be_nil
244
315
  end
245
316
  end
246
317
  end
@@ -248,24 +319,17 @@ describe SorceryController, :active_record => true do
248
319
 
249
320
  describe "OAuth with session timeout features" do
250
321
  before(:all) do
251
- ActiveRecord::Migrator.migrate("#{Rails.root}/db/migrate/external")
252
- User.reset_column_information
253
322
  sorcery_reload!([:session_timeout, :external])
254
323
  end
255
324
 
256
- after(:all) do
257
- ActiveRecord::Migrator.rollback("#{Rails.root}/db/migrate/external")
258
- end
325
+ let(:user) { double('user', id: 42) }
259
326
 
260
- %w(facebook github google liveid).each do |provider|
327
+ %w(facebook github google liveid vk salesforce).each do |provider|
261
328
  context "when #{provider}" do
262
329
  before(:each) do
263
- User.delete_all
264
- Authentication.delete_all
265
330
  sorcery_model_property_set(:authentications_class, Authentication)
266
331
  sorcery_controller_property_set(:session_timeout,0.5)
267
332
  stub_all_oauth2_requests!
268
- create_new_external_user(provider.to_sym)
269
333
  end
270
334
 
271
335
  after(:each) do
@@ -273,6 +337,7 @@ describe SorceryController, :active_record => true do
273
337
  end
274
338
 
275
339
  it "does not reset session before session timeout" do
340
+ expect(User).to receive(:load_from_provider).with(provider.to_sym, '123').and_return(user)
276
341
  get "test_login_from_#{provider}".to_sym
277
342
 
278
343
  expect(session[:user_id]).not_to be_nil
@@ -280,7 +345,9 @@ describe SorceryController, :active_record => true do
280
345
  end
281
346
 
282
347
  it "resets session after session timeout" do
348
+ expect(User).to receive(:load_from_provider).with(provider.to_sym, '123').and_return(user)
283
349
  get "test_login_from_#{provider}".to_sym
350
+ expect(session[:user_id]).to eq "42"
284
351
  Timecop.travel(Time.now.in_time_zone+0.6)
285
352
  get :test_should_be_logged_in
286
353
 
@@ -297,6 +364,7 @@ describe SorceryController, :active_record => true do
297
364
  response = double(OAuth2::Response)
298
365
  allow(response).to receive(:body) { {
299
366
  "id"=>"123",
367
+ "user_id"=>"123", # Needed for Salesforce
300
368
  "name"=>"Noam Ben Ari",
301
369
  "first_name"=>"Noam",
302
370
  "last_name"=>"Ben Ari",
@@ -310,13 +378,24 @@ describe SorceryController, :active_record => true do
310
378
  "locale"=>"en_US",
311
379
  "languages"=>[{"id"=>"108405449189952", "name"=>"Hebrew"}, {"id"=>"106059522759137", "name"=>"English"}, {"id"=>"112624162082677", "name"=>"Russian"}],
312
380
  "verified"=>true,
313
- "updated_time"=>"2011-02-16T20:59:38+0000"}.to_json }
381
+ "updated_time"=>"2011-02-16T20:59:38+0000",
382
+ # response for VK auth
383
+ "response"=>[
384
+ {
385
+ "uid"=>"123",
386
+ "first_name"=>"Noam",
387
+ "last_name"=>"Ben Ari"
388
+ }
389
+ ]}.to_json }
314
390
  allow(access_token).to receive(:get) { response }
391
+ allow(access_token).to receive(:token) { "187041a618229fdaf16613e96e1caabc1e86e46bbfad228de41520e63fe45873684c365a14417289599f3" }
392
+ # access_token params for VK auth
393
+ allow(access_token).to receive(:params) { { "user_id"=>"100500", "email"=>"nbenari@gmail.com" } }
315
394
  allow_any_instance_of(OAuth2::Strategy::AuthCode).to receive(:get_token) { access_token }
316
395
  end
317
396
 
318
397
  def set_external_property
319
- sorcery_controller_property_set(:external_providers, [:facebook, :github, :google, :liveid])
398
+ sorcery_controller_property_set(:external_providers, [:facebook, :github, :google, :liveid, :vk, :salesforce])
320
399
  sorcery_controller_external_property_set(:facebook, :key, "eYVNBjBDi33aa9GkA3w")
321
400
  sorcery_controller_external_property_set(:facebook, :secret, "XpbeSdCoaKSmQGSeokz5qcUATClRW5u08QWNfv71N8")
322
401
  sorcery_controller_external_property_set(:facebook, :callback_url, "http://blabla.com")
@@ -329,14 +408,22 @@ describe SorceryController, :active_record => true do
329
408
  sorcery_controller_external_property_set(:liveid, :key, "eYVNBjBDi33aa9GkA3w")
330
409
  sorcery_controller_external_property_set(:liveid, :secret, "XpbeSdCoaKSmQGSeokz5qcUATClRW5u08QWNfv71N8")
331
410
  sorcery_controller_external_property_set(:liveid, :callback_url, "http://blabla.com")
411
+ sorcery_controller_external_property_set(:vk, :key, "eYVNBjBDi33aa9GkA3w")
412
+ sorcery_controller_external_property_set(:vk, :secret, "XpbeSdCoaKSmQGSeokz5qcUATClRW5u08QWNfv71N8")
413
+ sorcery_controller_external_property_set(:vk, :callback_url, "http://blabla.com")
414
+ sorcery_controller_external_property_set(:salesforce, :key, "eYVNBjBDi33aa9GkA3w")
415
+ sorcery_controller_external_property_set(:salesforce, :secret, "XpbeSdCoaKSmQGSeokz5qcUATClRW5u08QWNfv71N8")
416
+ sorcery_controller_external_property_set(:salesforce, :callback_url, "http://blabla.com")
332
417
  end
333
418
 
334
419
  def provider_url(provider)
335
420
  {
336
421
  github: "https://github.com/login/oauth/authorize?client_id=#{::Sorcery::Controller::Config.github.key}&display=&redirect_uri=http%3A%2F%2Fblabla.com&response_type=code&scope=&state=",
337
422
  google: "https://accounts.google.com/o/oauth2/auth?client_id=#{::Sorcery::Controller::Config.google.key}&display=&redirect_uri=http%3A%2F%2Fblabla.com&response_type=code&scope=https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fuserinfo.email+https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fuserinfo.profile&state=",
338
- liveid: "https://oauth.live.com/authorize?client_id=#{::Sorcery::Controller::Config.liveid.key}&display=&redirect_uri=http%3A%2F%2Fblabla.com&response_type=code&scope=wl.basic+wl.emails+wl.offline_access&state="
423
+ liveid: "https://oauth.live.com/authorize?client_id=#{::Sorcery::Controller::Config.liveid.key}&display=&redirect_uri=http%3A%2F%2Fblabla.com&response_type=code&scope=wl.basic+wl.emails+wl.offline_access&state=",
424
+ vk: "https://oauth.vk.com/authorize?client_id=#{::Sorcery::Controller::Config.vk.key}&display=&redirect_uri=http%3A%2F%2Fblabla.com&response_type=code&scope=#{::Sorcery::Controller::Config.vk.scope}&state=",
425
+ salesforce: "https://login.salesforce.com/services/oauth2/authorize?client_id=#{::Sorcery::Controller::Config.salesforce.key}&display=&redirect_uri=http%3A%2F%2Fblabla.com&response_type=code&scope=#{::Sorcery::Controller::Config.salesforce.scope}&state="
339
426
  }[provider]
340
427
  end
341
-
342
428
  end
429
+