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,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