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.
- checksums.yaml +7 -0
- data/LICENSE +13 -0
- data/README.md +688 -0
- data/Rakefile +34 -0
- data/app/controllers/devise_token_auth/application_controller.rb +17 -0
- data/app/controllers/devise_token_auth/concerns/set_user_by_token.rb +109 -0
- data/app/controllers/devise_token_auth/confirmations_controller.rb +31 -0
- data/app/controllers/devise_token_auth/omniauth_callbacks_controller.rb +171 -0
- data/app/controllers/devise_token_auth/passwords_controller.rb +155 -0
- data/app/controllers/devise_token_auth/registrations_controller.rb +123 -0
- data/app/controllers/devise_token_auth/sessions_controller.rb +98 -0
- data/app/controllers/devise_token_auth/token_validations_controller.rb +23 -0
- data/app/models/devise_token_auth/concerns/user.rb +231 -0
- data/app/views/devise/mailer/confirmation_instructions.html.erb +5 -0
- data/app/views/devise/mailer/reset_password_instructions.html.erb +8 -0
- data/app/views/devise/mailer/unlock_instructions.html.erb +7 -0
- data/app/views/devise_token_auth/omniauth_failure.html.erb +2 -0
- data/app/views/devise_token_auth/omniauth_success.html.erb +8 -0
- data/app/views/layouts/omniauth_response.html.erb +31 -0
- data/config/initializers/devise.rb +203 -0
- data/config/locales/devise.en.yml +59 -0
- data/config/routes.rb +5 -0
- data/lib/devise_token_auth.rb +7 -0
- data/lib/devise_token_auth/controllers/helpers.rb +129 -0
- data/lib/devise_token_auth/controllers/url_helpers.rb +8 -0
- data/lib/devise_token_auth/engine.rb +25 -0
- data/lib/devise_token_auth/rails/routes.rb +65 -0
- data/lib/devise_token_auth/version.rb +3 -0
- data/lib/generators/devise_token_auth/USAGE +31 -0
- data/lib/generators/devise_token_auth/install_generator.rb +115 -0
- data/lib/generators/devise_token_auth/install_views_generator.rb +16 -0
- data/lib/generators/devise_token_auth/templates/devise_token_auth.rb +22 -0
- data/lib/generators/devise_token_auth/templates/devise_token_auth_create_users.rb.erb +54 -0
- data/lib/generators/devise_token_auth/templates/user.rb +3 -0
- data/lib/tasks/devise_token_auth_tasks.rake +4 -0
- data/test/controllers/demo_group_controller_test.rb +126 -0
- data/test/controllers/demo_mang_controller_test.rb +263 -0
- data/test/controllers/demo_user_controller_test.rb +262 -0
- data/test/controllers/devise_token_auth/confirmations_controller_test.rb +107 -0
- data/test/controllers/devise_token_auth/omniauth_callbacks_controller_test.rb +167 -0
- data/test/controllers/devise_token_auth/passwords_controller_test.rb +287 -0
- data/test/controllers/devise_token_auth/registrations_controller_test.rb +458 -0
- data/test/controllers/devise_token_auth/sessions_controller_test.rb +221 -0
- data/test/controllers/overrides/confirmations_controller_test.rb +44 -0
- data/test/controllers/overrides/omniauth_callbacks_controller_test.rb +44 -0
- data/test/controllers/overrides/passwords_controller_test.rb +62 -0
- data/test/controllers/overrides/registrations_controller_test.rb +40 -0
- data/test/controllers/overrides/sessions_controller_test.rb +33 -0
- data/test/controllers/overrides/token_validations_controller_test.rb +38 -0
- data/test/dummy/README.rdoc +28 -0
- data/test/dummy/Rakefile +6 -0
- data/test/dummy/app/assets/images/logo.jpg +0 -0
- data/test/dummy/app/assets/images/omniauth-provider-settings.png +0 -0
- data/test/dummy/app/assets/javascripts/application.js +13 -0
- data/test/dummy/app/assets/stylesheets/application.css +15 -0
- data/test/dummy/app/controllers/application_controller.rb +16 -0
- data/test/dummy/app/controllers/demo_group_controller.rb +13 -0
- data/test/dummy/app/controllers/demo_mang_controller.rb +12 -0
- data/test/dummy/app/controllers/demo_user_controller.rb +12 -0
- data/test/dummy/app/controllers/overrides/confirmations_controller.rb +32 -0
- data/test/dummy/app/controllers/overrides/omniauth_callbacks_controller.rb +14 -0
- data/test/dummy/app/controllers/overrides/passwords_controller.rb +39 -0
- data/test/dummy/app/controllers/overrides/registrations_controller.rb +27 -0
- data/test/dummy/app/controllers/overrides/sessions_controller.rb +43 -0
- data/test/dummy/app/controllers/overrides/token_validations_controller.rb +23 -0
- data/test/dummy/app/helpers/application_helper.rb +1065 -0
- data/test/dummy/app/models/evil_user.rb +3 -0
- data/test/dummy/app/models/mang.rb +3 -0
- data/test/dummy/app/models/user.rb +18 -0
- data/test/dummy/app/views/layouts/application.html.erb +14 -0
- data/test/dummy/bin/bundle +3 -0
- data/test/dummy/bin/rails +8 -0
- data/test/dummy/bin/rake +8 -0
- data/test/dummy/bin/spring +18 -0
- data/test/dummy/config.ru +16 -0
- data/test/dummy/config/application.rb +23 -0
- data/test/dummy/config/application.yml.bk +0 -0
- data/test/dummy/config/boot.rb +5 -0
- data/test/dummy/config/database.yml +31 -0
- data/test/dummy/config/environment.rb +5 -0
- data/test/dummy/config/environments/development.rb +44 -0
- data/test/dummy/config/environments/production.rb +82 -0
- data/test/dummy/config/environments/test.rb +40 -0
- data/test/dummy/config/initializers/assets.rb +8 -0
- data/test/dummy/config/initializers/backtrace_silencers.rb +7 -0
- data/test/dummy/config/initializers/cookies_serializer.rb +3 -0
- data/test/dummy/config/initializers/devise_token_auth.rb +22 -0
- data/test/dummy/config/initializers/figaro.rb +1 -0
- data/test/dummy/config/initializers/filter_parameter_logging.rb +4 -0
- data/test/dummy/config/initializers/inflections.rb +16 -0
- data/test/dummy/config/initializers/mime_types.rb +4 -0
- data/test/dummy/config/initializers/omniauth.rb +8 -0
- data/test/dummy/config/initializers/session_store.rb +3 -0
- data/test/dummy/config/initializers/wrap_parameters.rb +14 -0
- data/test/dummy/config/locales/en.yml +23 -0
- data/test/dummy/config/routes.rb +30 -0
- data/test/dummy/config/secrets.yml +22 -0
- data/test/dummy/config/spring.rb +1 -0
- data/test/dummy/db/migrate/20140715061447_devise_token_auth_create_users.rb +56 -0
- data/test/dummy/db/migrate/20140715061805_devise_token_auth_create_mangs.rb +56 -0
- data/test/dummy/db/migrate/20140829044006_add_operating_thetan_to_user.rb +6 -0
- data/test/dummy/db/migrate/20140916224624_add_favorite_color_to_mangs.rb +5 -0
- data/test/dummy/db/migrate/20140928231203_devise_token_auth_create_evil_users.rb +57 -0
- data/test/dummy/db/schema.rb +114 -0
- data/test/dummy/public/404.html +67 -0
- data/test/dummy/public/422.html +67 -0
- data/test/dummy/public/500.html +66 -0
- data/test/dummy/public/favicon.ico +0 -0
- data/test/fixtures/evil_users.yml +29 -0
- data/test/fixtures/mangs.yml +29 -0
- data/test/fixtures/users.yml +29 -0
- data/test/integration/navigation_test.rb +10 -0
- data/test/lib/generators/devise_token_auth/install_generator_test.rb +178 -0
- data/test/lib/generators/devise_token_auth/install_views_generator_test.rb +23 -0
- data/test/models/user_test.rb +90 -0
- data/test/test_helper.rb +60 -0
- 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,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
|