cm-devise_token_auth 0.1.30.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 (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,67 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head>
4
+ <title>The change you wanted was rejected (422)</title>
5
+ <meta name="viewport" content="width=device-width,initial-scale=1">
6
+ <style>
7
+ body {
8
+ background-color: #EFEFEF;
9
+ color: #2E2F30;
10
+ text-align: center;
11
+ font-family: arial, sans-serif;
12
+ margin: 0;
13
+ }
14
+
15
+ div.dialog {
16
+ width: 95%;
17
+ max-width: 33em;
18
+ margin: 4em auto 0;
19
+ }
20
+
21
+ div.dialog > div {
22
+ border: 1px solid #CCC;
23
+ border-right-color: #999;
24
+ border-left-color: #999;
25
+ border-bottom-color: #BBB;
26
+ border-top: #B00100 solid 4px;
27
+ border-top-left-radius: 9px;
28
+ border-top-right-radius: 9px;
29
+ background-color: white;
30
+ padding: 7px 12% 0;
31
+ box-shadow: 0 3px 8px rgba(50, 50, 50, 0.17);
32
+ }
33
+
34
+ h1 {
35
+ font-size: 100%;
36
+ color: #730E15;
37
+ line-height: 1.5em;
38
+ }
39
+
40
+ div.dialog > p {
41
+ margin: 0 0 1em;
42
+ padding: 1em;
43
+ background-color: #F7F7F7;
44
+ border: 1px solid #CCC;
45
+ border-right-color: #999;
46
+ border-left-color: #999;
47
+ border-bottom-color: #999;
48
+ border-bottom-left-radius: 4px;
49
+ border-bottom-right-radius: 4px;
50
+ border-top-color: #DADADA;
51
+ color: #666;
52
+ box-shadow: 0 3px 8px rgba(50, 50, 50, 0.17);
53
+ }
54
+ </style>
55
+ </head>
56
+
57
+ <body>
58
+ <!-- This file lives in public/422.html -->
59
+ <div class="dialog">
60
+ <div>
61
+ <h1>The change you wanted was rejected.</h1>
62
+ <p>Maybe you tried to change something you didn't have access to.</p>
63
+ </div>
64
+ <p>If you are the application owner check the logs for more information.</p>
65
+ </div>
66
+ </body>
67
+ </html>
@@ -0,0 +1,66 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head>
4
+ <title>We're sorry, but something went wrong (500)</title>
5
+ <meta name="viewport" content="width=device-width,initial-scale=1">
6
+ <style>
7
+ body {
8
+ background-color: #EFEFEF;
9
+ color: #2E2F30;
10
+ text-align: center;
11
+ font-family: arial, sans-serif;
12
+ margin: 0;
13
+ }
14
+
15
+ div.dialog {
16
+ width: 95%;
17
+ max-width: 33em;
18
+ margin: 4em auto 0;
19
+ }
20
+
21
+ div.dialog > div {
22
+ border: 1px solid #CCC;
23
+ border-right-color: #999;
24
+ border-left-color: #999;
25
+ border-bottom-color: #BBB;
26
+ border-top: #B00100 solid 4px;
27
+ border-top-left-radius: 9px;
28
+ border-top-right-radius: 9px;
29
+ background-color: white;
30
+ padding: 7px 12% 0;
31
+ box-shadow: 0 3px 8px rgba(50, 50, 50, 0.17);
32
+ }
33
+
34
+ h1 {
35
+ font-size: 100%;
36
+ color: #730E15;
37
+ line-height: 1.5em;
38
+ }
39
+
40
+ div.dialog > p {
41
+ margin: 0 0 1em;
42
+ padding: 1em;
43
+ background-color: #F7F7F7;
44
+ border: 1px solid #CCC;
45
+ border-right-color: #999;
46
+ border-left-color: #999;
47
+ border-bottom-color: #999;
48
+ border-bottom-left-radius: 4px;
49
+ border-bottom-right-radius: 4px;
50
+ border-top-color: #DADADA;
51
+ color: #666;
52
+ box-shadow: 0 3px 8px rgba(50, 50, 50, 0.17);
53
+ }
54
+ </style>
55
+ </head>
56
+
57
+ <body>
58
+ <!-- This file lives in public/500.html -->
59
+ <div class="dialog">
60
+ <div>
61
+ <h1>We're sorry, but something went wrong.</h1>
62
+ </div>
63
+ <p>If you are the application owner check the logs for more information.</p>
64
+ </div>
65
+ </body>
66
+ </html>
File without changes
@@ -0,0 +1,29 @@
1
+ <% timestamp = DateTime.parse(2.weeks.ago.to_s).to_time.strftime("%F %T") %>
2
+ <% @email = Faker::Internet.email %>
3
+ confirmed_email_user:
4
+ uid: "<%= @email %>"
5
+ email: "<%= @email %>"
6
+ provider: 'email'
7
+ confirmed_at: '<%= timestamp %>'
8
+ created_at: '<%= timestamp %>'
9
+ updated_at: '<%= timestamp %>'
10
+ encrypted_password: <%= User.new.send(:password_digest, 'secret123') %>
11
+
12
+ <% @fb_email = Faker::Internet.email %>
13
+ duplicate_email_facebook_user:
14
+ uid: "<%= Faker::Number.number(10) %>"
15
+ email: "<%= @fb_email %>"
16
+ provider: 'facebook'
17
+ created_at: '<%= timestamp %>'
18
+ updated_at: '<%= timestamp %>'
19
+ confirmed_at: '<%= timestamp %>'
20
+ encrypted_password: <%= User.new.send(:password_digest, 'secret123') %>
21
+
22
+ <% @unconfirmed_email = Faker::Internet.email %>
23
+ unconfirmed_email_user:
24
+ uid: "<%= @unconfirmed_email %>"
25
+ email: "<%= @unconfirmed_email %>"
26
+ provider: 'email'
27
+ created_at: '<%= timestamp %>'
28
+ updated_at: '<%= timestamp %>'
29
+ encrypted_password: <%= User.new.send(:password_digest, 'secret123') %>
@@ -0,0 +1,29 @@
1
+ <% timestamp = DateTime.parse(2.weeks.ago.to_s).to_time.strftime("%F %T") %>
2
+ <% @email = Faker::Internet.email %>
3
+ confirmed_email_user:
4
+ uid: "<%= @email %>"
5
+ email: "<%= @email %>"
6
+ provider: 'email'
7
+ confirmed_at: '<%= timestamp %>'
8
+ created_at: '<%= timestamp %>'
9
+ updated_at: '<%= timestamp %>'
10
+ encrypted_password: <%= Mang.new.send(:password_digest, 'secret123') %>
11
+
12
+ <% @fb_email = Faker::Internet.email %>
13
+ duplicate_email_facebook_user:
14
+ uid: "<%= Faker::Number.number(10) %>"
15
+ email: "<%= @fb_email %>"
16
+ provider: 'facebook'
17
+ created_at: '<%= timestamp %>'
18
+ updated_at: '<%= timestamp %>'
19
+ confirmed_at: '<%= timestamp %>'
20
+ encrypted_password: <%= Mang.new.send(:password_digest, 'secret123') %>
21
+
22
+ <% @unconfirmed_email = Faker::Internet.email %>
23
+ unconfirmed_email_user:
24
+ uid: "<%= @unconfirmed_email %>"
25
+ email: "<%= @unconfirmed_email %>"
26
+ provider: 'email'
27
+ created_at: '<%= timestamp %>'
28
+ updated_at: '<%= timestamp %>'
29
+ encrypted_password: <%= Mang.new.send(:password_digest, 'secret123') %>
@@ -0,0 +1,29 @@
1
+ <% timestamp = DateTime.parse(2.weeks.ago.to_s).to_time.strftime("%F %T") %>
2
+ <% @email = Faker::Internet.email %>
3
+ confirmed_email_user:
4
+ uid: "<%= @email %>"
5
+ email: "<%= @email %>"
6
+ provider: 'email'
7
+ confirmed_at: '<%= timestamp %>'
8
+ created_at: '<%= timestamp %>'
9
+ updated_at: '<%= timestamp %>'
10
+ encrypted_password: <%= User.new.send(:password_digest, 'secret123') %>
11
+
12
+ <% @fb_email = Faker::Internet.email %>
13
+ duplicate_email_facebook_user:
14
+ uid: "<%= Faker::Number.number(10) %>"
15
+ email: "<%= @fb_email %>"
16
+ provider: 'facebook'
17
+ created_at: '<%= timestamp %>'
18
+ updated_at: '<%= timestamp %>'
19
+ confirmed_at: '<%= timestamp %>'
20
+ encrypted_password: <%= User.new.send(:password_digest, 'secret123') %>
21
+
22
+ <% @unconfirmed_email = Faker::Internet.email %>
23
+ unconfirmed_email_user:
24
+ uid: "<%= @unconfirmed_email %>"
25
+ email: "<%= @unconfirmed_email %>"
26
+ provider: 'email'
27
+ created_at: '<%= timestamp %>'
28
+ updated_at: '<%= timestamp %>'
29
+ encrypted_password: <%= User.new.send(:password_digest, 'secret123') %>
@@ -0,0 +1,10 @@
1
+ require 'test_helper'
2
+
3
+ class NavigationTest < ActionDispatch::IntegrationTest
4
+ fixtures :all
5
+
6
+ # test "the truth" do
7
+ # assert true
8
+ # end
9
+ end
10
+
@@ -0,0 +1,178 @@
1
+ require 'test_helper'
2
+ require 'fileutils'
3
+ require 'generators/devise_token_auth/install_generator'
4
+
5
+ module DeviseTokenAuth
6
+ class InstallGeneratorTest < Rails::Generators::TestCase
7
+ tests InstallGenerator
8
+ destination Rails.root.join('tmp/generators')
9
+
10
+ describe 'default values, clean install' do
11
+ setup :prepare_destination
12
+
13
+ before do
14
+ run_generator
15
+ end
16
+
17
+ test 'user model is created, concern is included' do
18
+ assert_file 'app/models/user.rb' do |model|
19
+ assert_match(/include DeviseTokenAuth::Concerns::User/, model)
20
+ end
21
+ end
22
+
23
+ test 'initializer is created' do
24
+ assert_file 'config/initializers/devise_token_auth.rb'
25
+ end
26
+
27
+ test 'migration is created' do
28
+ assert_migration 'db/migrate/devise_token_auth_create_users.rb'
29
+ end
30
+
31
+ test 'subsequent runs raise no errors' do
32
+ run_generator
33
+ end
34
+ end
35
+
36
+ describe 'existing user model' do
37
+ setup :prepare_destination
38
+
39
+ before do
40
+ @dir = File.join(destination_root, "app", "models")
41
+
42
+ @fname = File.join(@dir, "user.rb")
43
+
44
+ # make dir if not exists
45
+ FileUtils.mkdir_p(@dir)
46
+
47
+ @f = File.open(@fname, 'w') {|f|
48
+ f.write <<-RUBY
49
+ class User < ActiveRecord::Base
50
+
51
+ def whatever
52
+ puts 'whatever'
53
+ end
54
+ end
55
+ RUBY
56
+ }
57
+
58
+ run_generator
59
+ end
60
+
61
+ test 'user concern is injected into existing model' do
62
+ assert_file 'app/models/user.rb' do |model|
63
+ assert_match(/include DeviseTokenAuth::Concerns::User/, model)
64
+ end
65
+ end
66
+
67
+ test 'subsequent runs do not modify file' do
68
+ run_generator
69
+ assert_file 'app/models/user.rb' do |model|
70
+ matches = model.scan(/include DeviseTokenAuth::Concerns::User/m).size
71
+ assert_equal 1, matches
72
+ end
73
+ end
74
+ end
75
+
76
+
77
+ describe 'routes' do
78
+ setup :prepare_destination
79
+
80
+ before do
81
+ @dir = File.join(destination_root, "config")
82
+
83
+ @fname = File.join(@dir, "routes.rb")
84
+
85
+ # make dir if not exists
86
+ FileUtils.mkdir_p(@dir)
87
+
88
+ @f = File.open(@fname, 'w') {|f|
89
+ f.write <<-RUBY
90
+ Rails.application.routes.draw do
91
+ patch '/chong', to: 'bong#index'
92
+ end
93
+ RUBY
94
+ }
95
+
96
+ run_generator
97
+ end
98
+
99
+ test 'route method is appended to routes file' do
100
+ assert_file 'config/routes.rb' do |routes|
101
+ assert_match(/mount_devise_token_auth_for 'User', at: '\/auth'/, routes)
102
+ end
103
+ end
104
+
105
+ test 'subsequent runs do not modify file' do
106
+ run_generator
107
+ assert_file 'config/routes.rb' do |routes|
108
+ matches = routes.scan(/mount_devise_token_auth_for 'User', at: '\/auth'/m).size
109
+ assert_equal 1, matches
110
+ end
111
+ end
112
+
113
+ describe 'subsequent models' do
114
+ before do
115
+ run_generator %w(Mang /mangs)
116
+ end
117
+
118
+ test 'migration is created' do
119
+ assert_migration 'db/migrate/devise_token_auth_create_mangs.rb'
120
+ end
121
+
122
+ test 'route method is appended to routes file' do
123
+ assert_file 'config/routes.rb' do |routes|
124
+ assert_match(/mount_devise_token_auth_for 'Mang', at: '\/mangs'/, routes)
125
+ end
126
+ end
127
+
128
+ test 'devise_for block is appended to routes file' do
129
+ assert_file 'config/routes.rb' do |routes|
130
+ assert_match(/as :mang do/, routes)
131
+ assert_match(/# Define routes for Mang within this block./, routes)
132
+ end
133
+ end
134
+ end
135
+ end
136
+
137
+ describe 'application controller' do
138
+ setup :prepare_destination
139
+
140
+ before do
141
+ @dir = File.join(destination_root, "app", "controllers")
142
+
143
+ @fname = File.join(@dir, "application_controller.rb")
144
+
145
+ # make dir if not exists
146
+ FileUtils.mkdir_p(@dir)
147
+
148
+ @f = File.open(@fname, 'w') {|f|
149
+ f.write <<-RUBY
150
+ class ApplicationController < ActionController::Base
151
+ respond_to :json
152
+
153
+ def whatever
154
+ 'whatever'
155
+ end
156
+ end
157
+ RUBY
158
+ }
159
+
160
+ run_generator
161
+ end
162
+
163
+ test 'controller concern is appended to application controller' do
164
+ assert_file 'app/controllers/application_controller.rb' do |controller|
165
+ assert_match(/include DeviseTokenAuth::Concerns::SetUserByToken/, controller)
166
+ end
167
+ end
168
+
169
+ test 'subsequent runs do not modify file' do
170
+ run_generator
171
+ assert_file 'app/controllers/application_controller.rb' do |controller|
172
+ matches = controller.scan(/include DeviseTokenAuth::Concerns::SetUserByToken/m).size
173
+ assert_equal 1, matches
174
+ end
175
+ end
176
+ end
177
+ end
178
+ end
@@ -0,0 +1,23 @@
1
+ require 'test_helper'
2
+ require 'fileutils'
3
+ require 'generators/devise_token_auth/install_views_generator'
4
+
5
+ module DeviseTokenAuth
6
+ class InstallViewsGeneratorTest < Rails::Generators::TestCase
7
+ tests InstallViewsGenerator
8
+ destination Rails.root.join('tmp/generators')
9
+
10
+ describe 'default values, clean install' do
11
+ setup :prepare_destination
12
+
13
+ before do
14
+ run_generator
15
+ end
16
+
17
+ test "files are copied" do
18
+ assert_file 'app/views/devise/mailer/reset_password_instructions.html.erb'
19
+ assert_file 'app/views/devise/mailer/confirmation_instructions.html.erb'
20
+ end
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,90 @@
1
+ require 'test_helper'
2
+
3
+ class UserTest < ActiveSupport::TestCase
4
+ describe User do
5
+ before do
6
+ @password = Faker::Internet.password(10, 20)
7
+ @email = Faker::Internet.email
8
+ @success_url = Faker::Internet.url
9
+ @resource = User.new()
10
+ end
11
+
12
+ describe 'serialization' do
13
+ test 'hash should not include sensitive info' do
14
+ refute @resource.as_json[:tokens]
15
+ end
16
+ end
17
+
18
+ describe 'creation' do
19
+ test 'save fails if uid is missing' do
20
+ @resource.uid = nil
21
+ @resource.save
22
+
23
+ assert @resource.errors.messages[:uid]
24
+ end
25
+ end
26
+
27
+ describe 'email registration' do
28
+ test 'model should not save if email is blank' do
29
+ @resource.provider = 'email'
30
+ @resource.password = @password
31
+ @resource.password_confirmation = @password
32
+
33
+ refute @resource.save
34
+ assert @resource.errors.messages[:email]
35
+ end
36
+ end
37
+
38
+ describe 'oauth2 authentication' do
39
+ test 'model should save even if email is blank' do
40
+ @resource.provider = 'facebook'
41
+ @resource.uid = 123
42
+ @resource.password = @password
43
+ @resource.password_confirmation = @password
44
+
45
+ assert @resource.save
46
+ refute @resource.errors.messages[:email]
47
+ end
48
+ end
49
+
50
+ describe 'token expiry' do
51
+ before do
52
+ @resource = users(:confirmed_email_user)
53
+ @resource.skip_confirmation!
54
+ @resource.save!
55
+
56
+ @auth_headers = @resource.create_new_auth_token
57
+
58
+ @token = @auth_headers['access-token']
59
+ @client_id = @auth_headers['client']
60
+ end
61
+
62
+ test 'should properly indicate whether token is current' do
63
+ assert @resource.token_is_current?(@token, @client_id)
64
+ # we want to update the expiry without forcing a cleanup (see below)
65
+ @resource.tokens[@client_id]['expiry'] = Time.now.to_i - 10.seconds
66
+ refute @resource.token_is_current?(@token, @client_id)
67
+ end
68
+ end
69
+
70
+ describe 'expired tokens are destroyed on save' do
71
+ before do
72
+ @resource = users(:confirmed_email_user)
73
+ @resource.skip_confirmation!
74
+ @resource.save!
75
+
76
+ @old_auth_headers = @resource.create_new_auth_token
77
+ @new_auth_headers = @resource.create_new_auth_token
78
+ expire_token(@resource, @old_auth_headers['client'])
79
+ end
80
+
81
+ test 'expired token was removed' do
82
+ refute @resource.tokens[@old_auth_headers['client']]
83
+ end
84
+
85
+ test 'current token was not removed' do
86
+ assert @resource.tokens[@new_auth_headers['client']]
87
+ end
88
+ end
89
+ end
90
+ end