auth0 3.6.1 → 4.0.0

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 (85) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +4 -0
  3. data/.rubocop.yml +7 -0
  4. data/.rubocop_todo.yml +7 -0
  5. data/.travis.yml +12 -7
  6. data/CHANGELOG.md +10 -0
  7. data/Gemfile +4 -2
  8. data/Guardfile +13 -10
  9. data/LICENSE +2 -2
  10. data/README.md +9 -11
  11. data/Rakefile +33 -7
  12. data/auth0.gemspec +12 -12
  13. data/deploy_documentation.sh +29 -0
  14. data/doc_config/templates/default/fulldoc/html/css/full_list.css +79 -0
  15. data/doc_config/templates/default/fulldoc/html/css/style.css +546 -0
  16. data/doc_config/templates/default/layout/html/breadcrumb.erb +11 -0
  17. data/doc_config/templates/default/layout/html/footer.erb +115 -0
  18. data/doc_config/templates/default/layout/html/headers.erb +17 -0
  19. data/doc_config/templates/default/layout/html/layout.erb +27 -0
  20. data/lib/auth0.rb +5 -5
  21. data/lib/auth0/api/authentication_endpoints.rb +264 -46
  22. data/lib/auth0/api/v1.rb +5 -5
  23. data/lib/auth0/api/v1/clients.rb +7 -7
  24. data/lib/auth0/api/v1/connections.rb +9 -10
  25. data/lib/auth0/api/v1/logs.rb +9 -16
  26. data/lib/auth0/api/v1/rules.rb +5 -5
  27. data/lib/auth0/api/v1/users.rb +28 -27
  28. data/lib/auth0/api/v2.rb +17 -9
  29. data/lib/auth0/api/v2/blacklists.rb +30 -9
  30. data/lib/auth0/api/v2/clients.rb +60 -19
  31. data/lib/auth0/api/v2/connections.rb +63 -10
  32. data/lib/auth0/api/v2/emails.rb +58 -0
  33. data/lib/auth0/api/v2/jobs.rb +44 -7
  34. data/lib/auth0/api/v2/rules.rb +104 -0
  35. data/lib/auth0/api/v2/stats.rb +22 -5
  36. data/lib/auth0/api/v2/tenants.rb +39 -0
  37. data/lib/auth0/api/v2/tickets.rb +58 -0
  38. data/lib/auth0/api/v2/users.rb +128 -39
  39. data/lib/auth0/client.rb +8 -6
  40. data/lib/auth0/exception.rb +29 -23
  41. data/lib/auth0/mixins.rb +12 -10
  42. data/lib/auth0/mixins/httparty_proxy.rb +13 -10
  43. data/lib/auth0/mixins/initializer.rb +25 -27
  44. data/lib/auth0/version.rb +2 -2
  45. data/spec/integration/lib/auth0/api/v1/api_clients_spec.rb +2 -4
  46. data/spec/integration/lib/auth0/api/v1/api_users_spec.rb +25 -32
  47. data/spec/integration/lib/auth0/api/v2/api_blacklist_spec.rb +14 -0
  48. data/spec/integration/lib/auth0/api/v2/api_clients_spec.rb +61 -6
  49. data/spec/integration/lib/auth0/api/v2/api_connections_spec.rb +68 -42
  50. data/spec/integration/lib/auth0/api/v2/api_email_spec.rb +71 -0
  51. data/spec/integration/lib/auth0/api/v2/api_jobs_spec.rb +69 -0
  52. data/spec/integration/lib/auth0/api/v2/api_rules_spec.rb +83 -0
  53. data/spec/integration/lib/auth0/api/v2/api_stats_spec.rb +16 -0
  54. data/spec/integration/lib/auth0/api/v2/api_tenants_spec.rb +37 -0
  55. data/spec/integration/lib/auth0/api/v2/api_tickets_spec.rb +33 -0
  56. data/spec/integration/lib/auth0/api/v2/api_users_spec.rb +88 -36
  57. data/spec/integration/lib/auth0/auth0_client_spec.rb +43 -35
  58. data/spec/lib/auth0/api/authentication_endpoints_spec.rb +253 -47
  59. data/spec/lib/auth0/api/v1/clients_spec.rb +37 -38
  60. data/spec/lib/auth0/api/v1/connections_spec.rb +44 -38
  61. data/spec/lib/auth0/api/v1/logs_spec.rb +24 -24
  62. data/spec/lib/auth0/api/v1/rules_spec.rb +23 -22
  63. data/spec/lib/auth0/api/v1/users_spec.rb +153 -130
  64. data/spec/lib/auth0/api/v2/blacklists_spec.rb +12 -11
  65. data/spec/lib/auth0/api/v2/clients_spec.rb +38 -33
  66. data/spec/lib/auth0/api/v2/connections_spec.rb +59 -34
  67. data/spec/lib/auth0/api/v2/emails_spec.rb +47 -0
  68. data/spec/lib/auth0/api/v2/jobs_spec.rb +24 -10
  69. data/spec/lib/auth0/api/v2/rules_spec.rb +69 -0
  70. data/spec/lib/auth0/api/v2/stats_spec.rb +11 -11
  71. data/spec/lib/auth0/api/v2/tenants_spec.rb +25 -0
  72. data/spec/lib/auth0/api/v2/tickets_spec.rb +31 -0
  73. data/spec/lib/auth0/api/v2/users_spec.rb +101 -39
  74. data/spec/lib/auth0/client_spec.rb +46 -58
  75. data/spec/lib/auth0/mixins/httparty_proxy_spec.rb +98 -69
  76. data/spec/lib/auth0/mixins/initializer_spec.rb +2 -2
  77. data/spec/spec_helper.rb +2 -2
  78. data/spec/spec_helper_full.rb +16 -15
  79. data/spec/spec_helper_unit.rb +5 -5
  80. data/spec/support/credentials.rb +9 -3
  81. data/spec/support/dummy_class.rb +7 -1
  82. data/spec/support/dummy_class_for_proxy.rb +2 -2
  83. data/spec/support/import_users.json +13 -0
  84. data/spec/support/stub_response.rb +1 -2
  85. metadata +78 -41
