cm-devise_token_auth 0.1.30.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (117) hide show
  1. checksums.yaml +7 -0
  2. data/LICENSE +13 -0
  3. data/README.md +688 -0
  4. data/Rakefile +34 -0
  5. data/app/controllers/devise_token_auth/application_controller.rb +17 -0
  6. data/app/controllers/devise_token_auth/concerns/set_user_by_token.rb +109 -0
  7. data/app/controllers/devise_token_auth/confirmations_controller.rb +31 -0
  8. data/app/controllers/devise_token_auth/omniauth_callbacks_controller.rb +171 -0
  9. data/app/controllers/devise_token_auth/passwords_controller.rb +155 -0
  10. data/app/controllers/devise_token_auth/registrations_controller.rb +123 -0
  11. data/app/controllers/devise_token_auth/sessions_controller.rb +98 -0
  12. data/app/controllers/devise_token_auth/token_validations_controller.rb +23 -0
  13. data/app/models/devise_token_auth/concerns/user.rb +231 -0
  14. data/app/views/devise/mailer/confirmation_instructions.html.erb +5 -0
  15. data/app/views/devise/mailer/reset_password_instructions.html.erb +8 -0
  16. data/app/views/devise/mailer/unlock_instructions.html.erb +7 -0
  17. data/app/views/devise_token_auth/omniauth_failure.html.erb +2 -0
  18. data/app/views/devise_token_auth/omniauth_success.html.erb +8 -0
  19. data/app/views/layouts/omniauth_response.html.erb +31 -0
  20. data/config/initializers/devise.rb +203 -0
  21. data/config/locales/devise.en.yml +59 -0
  22. data/config/routes.rb +5 -0
  23. data/lib/devise_token_auth.rb +7 -0
  24. data/lib/devise_token_auth/controllers/helpers.rb +129 -0
  25. data/lib/devise_token_auth/controllers/url_helpers.rb +8 -0
  26. data/lib/devise_token_auth/engine.rb +25 -0
  27. data/lib/devise_token_auth/rails/routes.rb +65 -0
  28. data/lib/devise_token_auth/version.rb +3 -0
  29. data/lib/generators/devise_token_auth/USAGE +31 -0
  30. data/lib/generators/devise_token_auth/install_generator.rb +115 -0
  31. data/lib/generators/devise_token_auth/install_views_generator.rb +16 -0
  32. data/lib/generators/devise_token_auth/templates/devise_token_auth.rb +22 -0
  33. data/lib/generators/devise_token_auth/templates/devise_token_auth_create_users.rb.erb +54 -0
  34. data/lib/generators/devise_token_auth/templates/user.rb +3 -0
  35. data/lib/tasks/devise_token_auth_tasks.rake +4 -0
  36. data/test/controllers/demo_group_controller_test.rb +126 -0
  37. data/test/controllers/demo_mang_controller_test.rb +263 -0
  38. data/test/controllers/demo_user_controller_test.rb +262 -0
  39. data/test/controllers/devise_token_auth/confirmations_controller_test.rb +107 -0
  40. data/test/controllers/devise_token_auth/omniauth_callbacks_controller_test.rb +167 -0
  41. data/test/controllers/devise_token_auth/passwords_controller_test.rb +287 -0
  42. data/test/controllers/devise_token_auth/registrations_controller_test.rb +458 -0
  43. data/test/controllers/devise_token_auth/sessions_controller_test.rb +221 -0
  44. data/test/controllers/overrides/confirmations_controller_test.rb +44 -0
  45. data/test/controllers/overrides/omniauth_callbacks_controller_test.rb +44 -0
  46. data/test/controllers/overrides/passwords_controller_test.rb +62 -0
  47. data/test/controllers/overrides/registrations_controller_test.rb +40 -0
  48. data/test/controllers/overrides/sessions_controller_test.rb +33 -0
  49. data/test/controllers/overrides/token_validations_controller_test.rb +38 -0
  50. data/test/dummy/README.rdoc +28 -0
  51. data/test/dummy/Rakefile +6 -0
  52. data/test/dummy/app/assets/images/logo.jpg +0 -0
  53. data/test/dummy/app/assets/images/omniauth-provider-settings.png +0 -0
  54. data/test/dummy/app/assets/javascripts/application.js +13 -0
  55. data/test/dummy/app/assets/stylesheets/application.css +15 -0
  56. data/test/dummy/app/controllers/application_controller.rb +16 -0
  57. data/test/dummy/app/controllers/demo_group_controller.rb +13 -0
  58. data/test/dummy/app/controllers/demo_mang_controller.rb +12 -0
  59. data/test/dummy/app/controllers/demo_user_controller.rb +12 -0
  60. data/test/dummy/app/controllers/overrides/confirmations_controller.rb +32 -0
  61. data/test/dummy/app/controllers/overrides/omniauth_callbacks_controller.rb +14 -0
  62. data/test/dummy/app/controllers/overrides/passwords_controller.rb +39 -0
  63. data/test/dummy/app/controllers/overrides/registrations_controller.rb +27 -0
  64. data/test/dummy/app/controllers/overrides/sessions_controller.rb +43 -0
  65. data/test/dummy/app/controllers/overrides/token_validations_controller.rb +23 -0
  66. data/test/dummy/app/helpers/application_helper.rb +1065 -0
  67. data/test/dummy/app/models/evil_user.rb +3 -0
  68. data/test/dummy/app/models/mang.rb +3 -0
  69. data/test/dummy/app/models/user.rb +18 -0
  70. data/test/dummy/app/views/layouts/application.html.erb +14 -0
  71. data/test/dummy/bin/bundle +3 -0
  72. data/test/dummy/bin/rails +8 -0
  73. data/test/dummy/bin/rake +8 -0
  74. data/test/dummy/bin/spring +18 -0
  75. data/test/dummy/config.ru +16 -0
  76. data/test/dummy/config/application.rb +23 -0
  77. data/test/dummy/config/application.yml.bk +0 -0
  78. data/test/dummy/config/boot.rb +5 -0
  79. data/test/dummy/config/database.yml +31 -0
  80. data/test/dummy/config/environment.rb +5 -0
  81. data/test/dummy/config/environments/development.rb +44 -0
  82. data/test/dummy/config/environments/production.rb +82 -0
  83. data/test/dummy/config/environments/test.rb +40 -0
  84. data/test/dummy/config/initializers/assets.rb +8 -0
  85. data/test/dummy/config/initializers/backtrace_silencers.rb +7 -0
  86. data/test/dummy/config/initializers/cookies_serializer.rb +3 -0
  87. data/test/dummy/config/initializers/devise_token_auth.rb +22 -0
  88. data/test/dummy/config/initializers/figaro.rb +1 -0
  89. data/test/dummy/config/initializers/filter_parameter_logging.rb +4 -0
  90. data/test/dummy/config/initializers/inflections.rb +16 -0
  91. data/test/dummy/config/initializers/mime_types.rb +4 -0
  92. data/test/dummy/config/initializers/omniauth.rb +8 -0
  93. data/test/dummy/config/initializers/session_store.rb +3 -0
  94. data/test/dummy/config/initializers/wrap_parameters.rb +14 -0
  95. data/test/dummy/config/locales/en.yml +23 -0
  96. data/test/dummy/config/routes.rb +30 -0
  97. data/test/dummy/config/secrets.yml +22 -0
  98. data/test/dummy/config/spring.rb +1 -0
  99. data/test/dummy/db/migrate/20140715061447_devise_token_auth_create_users.rb +56 -0
  100. data/test/dummy/db/migrate/20140715061805_devise_token_auth_create_mangs.rb +56 -0
  101. data/test/dummy/db/migrate/20140829044006_add_operating_thetan_to_user.rb +6 -0
  102. data/test/dummy/db/migrate/20140916224624_add_favorite_color_to_mangs.rb +5 -0
  103. data/test/dummy/db/migrate/20140928231203_devise_token_auth_create_evil_users.rb +57 -0
  104. data/test/dummy/db/schema.rb +114 -0
  105. data/test/dummy/public/404.html +67 -0
  106. data/test/dummy/public/422.html +67 -0
  107. data/test/dummy/public/500.html +66 -0
  108. data/test/dummy/public/favicon.ico +0 -0
  109. data/test/fixtures/evil_users.yml +29 -0
  110. data/test/fixtures/mangs.yml +29 -0
  111. data/test/fixtures/users.yml +29 -0
  112. data/test/integration/navigation_test.rb +10 -0
  113. data/test/lib/generators/devise_token_auth/install_generator_test.rb +178 -0
  114. data/test/lib/generators/devise_token_auth/install_views_generator_test.rb +23 -0
  115. data/test/models/user_test.rb +90 -0
  116. data/test/test_helper.rb +60 -0
  117. metadata +310 -0