@@ -0,0 +1,83 @@
1
+ require 'spec_helper'
2
+ describe Auth0::Api::V2::Rules do
3
+ attr_reader :client, :enabled_rule, :disabled_rule
4
+
5
+ before(:all) do
6
+ @client = Auth0Client.new(v2_creds)
7
+ suffix = Faker::Lorem.word
8
+ script = 'function (user, context, callback) { callback(null, user, context);}'
9
+ stage = 'login_success'
10
+ @enabled_rule = client.create_rule("Enabled Rule #{suffix}", script, rand(1..10), true, stage)
11
+ @disabled_rule = client.create_rule("Disabled Rule #{suffix}", script, rand(11..20), false, stage)
12
+ end
13
+
14
+ after(:all) do
15
+ rules = client.rules
16
+ rules.each do |rule|
17
+ client.delete_rule(rule['id'])
18
+ end
19
+ end
20
+
21
+ describe '.rules' do
22
+ let(:rules) { client.rules }
23
+
24
+ it { expect(rules.size).to be > 0 }
25
+
26
+ context '#filters' do
27
+ it do
28
+ expect(client.rules(enabled: true).size).to be 1
29
+ end
30
+
31
+ it do
32
+ expect(client.rules(enabled: false).size).to be 1
33
+ end
34
+
35
+ it do
36
+ expect(client.rules(enabled: true, fields: [:script, :order].join(',')).first).to(include('script', 'order'))
37
+ end
38
+ it do
39
+ expect(client.rules(enabled: true, fields: [:script].join(',')).first).to_not(include('order', 'name'))
40
+ end
41
+ end
42
+ end
43
+
44
+ describe '.rule' do
45
+ it do
46
+ expect(client.rule(enabled_rule['id'])).to(
47
+ include('stage' => enabled_rule['stage'], 'order' => enabled_rule['order'], 'script' => enabled_rule['script']))
48
+ end
49
+
50
+ context '#filters' do
51
+ let(:rule_include) { client.rule(enabled_rule['id'], fields: [:stage, :order, :script].join(',')) }
52
+ let(:rule_not_include) { client.rule(enabled_rule['id'], fields: :stage, include_fields: false) }
53
+
54
+ it do
55
+ expect(rule_include).to(include('stage', 'order', 'script'))
56
+ end
57
+
58
+ it do
59
+ expect(rule_not_include).to(include('order', 'script'))
60
+ expect(rule_not_include).to_not(include('stage'))
61
+ end
62
+ end
63
+ end
64
+
65
+ describe '.create_rule' do
66
+ let(:name) { Faker::Lorem.word }
67
+ let(:order) { rand(21..30) }
68
+ let(:stage) { 'login_success' }
69
+ let(:script) { 'function(test)' }
70
+ let(:enabled) { false }
71
+ let!(:rule) { client.create_rule(name, script, order, enabled, stage) }
72
+ it { expect(rule).to include('name' => name, 'stage' => stage, 'order' => order, 'script' => script) }
73
+ end
74
+
75
+ describe '.delete_rule' do
76
+ it { expect { client.delete_rule(enabled_rule['id']) }.to_not raise_error }
77
+ it { expect { client.delete_rule '' }.to raise_error(Auth0::InvalidParameter) }
78
+ end
79
+
80
+ describe '.update_rule' do
81
+ it { expect(client.update_rule(disabled_rule['id'], enabled: true)).to(include('enabled' => true)) }
82
+ end
83
+ end
@@ -0,0 +1,16 @@
1
+ require 'spec_helper'
2
+ describe Auth0::Api::V2::Stats do
3
+ let(:client) { Auth0Client.new(v2_creds) }
4
+
5
+ describe '.active_users' do
6
+ it { expect(Integer(client.active_users)).to be >= 0 }
7
+ end
8
+
9
+ # rubocop:disable Date
10
+ describe '.daily_stats' do
11
+ let(:from) { Date.today.prev_day.strftime('%Y%m%d') }
12
+ let(:to) { Date.today.strftime('%Y%m%d') }
13
+ let(:daily_stats) { client.daily_stats(from, to) }
14
+ it { expect(daily_stats.size).to be > 0 }
15
+ end
16
+ end
@@ -0,0 +1,37 @@
1
+ require 'spec_helper'
2
+ describe Auth0::Api::V2::Tenants do
3
+ attr_reader :client, :body
4
+
5
+ before(:all) do
6
+ @client = Auth0Client.new(v2_creds)
7
+ @body = {
8
+ 'error_page' => {
9
+ 'html' => '',
10
+ 'show_log_link' => false,
11
+ 'url' => 'https://mycompany.org/error'
12
+ },
13
+ 'friendly_name' => 'My Company',
14
+ 'picture_url' => 'https://mycompany.org/logo.png',
15
+ 'support_email' => 'support@mycompany.org',
16
+ 'support_url' => 'https://mycompany.org/support'
17
+ }
18
+
19
+ client.update_tenant_settings(body)
20
+ end
21
+
22
+ describe '.get_tenant_settings' do
23
+ it { expect(client.get_tenant_settings).to include(body) }
24
+
25
+ let(:tenant_setting_fields) { client.get_tenant_settings(fields: 'picture_url') }
26
+ it { expect(tenant_setting_fields).to_not include('friendly_name' => 'My Company') }
27
+ it { expect(tenant_setting_fields).to include('picture_url' => 'https://mycompany.org/logo.png') }
28
+ end
29
+
30
+ describe '.update_tenant_settings' do
31
+ let(:tenant_name) { Faker::Company.name }
32
+ let(:body_tenant) do
33
+ { 'friendly_name' => tenant_name }
34
+ end
35
+ it { expect(client.update_tenant_settings(body_tenant)['friendly_name']).to include(tenant_name) }
36
+ end
37
+ end
@@ -0,0 +1,33 @@
1
+ require 'spec_helper'
2
+ describe Auth0::Api::V2::Tickets do
3
+ attr_reader :client, :user
4
+
5
+ before(:all) do
6
+ @client = Auth0Client.new(v2_creds)
7
+ username = Faker::Internet.user_name
8
+ email = "#{entity_suffix}#{Faker::Internet.safe_email(username)}"
9
+ password = Faker::Internet.password
10
+ @user = client.create_user(username, 'email' => email,
11
+ 'password' => password,
12
+ 'email_verified' => false,
13
+ 'connection' => Auth0::Api::AuthenticationEndpoints::UP_AUTH,
14
+ 'app_metadata' => {})
15
+ end
16
+
17
+ after(:all) do
18
+ client.delete_user(user['user_id'])
19
+ end
20
+
21
+ describe '.post_email_verification' do
22
+ let(:email_verification) { client.post_email_verification(user['user_id'], result_url: 'http://myapp.com/callback') }
23
+ it { expect(email_verification).to include('ticket') }
24
+ end
25
+
26
+ describe '.post_password_change' do
27
+ let(:password_change) do
28
+ client.post_password_change('secret', user_id: user['user_id'],
29
+ result_url: 'http://myapp.com/callback')
30
+ end
31
+ it { expect(password_change).to include('ticket') }
32
+ end
33
+ end
@@ -1,68 +1,120 @@
1
- require "spec_helper"
1
+ require 'spec_helper'
2
2
  describe Auth0::Api::V2::Users do
3
-
4
3
  let(:client) { Auth0Client.new(v2_creds) }
5
4
  let(:username) { Faker::Internet.user_name }
6
5
  let(:email) { "#{entity_suffix}#{Faker::Internet.safe_email(username)}" }
7
6
  let(:password) { Faker::Internet.password }
8
- let(:connection) { "Username-Password-Authentication" }
9
- let!(:user) { client.create_user(username, {
10
- "email" => email,
11
- "password" => password,
12
- "email_verified" => false,
13
- "connection" => connection,
14
- "app_metadata" => {}
15
- })}
7
+ let!(:user) do
8
+ client.create_user(username, 'email' => email,
9
+ 'password' => password,
10
+ 'email_verified' => false,
11
+ 'connection' => Auth0::Api::AuthenticationEndpoints::UP_AUTH,
12
+ 'app_metadata' => {})
13
+ end
16
14
 
17
15
  describe '.users' do
18
-
19
- let(:users) { client.users() }
16
+ let(:users) { client.users }
20
17
 
21
18
  it { expect(users.size).to be > 0 }
22
19
 
23
- context "#filters" do
20
+ context '#filters' do
24
21
  it { expect(client.users(per_page: 1).size).to be 1 }
25
- it { expect(client.users(per_page: 1, fields: [:picture, :email, :user_id].join(',')).first).to include("email", "user_id", "picture") }
26
- it { expect(client.users(per_page: 1, fields: [:email].join(',')).first).to_not include("user_id", "picture") }
22
+ it do
23
+ expect(
24
+ client.users(per_page: 1, fields: [:picture, :email, :user_id].join(','), include_fields: true).first
25
+ ).to(include('email', 'user_id', 'picture'))
26
+ end
27
+ it { expect(client.users(per_page: 1, fields: [:email].join(',')).first).to_not include('user_id', 'picture') }
28
+ it do
29
+ expect(
30
+ client.users(per_page: 1, fields: [:email].join(','), include_fields: false).first
31
+ ).to include('user_id', 'picture')
32
+ end
27
33
  end
28
-
29
34
  end
30
35
 
31
36
  describe '.user' do
37
+ let(:subject) { client.user(user['user_id']) }
32
38
 
33
- let(:subject) { client.user(user["user_id"]) }
34
-
35
- it { should include("email" => email, "name" => username) }
36
-
37
- context "#filters" do
38
- it { expect(client.user(user["user_id"], fields: [:picture, :email, :user_id].join(','))).to include("email", "user_id", "picture") }
39
- it { expect(client.user(user["user_id"], fields: [:email].join(','))).to_not include("user_id", "picture") }
39
+ it { should include('email' => email, 'name' => username) }
40
+ it do
41
+ expect(
42
+ client.user(user['user_id'], fields: [:picture, :email, :user_id].join(','), include_fields: true)
43
+ ).to(include('email', 'user_id', 'picture'))
44
+ end
45
+ it do
46
+ expect(
47
+ client.user(user['user_id'], fields: [:picture, :email, :user_id].join(','), include_fields: false)
48
+ ).not_to(include('email', 'user_id', 'picture'))
40
49
  end
41
50
 
51
+ context '#filters' do
52
+ it do
53
+ expect(client.user(user['user_id'], fields: [:picture, :email, :user_id].join(','))).to(
54
+ include('email', 'user_id', 'picture'))
55
+ end
56
+ it { expect(client.user(user['user_id'], fields: [:email].join(','))).to_not include('user_id', 'picture') }
57
+ end
42
58
  end
43
59
 
44
60
  describe '.create_user' do
45
-
46
61
  let(:subject) { user }
47
62
 