@@ -0,0 +1,458 @@
1
+ require 'test_helper'
2
+
3
+ # was the web request successful?
4
+ # was the user redirected to the right page?
5
+ # was the user successfully authenticated?
6
+ # was the correct object stored in the response?
7
+ # was the appropriate message delivered in the json payload?
8
+
9
+
10
+ class DeviseTokenAuth::RegistrationsControllerTest < ActionDispatch::IntegrationTest
11
+ describe DeviseTokenAuth::RegistrationsController do
12
+ describe "Successful registration" do
13
+ before do
14
+ @mails_sent = ActionMailer::Base.deliveries.count
15
+
16
+ post '/auth', {
17
+ email: Faker::Internet.email,
18
+ password: "secret123",
19
+ password_confirmation: "secret123",
20
+ confirm_success_url: Faker::Internet.url,
21
+ unpermitted_param: '(x_x)'
22
+ }
23
+
24
+ @resource = assigns(:resource)
25
+ @data = JSON.parse(response.body)
26
+ @mail = ActionMailer::Base.deliveries.last
27
+ end
28
+
29
+ test "request should be successful" do
30
+ assert_equal 200, response.status
31
+ end
32
+
33
+ test "user should have been created" do
34
+ assert @resource.id
35
+ end
36
+
37
+ test "user should not be confirmed" do
38
+ assert_nil @resource.confirmed_at
39
+ end
40
+
41
+ test "new user data should be returned as json" do
42
+ assert @data['data']['email']
43
+ end
44
+
45
+ test "new user should receive confirmation email" do
46
+ assert_equal @resource.email, @mail['to'].to_s
47
+ end
48
+
49
+ test "new user password should not be returned" do
50
+ assert_nil @data['data']['password']
51
+ end
52
+
53
+ test "only one email was sent" do
54
+ assert_equal @mails_sent + 1, ActionMailer::Base.deliveries.count
55
+ end
56
+ end
57
+
58
+ describe "case-insensitive email" do
59
+
60
+ before do
61
+ @resource_class = User
62
+ @request_params = {
63
+ email: "AlternatingCase@example.com",
64
+ password: "secret123",
65
+ password_confirmation: "secret123",
66
+ confirm_success_url: Faker::Internet.url
67
+ }
68
+ end
69
+
70
+ test "success should downcase uid if configured" do
71
+ @resource_class.case_insensitive_keys = [:email]
72
+ post '/auth', @request_params
73
+ assert_equal 200, response.status
74
+ @data = JSON.parse(response.body)
75
+ assert_equal "alternatingcase@example.com", @data['data']['uid']
76
+ end
77
+
78
+ test "request should not downcase uid if not configured" do
79
+ @resource_class.case_insensitive_keys = []
80
+ post '/auth', @request_params
81
+ assert_equal 200, response.status
82
+ @data = JSON.parse(response.body)
83
+ assert_equal "AlternatingCase@example.com", @data['data']['uid']
84
+ end
85
+
86
+ end
87
+
88
+ describe "Adding extra params" do
89
+ before do
90
+ @redirect_url = Faker::Internet.url
91
+ @operating_thetan = 2
92
+
93
+ post '/auth', {
94
+ email: Faker::Internet.email,
95
+ password: "secret123",
96
+ password_confirmation: "secret123",
97
+ confirm_success_url: @redirect_url,
98
+ favorite_color: @fav_color,
99
+ operating_thetan: @operating_thetan
100
+ }
101
+
102
+ @resource = assigns(:resource)
103
+ @data = JSON.parse(response.body)
104
+ @mail = ActionMailer::Base.deliveries.last
105
+
106
+ @mail_reset_token = @mail.body.match(/confirmation_token=([^&]*)&/)[1]
107
+ @mail_redirect_url = CGI.unescape(@mail.body.match(/redirect_url=(.*)\"/)[1])
108
+ @mail_config_name = CGI.unescape(@mail.body.match(/config=([^&]*)&/)[1])
109
+ end
110
+
111
+ test 'redirect_url is included as param in email' do
112
+ assert_equal @redirect_url, @mail_redirect_url
113
+ end
114
+
115
+ test "additional sign_up params should be considered" do
116
+ assert_equal @operating_thetan, @resource.operating_thetan
117
+ end
118
+
119
+ test 'config_name param is included in the confirmation email link' do
120
+ assert @mail_config_name
121
+ end
122
+
123
+ test "client config name falls back to 'default'" do
124
+ assert_equal "default", @mail_config_name
125
+ end
126
+ end
127
+
128
+ describe "Mismatched passwords" do
129
+ before do
130
+ post '/auth', {
131
+ email: Faker::Internet.email,
132
+ password: "secret123",
133
+ password_confirmation: "bogus",
134
+ confirm_success_url: Faker::Internet.url
135
+ }
136
+
137
+ @resource = assigns(:resource)
138
+ @data = JSON.parse(response.body)
139
+ end
140
+
141
+ test "request should not be successful" do
142
+ assert_equal 403, response.status
143
+ end
144
+
145
+ test "user should have been created" do
146
+ assert_nil @resource.id
147
+ end
148
+
149
+ test "error should be returned in the response" do
150
+ assert @data['errors'].length
151
+ end
152
+
153
+ test "full_messages should be included in error hash" do
154
+ assert @data['errors']['full_messages'].length
155
+ end
156
+ end
157
+
158
+ describe "Existing users" do
159
+ before do
160
+ @existing_user = users(:confirmed_email_user)
161
+
162
+ post "/auth", {
163
+ email: @existing_user.email,
164
+ password: "secret123",
165
+ password_confirmation: "secret123",
166
+ confirm_success_url: Faker::Internet.url
167
+ }
168
+
169
+ @resource = assigns(:resource)
170
+ @data = JSON.parse(response.body)
171
+ end
172
+
173
+ test "request should not be successful" do
174
+ assert_equal 403, response.status
175
+ end
176
+
177
+ test "user should have been created" do
178
+ assert_nil @resource.id
179
+ end
180
+
181
+ test "error should be returned in the response" do
182
+ assert @data['errors'].length
183
+ end
184
+ end
185
+
186
+
187
+ describe "Destroy user account" do
188
+ describe "success" do
189
+ before do
190
+ @existing_user = users(:confirmed_email_user)
191
+ @auth_headers = @existing_user.create_new_auth_token
192
+ @client_id = @auth_headers['client']
193
+
194
+ # ensure request is not treated as batch request
195
+ age_token(@existing_user, @client_id)
196
+
197
+ delete "/auth", {}, @auth_headers
198
+
199
+ @data = JSON.parse(response.body)
200
+ end
201
+
202
+ test 'request is successful' do
203
+ assert_equal 200, response.status
204
+ end
205
+
206
+ test "existing user should be deleted" do
207
+ refute User.where(id: @existing_user.id).first
208
+ end
209
+ end
210
+
211
+ describe 'failure: no auth headers' do
212
+ before do
213
+ delete "/auth"
214
+ @data = JSON.parse(response.body)
215
+ end
216
+
217
+ test 'request returns 404 (not found) status' do
218
+ assert_equal 404, response.status
219
+ end
220
+ end
221
+ end
222
+
223
+
224
+ describe "Update user account" do
225
+ describe "existing user" do
226
+ before do
227
+ @existing_user = users(:confirmed_email_user)
228
+ @auth_headers = @existing_user.create_new_auth_token
229
+ @client_id = @auth_headers['client']
230
+
231
+ # ensure request is not treated as batch request
232
+ age_token(@existing_user, @client_id)
233
+ end
234
+
235
+ describe "success" do
236
+ before do
237
+ # test valid update param
238
+ @resource_class = User
239
+ @new_operating_thetan = 1000000
240
+ @email = "AlternatingCase2@example.com"
241
+ @request_params = {
242
+ operating_thetan: @new_operating_thetan,
243
+ email: @email
244
+ }
245
+ end
246
+
247
+ test "Request was successful" do
248
+ put "/auth", @request_params, @auth_headers
249
+ assert_equal 200, response.status
250
+ end
251
+
252
+ test "Case sensitive attributes update" do
253
+ @resource_class.case_insensitive_keys = []
254
+ put "/auth", @request_params, @auth_headers
255
+ @data = JSON.parse(response.body)
256
+ @existing_user.reload
257
+ assert_equal @new_operating_thetan, @existing_user.operating_thetan
258
+ assert_equal @email, @existing_user.email
259
+ assert_equal @email, @existing_user.uid
260
+ end
261
+
262
+ test "Case insensitive attributes update" do
263
+ @resource_class.case_insensitive_keys = [:email]
264
+ put "/auth", @request_params, @auth_headers
265
+ @data = JSON.parse(response.body)
266
+ @existing_user.reload
267
+ assert_equal @new_operating_thetan, @existing_user.operating_thetan
268
+ assert_equal @email.downcase, @existing_user.email
269
+ assert_equal @email.downcase, @existing_user.uid
270
+ end
271
+ end
272
+
273
+ describe "error" do
274
+ before do
275
+ # test invalid update param
276
+ @new_operating_thetan = "blegh"
277
+ put "/auth", {
278
+ operating_thetan: @new_operating_thetan
279
+ }, @auth_headers
280
+
281
+ @data = JSON.parse(response.body)
282
+ @existing_user.reload
283
+ end
284
+
285
+ test "Request was NOT successful" do
286
+ assert_equal 403, response.status
287
+ end
288
+
289
+ test "Errors were provided with response" do
290
+ assert @data["errors"].length
291
+ end
292
+ end
293
+ end
294
+
295
+ describe "invalid user" do
296
+ before do
297
+ @existing_user = users(:confirmed_email_user)
298
+ @auth_headers = @existing_user.create_new_auth_token
299
+ @client_id = @auth_headers['client']
300
+
301
+ # ensure request is not treated as batch request
302
+ expire_token(@existing_user, @client_id)
303
+
304
+ # test valid update param
305
+ @new_operating_thetan = 3
306
+
307
+ put "/auth", {
308
+ operating_thetan: @new_operating_thetan
309
+ }, @auth_headers
310
+
311
+ @data = JSON.parse(response.body)
312
+ @existing_user.reload
313
+ end
314
+
315
+ test "Response should return 404 status" do
316
+ assert_equal 404, response.status
317
+ end
318
+
319
+ test "User should not be updated" do
320
+ refute_equal @new_operating_thetan, @existing_user.operating_thetan
321
+ end
322
+ end
323
+ end
324
+
325
+ describe "Ouath user has existing email" do
326
+ before do
327
+ @existing_user = users(:duplicate_email_facebook_user)
328
+
329
+ post "/auth", {
330
+ email: @existing_user.email,
331
+ password: "secret123",
332
+ password_confirmation: "secret123",
333
+ confirm_success_url: Faker::Internet.url
334
+ }
335
+
336
+ @resource = assigns(:resource)
337
+ @data = JSON.parse(response.body)
338
+ end
339
+
340
+ test "request should be successful" do
341
+ assert_equal 200, response.status
342
+ end
343
+
344
+ test "user should have been created" do
345
+ assert @resource.id
346
+ end
347
+
348
+ test "new user data should be returned as json" do
349
+ assert @data['data']['email']
350
+ end
351
+ end
352
+
353
+ describe "Alternate user class" do
354
+ before do
355
+ post "/mangs", {
356
+ email: Faker::Internet.email,
357
+ password: "secret123",
358
+ password_confirmation: "secret123",
359
+ confirm_success_url: Faker::Internet.url
360
+ }
361
+
362
+ @resource = assigns(:resource)
363
+ @data = JSON.parse(response.body)
364
+ @mail = ActionMailer::Base.deliveries.last
365
+ end
366
+
367
+ test "request should be successful" do
368
+ assert_equal 200, response.status
369
+ end
370
+
371
+ test "use should be a Mang" do
372
+ assert_equal "Mang", @resource.class.name
373
+ end
374
+
375
+ test "Mang should be destroyed" do
376
+ @auth_headers = @resource.create_new_auth_token
377
+ @client_id = @auth_headers['client']
378
+
379
+ # ensure request is not treated as batch request
380
+ age_token(@resource, @client_id)
381
+
382
+ delete "/mangs", {}, @auth_headers
383
+
384
+ assert_equal 200, response.status
385
+ refute Mang.where(id: @resource.id).first
386
+ end
387
+ end
388
+
389
+ describe "Passing client config name" do
390
+ before do
391
+ @config_name = 'altUser'
392
+
393
+ post "/mangs", {
394
+ email: Faker::Internet.email,
395
+ password: "secret123",
396
+ password_confirmation: "secret123",
397
+ confirm_success_url: Faker::Internet.url,
398
+ config_name: @config_name
399
+ }
400
+
401
+ @resource = assigns(:resource)
402
+ @data = JSON.parse(response.body)
403
+ @mail = ActionMailer::Base.deliveries.last
404
+
405
+ @resource.reload
406
+
407
+ @mail_reset_token = @mail.body.match(/confirmation_token=([^&]*)&/)[1]
408
+ @mail_redirect_url = CGI.unescape(@mail.body.match(/redirect_url=(.*)\"/)[1])
409
+ @mail_config_name = CGI.unescape(@mail.body.match(/config=([^&]*)&/)[1])
410
+ end
411
+
412
+ test 'config_name param is included in the confirmation email link' do
413
+ assert_equal @config_name, @mail_config_name
414
+ end
415
+ end
416
+
417
+ describe "Skipped confirmation" do
418
+ setup do
419
+ User.set_callback(:create, :before, :skip_confirmation!)
420
+
421
+ post "/auth", {
422
+ email: Faker::Internet.email,
423
+ password: "secret123",
424
+ password_confirmation: "secret123",
425
+ confirm_success_url: Faker::Internet.url
426
+ }
427
+
428
+ @resource = assigns(:resource)
429
+ @token = response.headers["access-token"]
430
+ @client_id = response.headers["client"]
431
+ end
432
+
433
+ teardown do
434
+ User.skip_callback(:create, :before, :skip_confirmation!)
435
+ end
436
+
437
+ test "user was created" do
438
+ assert @resource
439
+ end
440
+
441
+ test "user was confirmed" do
442
+ assert @resource.confirmed?
443
+ end
444
+
445
+ test "auth headers were returned in response" do
446
+ assert response.headers["access-token"]
447
+ assert response.headers["token-type"]
448
+ assert response.headers["client"]
449
+ assert response.headers["expiry"]
450
+ assert response.headers["uid"]
451
+ end
452
+
453
+ test "response token is valid" do
454
+ assert @resource.valid_token?(@token, @client_id)
455
+ end
456
+ end
457
+ end
458
+ end