48
- it { should include("user_id", "identities") }
49
- it { should include(
50
- "email" => email,
51
- "email_verified" => false,
52
- )}
53
-
63
+ it { should include('user_id', 'identities') }
64
+ it { expect(client.patch_user(user['user_id'], 'email_verified' => true)).to include('email_verified' => true) }
54
65
  end
55
66
 
56
67
  describe '.delete_user' do
57
-
58
- it { expect { client.delete_user user["user_id"] }.to_not raise_error }
59
-
60
- it { expect { client.delete_user "" }.to raise_error(Auth0::MissingUserId) }
61
-
68
+ it { expect { client.delete_user user['user_id'] }.to_not raise_error }
69
+ it { expect { client.delete_user '' }.to raise_error(Auth0::MissingUserId) }
62
70
  end
63
71
 
64
72
  describe '.patch_user' do
65
- it { expect(client.patch_user(user["user_id"], {"email_verified" => true})).to include("email_verified" => true) }
73
+ it { expect(client.patch_user(user['user_id'], 'email_verified' => true)).to(include('email_verified' => true)) }
74
+ let(:body_path) do
75
+ {
76
+ 'user_metadata' => {
77
+ 'addresses' => { 'home_address' => '742 Evergreen Terrace' }
78
+ }
79
+ }
80
+ end
81
+ it do
82
+ expect(
83
+ client.patch_user(user['user_id'], body_path)
84
+ ).to(include('user_metadata' => { 'addresses' => { 'home_address' => '742 Evergreen Terrace' } }))
85
+ end
66
86
  end
67
87
 
88
+ describe '.link_user_account and .unlink_users_account' do
89
+ let(:email_link) { "#{entity_suffix}#{Faker::Internet.safe_email(Faker::Internet.user_name)}" }
90
+ let!(:link_user) do
91
+ client.create_user(username, 'email' => email_link,
92
+ 'password' => Faker::Internet.password,
93
+ 'email_verified' => false,
94
+ 'connection' => Auth0::Api::AuthenticationEndpoints::UP_AUTH,
95
+ 'app_metadata' => {})
96
+ end
97
+ let(:email_primary) { "#{entity_suffix}#{Faker::Internet.safe_email(Faker::Internet.user_name)}" }
98
+ let!(:primary_user) do
99
+ client.create_user(username, 'email' => email_primary,
100
+ 'password' => Faker::Internet.password,
101
+ 'email_verified' => false,
102
+ 'connection' => Auth0::Api::AuthenticationEndpoints::UP_AUTH,
103
+ 'app_metadata' => {})
104
+ end
105
+
106
+ let(:body_link) { { 'provider' => 'auth0', 'user_id' => link_user['user_id'] } }
107
+ skip 'Link user account examples are skipped to avoid errors on users deletion' do
108
+ it do
109
+ expect(
110
+ client.link_user_account(primary_user['user_id'], body_link).first
111
+ ).to include('provider' => 'auth0', 'user_id' => primary_user['identities'].first['user_id'])
112
+ end
113
+ end
114
+ it do
115
+ expect(
116
+ client.unlink_users_account(primary_user['user_id'], 'auth0', link_user['user_id']).first
117
+ ).to include('provider' => 'auth0', 'user_id' => primary_user['identities'].first['user_id'])
118
+ end
119
+ end
68
120
  end
@@ -1,7 +1,6 @@
1
- require "spec_helper"
1
+ require 'spec_helper'
2
2
  describe Auth0::Client do
3
-
4
- shared_examples "invalid credentials" do |credentials, error|
3
+ shared_examples 'invalid credentials' do |credentials, error|
5
4
  it "raise an error with credentials #{credentials}" do
6
5
  if error.nil?
7
6
  expect { Auth0Client.new(credentials) }.to raise_error
@@ -11,62 +10,71 @@ describe Auth0::Client do
11
10
  end
12
11
  end
13
12
 
14
- it_should_behave_like "invalid credentials", {namespace: "samples.auth0.com"}, Auth0::InvalidCredentials
15
- it_should_behave_like "invalid credentials", {namespace: "samples.auth0.com", client_id: "client_id"}, Auth0::InvalidCredentials
16
- it_should_behave_like "invalid credentials", {namespace: "samples.auth0.com", client_secret: "secret"}, Auth0::InvalidCredentials
17
- it_should_behave_like "invalid credentials", {namespace: "samples.auth0.com", api_version: 2}, Auth0::InvalidCredentials
18
- it_should_behave_like "invalid credentials", {}
19
- it_should_behave_like "invalid credentials", {api_version: 2}
20
- it_should_behave_like "invalid credentials", {api_version: 1}
21
- it_should_behave_like "invalid credentials", {client_id: "client_id", client_secret: "secret"}, Auth0::InvalidApiNamespace
22
- it_should_behave_like "invalid credentials", {api_version: 2, token: "token"}, Auth0::InvalidApiNamespace
13
+ it_should_behave_like 'invalid credentials', { namespace: 'samples.auth0.com' }, Auth0::InvalidCredentials
14
+ it_should_behave_like 'invalid credentials', {
15
+ namespace: 'samples.auth0.com', client_id: 'client_id' }, Auth0::InvalidCredentials
16
+ it_should_behave_like 'invalid credentials', {
17
+ namespace: 'samples.auth0.com', client_secret: 'secret' }, Auth0::InvalidCredentials
18
+ it_should_behave_like 'invalid credentials', {
19
+ namespace: 'samples.auth0.com', api_version: 2 }, Auth0::InvalidCredentials
20
+ it_should_behave_like 'invalid credentials', {}
21
+ it_should_behave_like 'invalid credentials', api_version: 2
22
+ it_should_behave_like 'invalid credentials', api_version: 1
23
+ it_should_behave_like 'invalid credentials', {
24
+ client_id: 'client_id', client_secret: 'secret' }, Auth0::InvalidApiNamespace
25
+ it_should_behave_like 'invalid credentials', {
26
+ api_version: 2, token: 'token' }, Auth0::InvalidApiNamespace
23
27
 
24
- let(:valid_v1_credentials) { {client_id: ENV["CLIENT_ID"], client_secret: ENV["CLIENT_SECRET"], domain: ENV["DOMAIN"]} }
25
- let(:token) { ENV["MASTER_JWT"] }
26
- let(:v2_credentials) { {domain: ENV["DOMAIN"], api_version: 2} }
28
+ let(:valid_v1_credentials) do
29
+ { client_id: ENV['CLIENT_ID'],
30
+ client_secret: ENV['CLIENT_SECRET'],
31
+ domain: ENV['DOMAIN'] }
32
+ end
33
+ let(:token) { ENV['MASTER_JWT'] }
34
+ let(:v2_credentials) { { domain: ENV['DOMAIN'], api_version: 2 } }
27
35
 
28
- shared_examples "valid credentials" do
36
+ shared_examples 'valid credentials' do
29
37
  it { expect { Auth0Client.new(credentials) }.to_not raise_error }
30
38
  end
31
39
 
32
- it_should_behave_like "valid credentials" do
40
+ it_should_behave_like 'valid credentials' do
33
41
  let(:credentials) { valid_v1_credentials }
34
42
  end
35
- it_should_behave_like "valid credentials" do
36
- let(:credentials) { valid_v1_credentials.merge({api_version: 1}) }
43
+ it_should_behave_like 'valid credentials' do
44
+ let(:credentials) { valid_v1_credentials.merge(api_version: 1) }
37
45
  end
38
- it_should_behave_like "valid credentials" do
39
- let(:credentials) { v2_credentials.merge({token: token})}
46
+ it_should_behave_like 'valid credentials' do
47
+ let(:credentials) { v2_credentials.merge(token: token) }
40
48
  end
41
- it_should_behave_like "valid credentials" do
42
- let(:credentials) { v2_credentials.merge({access_token: ENV["MASTER_JWT"]}) }
49
+ it_should_behave_like 'valid credentials' do
50
+ let(:credentials) { v2_credentials.merge(access_token: ENV['MASTER_JWT']) }
43
51
  end
44
52
 
45
- context "client headers" do
46
- let(:client) { Auth0::Client.new(v2_credentials.merge({access_token: 'abc123', domain: 'myhost.auth0.com'})) }
53
+ context 'client headers' do
54
+ let(:client) { Auth0::Client.new(v2_credentials.merge(access_token: 'abc123', domain: 'myhost.auth0.com')) }
47
55
  let(:headers) { client.class.headers }
48
56
 
49
- let(:base64_token) {
50
- Base64.urlsafe_encode64('{"name":"ruby-auth0","version":"'+Auth0::VERSION+'"}')
51
- }
57
+ let(:base64_token) do
58
+ Base64.urlsafe_encode64('{"name":"ruby-auth0","version":"' + Auth0::VERSION + '"}')
59
+ end
52
60
 
53
- it "has the correct headers present" do
54
- expect(headers.keys.sort).to eql ['Auth0-Client', 'Authorization', 'Content-Type', 'User-Agent']
61
+ it 'has the correct headers present' do
62
+ expect(headers.keys.sort).to eql(['Auth0-Client', 'Authorization', 'Content-Type', 'User-Agent'])
55
63
  end
56
64
 
57
- it "uses the correct access token" do
58
- expect(headers['Authorization']).to eql "Bearer abc123"
65
+ it 'uses the correct access token' do
66
+ expect(headers['Authorization']).to eql 'Bearer abc123'
59
67
  end
60
68
 
61
- it "is always json" do
69
+ it 'is always json' do
62
70
  expect(headers['Content-Type']).to eql 'application/json'
63
71
  end
64
72
 
65
- it "sets the ruby version" do
73
+ it 'sets the ruby version' do
66
74
  expect(headers['User-Agent']).to eql "Ruby/#{RUBY_VERSION}"
67
75
  end
68
76
 
69
- it "sets the client version" do
77
+ it 'sets the client version' do
70
78
  expect(headers['Auth0-Client']).to eql base64_token
71
79
  end
72
80
  end
@@ -1,80 +1,286 @@
1
- require "spec_helper"
1
+ require 'spec_helper'
2
2
  describe Auth0::Api::AuthenticationEndpoints do
3
3
  before :all do
4
4
  dummy_instance = DummyClass.new
5
5
  dummy_instance.extend(Auth0::Api::AuthenticationEndpoints)
6
+
6
7
  @instance = dummy_instance
7
8
  end
8
9
 
9
- context ".obtain_access_token" do
10
- it {expect(@instance).to respond_to(:obtain_access_token)}
10
+ context '.obtain_access_token' do
11
+ it { expect(@instance).to respond_to(:obtain_access_token) }
11
12
  it "is expected to make post request to '/oauth/token'" do
12
- allow(@instance).to receive(:post).with("/oauth/token", {client_id: nil, client_secret: nil, grant_type: 'client_credentials'}).
13
- and_return({"access_token" => "AccessToken"})
14
- expect(@instance).to receive(:post).with("/oauth/token", {client_id: nil, client_secret: nil, grant_type: 'client_credentials'})
15
- expect(@instance.obtain_access_token).to eql "AccessToken"
13
+ allow(@instance).to receive(:post).with(
14
+ '/oauth/token', client_id: nil, client_secret: nil, grant_type: 'client_credentials')
15
+ .and_return('access_token' => 'AccessToken')
16
+ expect(@instance).to receive(:post).with(
17
+ '/oauth/token', client_id: nil, client_secret: nil, grant_type: 'client_credentials')
18
+ expect(@instance.obtain_access_token).to eql 'AccessToken'
19
+ end
20
+ end
21
+
22
+ context '.obtain_access_token social' do
23
+ it { expect(@instance).to respond_to(:obtain_access_token) }
24
+ it "is expected to make post request to '/oauth/access_token'" do
25
+ allow(@instance).to receive(:post).with(
26
+ '/oauth/access_token', client_id: nil, access_token: 'access_token', connection: 'facebook', scope: 'openid')
27
+ .and_return('access_token' => 'AccessToken')
28
+ expect(@instance).to receive(:post).with(
29
+ '/oauth/access_token', client_id: nil, access_token: 'access_token', connection: 'facebook', scope: 'openid')
30
+ expect(@instance.obtain_access_token('access_token', 'facebook', 'openid')).to eql 'AccessToken'
31
+ end
32
+ end
33
+
34
+ context '.login' do
35
+ it { expect(@instance).to respond_to(:login) }
36
+ it 'is expected to make post to /oauth/ro' do
37
+ expect(@instance).to receive(:post).with(
38
+ '/oauth/ro',
39
+ client_id: nil, username: 'test@test.com',
40
+ password: 'password', scope: 'openid', connection: 'Username-Password-Authentication',
41
+ grant_type: 'password', id_token: nil, device: nil)
42
+ @instance.login('test@test.com', 'password')
43
+ end
44
+ it { expect { @instance.login('', '') }.to raise_error 'Must supply a valid username' }
45
+ it { expect { @instance.login('username', '') }.to raise_error 'Must supply a valid password' }
46
+ end
47
+
48
+ context '.signup' do
49
+ it { expect(@instance).to respond_to(:signup) }
50
+ it 'is expected to make post to /dbconnections/signup' do
51
+ expect(@instance).to receive(:post).with(
52
+ '/dbconnections/signup',
53
+ client_id: nil, email: 'test@test.com',
54
+ password: 'password', connection: 'User')
55
+ @instance.signup('test@test.com', 'password', 'User')
56
+ end
57
+ it { expect { @instance.signup('', '') }.to raise_error 'Must supply a valid email' }
58
+ it { expect { @instance.signup('email', '') }.to raise_error 'Must supply a valid password' }
59
+ end
60
+
61
+ context '.change_password' do
62
+ it { expect(@instance).to respond_to(:change_password) }
63
+ it 'is expected to make post to /dbconnections/change_password' do
64
+ expect(@instance).to receive(:post).with(
65
+ '/dbconnections/change_password',
66
+ client_id: nil, email: 'test@test.com',
67
+ password: 'password', connection: 'User')
68
+ @instance.change_password('test@test.com', 'password', 'User')
69
+ end
70
+ it { expect { @instance.change_password('', '', '') }.to raise_error 'Must supply a valid email' }
71
+ end
72
+
73
+ context '.start_passwordless_email_flow' do
74
+ it { expect(@instance).to respond_to(:start_passwordless_email_flow) }
75
+ it 'is expected to make post to /passwordless/start' do
76
+ expect(@instance).to receive(:post).with(
77
+ '/passwordless/start',
78
+ client_id: nil,
79
+ email: 'test@test.com',
80
+ send: 'link',
81
+ auth_params: {
82
+ scope: 'scope',
83
+ protocol: 'protocol'
84
+ })
85
+ @instance.start_passwordless_email_flow('test@test.com', 'link', scope: 'scope', protocol: 'protocol')
86
+ end
87
+ it { expect { @instance.start_passwordless_email_flow('', '', '') }.to raise_error 'Must supply a valid email' }
88
+ end
89
+
90
+ context '.start_passwordless_sms_flow' do
91
+ let(:phone_number) { Faker::PhoneNumber.cell_phone }
92
+ it { expect(@instance).to respond_to(:start_passwordless_sms_flow) }
93
+ it 'is expected to make post to /passwordless/start' do
94
+ expect(@instance).to receive(:post).with(
95
+ '/passwordless/start',
96
+ client_id: nil,
97
+ connection: 'sms',
98
+ phone_number: phone_number)
99
+ @instance.start_passwordless_sms_flow(phone_number)
100
+ end
101
+ it { expect { @instance.start_passwordless_sms_flow('') }.to raise_error 'Must supply a valid phone number' }
102
+ end
103
+
104
+ context '.phone_login' do
105
+ let(:phone_number) { Faker::PhoneNumber.cell_phone }
106
+ let(:code) { Faker::Number.number(10) }
107
+ it { expect(@instance).to respond_to(:phone_login) }
108
+ it 'is expected to make post to /oauth/ro' do
109
+ expect(@instance).to receive(:post).with(
110
+ '/oauth/ro',
111
+ client_id: nil, username: phone_number,
112
+ password: code, connection: 'sms',
113
+ scope: 'openid', grant_type: 'password')
114
+ @instance.phone_login(phone_number, code)
115
+ end
116
+ it { expect { @instance.phone_login('', '') }.to raise_error 'Must supply a valid phone number' }
117
+ it { expect { @instance.phone_login('phone', '') }.to raise_error 'Must supply a valid code' }
118
+ end
119
+
120
+ context '.saml_metadata' do
121
+ let(:client_id) { 'client-id' }
122
+ it { expect(@instance).to respond_to(:saml_metadata) }
123
+ it 'is expected to make post to /samlp/metadata/client-id' do
124
+ expect(@instance).to receive(:get).with("/samlp/metadata/#{client_id}")
125
+ @instance.saml_metadata(client_id)
126
+ end
127
+ it { expect { @instance.saml_metadata('') }.to raise_error 'Must supply a valid client_id' }
128
+ end
129
+
130
+ context '.wsfed_metadata' do
131
+ it { expect(@instance).to respond_to(:wsfed_metadata) }
132
+ it 'is expected to make post to /wsfed/FederationMetadata/2007-06/FederationMetadata.xml' do
133
+ expect(@instance).to receive(:get).with('/wsfed/FederationMetadata/2007-06/FederationMetadata.xml')
134
+ @instance.wsfed_metadata
135
+ end
136
+ end
137
+
138
+ context '.authorization_url' do
139
+ let(:redirect_url) { 'http://redirect.com' }
140
+ it { expect(@instance).to respond_to(:authorization_url) }
141
+ it 'is expected to return an authorization url' do
142
+ expect(@instance.authorization_url(redirect_url).to_s).to eq(
143
+ "https://#{@instance.domain}/authorize?response_type=code&redirect_url=#{redirect_url}")
144
+ end
145
+ let(:additional_parameters) { { additional_parameters: { aparam1: 'test1' } } }
146
+ it 'is expected to return an authorization url with additionalParameters' do
147
+ expect(@instance.authorization_url(redirect_url, additional_parameters).to_s).to eq(
148
+ "https://#{@instance.domain}/authorize?response_type=code&redirect_url=#{redirect_url}&aparam1=test1")
149
+ end
150
+ let(:state) { { state: 'state1' } }
151
+ it 'is expected to return an authorization url with additionalParameters' do
152
+ expect(@instance.authorization_url(redirect_url, state).to_s).to eq(
153
+ "https://#{@instance.domain}/authorize?response_type=code&redirect_url=#{redirect_url}&state=state1")
154
+ end
155
+ it { expect { @instance.authorization_url('', '') }.to raise_error 'Must supply a valid redirect_uri' }
156
+ end
157
+ context '.token_info' do
158
+ it { expect(@instance).to respond_to(:token_info) }
159
+ it 'is expected to make post to /tokeinfo' do
160
+ expect(@instance).to receive(:post).with('/tokeninfo', id_token: 'SomerandomToken')
161
+ @instance.token_info('SomerandomToken')
16
162
  end
163
+ it { expect { @instance.token_info('') }.to raise_error 'Must supply a valid id_token' }
17
164
  end
18
165
 
19
- context ".delegation" do
20
- it {expect(@instance).to respond_to(:delegation)}
166
+ context '.refresh_delegation' do
167
+ it { expect(@instance).to respond_to(:refresh_delegation) }
21
168
  it "is expected to make post request to '/delegation'" do
22
- expect(@instance).to receive(:post).with("/delegation",{:client_id=>nil, :grant_type=>"urn:ietf:params:oauth:grant-type:jwt-bearer", :id_token=>"token", :target=>"target", :scope=>"", api_type: "app"})
23
- @instance.delegation("token", "target", "")
169
+ expect(@instance).to receive(:post).with(
170
+ '/delegation',
171
+ client_id: nil,
172
+ grant_type: 'urn:ietf:params:oauth:grant-type:jwt-bearer',
173
+ refresh_token: 'id_token', target: '', api_type: '', scope: '',
174
+ additional_parameter: 'parameter')
175
+ @instance.refresh_delegation('id_token', '', '', '', additional_parameter: 'parameter')
24
176
  end
25
- it "is expected to make post request to '/delegation' with specified api_type" do
26
- expect(@instance).to receive(:post).with("/delegation",{:client_id=>nil, :grant_type=>"urn:ietf:params:oauth:grant-type:jwt-bearer",
27
- :id_token=>"", :target=>"", :scope=>"",
28
- api_type: "salesforce_api"})
29
- @instance.delegation("", "", "", "salesforce_api")
177
+ it { expect { @instance.refresh_delegation('', '', '', '') }.to raise_error 'Must supply a valid token to refresh' }
178
+ end
179
+
180
+ context '.delegation' do
181
+ it { expect(@instance).to respond_to(:delegation) }
182
+ it "is expected to make post request to '/delegation'" do
183
+ expect(@instance).to receive(:post).with(
184
+ '/delegation',
185
+ client_id: nil,
186
+ grant_type: 'urn:ietf:params:oauth:grant-type:jwt-bearer',
187
+ id_token: 'token',
188
+ target: 'target',
189
+ scope: '',
190
+ api_type: 'app')
191
+ @instance.delegation('token', 'target', '')
30
192
  end
31
- it "allows to pass extra parameters" do
32
- expect(@instance).to receive(:post).with("/delegation",{:client_id=>nil, :grant_type=>"urn:ietf:params:oauth:grant-type:jwt-bearer",
33
- :id_token=>"", :target=>"", :scope=>"", :api_type => "",
34
- :community_name => 'test-community', community_url: 'test-url'})
35
- @instance.delegation("", "", "", "", community_name: 'test-community', community_url: 'test-url')
193
+ it "is expected to make post request to '/delegation'
194
+ with specified api_type" do
195
+ expect(@instance).to receive(:post).with(
196
+ '/delegation',
197
+ client_id: nil,
198
+ grant_type: 'urn:ietf:params:oauth:grant-type:jwt-bearer',
199
+ id_token: 'id_token', target: '', scope: '',
200
+ api_type: 'salesforce_api')
201
+ @instance.delegation('id_token', '', '', 'salesforce_api')
36
202
  end
203
+ it 'allows to pass extra parameters' do
204
+ expect(@instance).to receive(:post).with(
205
+ '/delegation',
206
+ client_id: nil,
207
+ grant_type: 'urn:ietf:params:oauth:grant-type:jwt-bearer',
208
+ id_token: 'id_token', target: '', scope: '', api_type: '',
209
+ community_name: 'test-community', community_url: 'test-url')
210
+ @instance.delegation(
211
+ 'id_token', '', '', '',
212
+ community_name: 'test-community', community_url: 'test-url')
213
+ end
214
+ it { expect { @instance.delegation('', nil, nil, nil) }.to raise_error 'Must supply a valid id_token' }
37
215
  end
38
216
 
39
- context ".impersonate" do
40
- let(:user_id) {"some_user_id"}
41
- let(:app_client_id) {"some_app_client_id"}
42
- let(:impersonator_id) {"some_impersonator_id"}
217
+ context '.impersonate' do
218
+ let(:user_id) { 'some_user_id' }
219
+ let(:app_client_id) { 'some_app_client_id' }
220
+ let(:impersonator_id) { 'some_impersonator_id' }
43
221
 
44
- it {expect(@instance).to respond_to(:impersonate)}
222
+ it { expect(@instance).to respond_to(:impersonate) }
45
223
  it "is expected to make post request to '/users/{user_id}/impersonate'" do
46
- expect(@instance).to receive(:post).with("/users/#{user_id}/impersonate",{:protocol=>"oauth2", :impersonator_id=>impersonator_id, :client_id=>app_client_id, :ttl=>120, :additionalParameters=>{:response_type=>"code", :state=>"", :scope=>"openid", :callback_url=>""}})
224
+ expect(@instance).to receive(:post).with(
225
+ "/users/#{user_id}/impersonate",
226
+ protocol: 'oauth2',
227
+ impersonator_id: impersonator_id, client_id: app_client_id,
228
+ additionalParameters: {
229
+ response_type: 'code', state: '',
230
+ scope: 'openid', callback_url: '' })
47
231
  @instance.impersonate(user_id, app_client_id, impersonator_id, {})
48
232
  end
233
+ it { expect { @instance.impersonate('', '', '', '') }.to raise_error 'Must supply a valid user_id' }
49
234
  end
50
235
 
51
- context ".login" do
52
- it {expect(@instance).to respond_to(:signup)}
53
- it "is expected to make post to /oauth/ro" do
54
- expect(@instance).to receive(:post).with("/oauth/ro", {client_id: nil, username:"test@test.com", password: "password", connection: "Username-Password-Authentication", scope: "openid", grant_type: "password", id_token: nil})
55
- @instance.login("test@test.com", "password")
236
+ context '.unlink_user' do
237
+ it { expect(@instance).to respond_to(:unlink_user) }
238
+ it 'is expected to make post to /unlink' do
239
+ expect(@instance).to receive(:post).with('/unlink', access_token: 'access-token', user_id: 'user-id')
240
+ @instance.unlink_user('access-token', 'user-id')
56
241
  end
242
+ it { expect { @instance.unlink_user('', '') }.to raise_error 'Must supply a valid access_token' }
243
+ it { expect { @instance.unlink_user('token', '') }.to raise_error 'Must supply a valid user_id' }
57
244
  end
58
- context ".signup" do
59
- it {expect(@instance).to respond_to(:signup)}
60
- it "is expected to make post to /dbconnections/signup" do
61
- expect(@instance).to receive(:post).with("/dbconnections/signup", {client_id: nil, email: "test@test.com", password: "password", connection: "User"})
62
- @instance.signup("test@test.com", "password", "User")
245
+
246
+ context '.user_info' do
247
+ it { expect(@instance).to respond_to(:user_info) }
248
+ it 'is expected to make post to /userinfo' do
249
+ expect(@instance).to receive(:get).with('/userinfo')
250
+ @instance.user_info
63
251
  end
64
252
  end
65
- context ".change_password" do
66
- it {expect(@instance).to respond_to(:change_password)}
67
- it "is expected to make post to /dbconnections/change_password" do
68
- expect(@instance).to receive(:post).with("/dbconnections/change_password", {client_id: nil, email: "test@test.com", password: "password", connection: "User"})
69
- @instance.change_password("test@test.com", "password", "User")
253
+
254
+ context '.logout_url' do
255
+ let(:return_to) { 'http://returnto.com' }
256
+ it { expect(@instance).to respond_to(:logout_url) }
257
+ it 'is expected to return a logout url' do
258
+ expect(@instance.logout_url(return_to).to_s).to eq(
259
+ "https://#{@instance.domain}/logout?returnTo=#{return_to}")
70
260
  end
71
261
  end
72
262
 
73
- context ".token_info" do
74
- it {expect(@instance).to respond_to(:token_info)}
75
- it "is expected to make post to /tokeinfo" do
76
- expect(@instance).to receive(:post).with("/tokeninfo", {id_token: "SomerandomToken"})
77
- @instance.token_info("SomerandomToken")
263
+ context '.samlp_url' do
264
+ it { expect(@instance).to respond_to(:samlp_url) }
265
+ it 'is expected to get the samlp url' do
266
+ expect(@instance.samlp_url.to_s).to eq(
267
+ "https://#{@instance.domain}/samlp/?connection=Username-Password-Authentication")
268
+ end
269
+ it 'is expected to get the samlp url with fb connection' do
270
+ expect(@instance.samlp_url('facebook').to_s).to eq(
271
+ "https://#{@instance.domain}/samlp/?connection=facebook")
272
+ end
273
+ end
274
+
275
+ context '.wsfed_url' do
276
+ it { expect(@instance).to respond_to(:wsfed_url) }
277
+ it 'is expected to get the wsfed url' do
278
+ expect(@instance.wsfed_url.to_s).to eq(
279
+ "https://#{@instance.domain}/wsfed/?whr=Username-Password-Authentication")
280
+ end
281
+ it 'is expected to get the wsfed url with fb connection' do
282
+ expect(@instance.wsfed_url('facebook').to_s).to eq(
283
+ "https://#{@instance.domain}/wsfed/?whr=facebook")
78
284
  end
79
285
  end
80
286
  end