descope 1.0.4 → 1.0.6
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.github/workflows/ci.yaml +15 -27
- data/.github/workflows/publish-gem.yaml +61 -0
- data/Gemfile +12 -14
- data/Gemfile.lock +46 -101
- data/README.md +56 -19
- data/descope.gemspec +25 -20
- data/examples/ruby/.ruby-version +1 -0
- data/examples/ruby/access_key_app.rb +7 -4
- data/examples/ruby/enchantedlink_app.rb +1 -0
- data/examples/ruby/magiclink_app.rb +1 -0
- data/examples/ruby/management/.ruby-version +1 -0
- data/examples/ruby/management/Gemfile +2 -2
- data/examples/ruby/management/Gemfile.lock +2 -2
- data/examples/ruby/management/access_key_app.rb +2 -0
- data/examples/ruby/management/audit_app.rb +32 -8
- data/examples/ruby/management/authz_app.rb +1 -0
- data/examples/ruby/management/flow_app.rb +1 -0
- data/examples/ruby/management/permission_app.rb +3 -2
- data/examples/ruby/management/role_app.rb +10 -4
- data/examples/ruby/management/tenant_app.rb +1 -0
- data/examples/ruby/management/user_app.rb +1 -0
- data/examples/ruby/oauth_app.rb +1 -0
- data/examples/ruby/otp_app.rb +38 -12
- data/examples/ruby/password_app.rb +8 -7
- data/examples/ruby/saml_app.rb +1 -0
- data/examples/ruby/version_check.rb +17 -0
- data/examples/ruby-on-rails-api/descope/.gitignore +58 -28
- data/examples/ruby-on-rails-api/descope/Gemfile +3 -1
- data/examples/ruby-on-rails-api/descope/Gemfile.lock +121 -90
- data/examples/ruby-on-rails-api/descope/README.md +18 -18
- data/examples/ruby-on-rails-api/descope/app/assets/builds/App.css +62 -0
- data/examples/ruby-on-rails-api/descope/app/assets/builds/App.css.map +7 -0
- data/examples/ruby-on-rails-api/descope/app/assets/builds/application.css +20131 -0
- data/examples/ruby-on-rails-api/descope/app/assets/builds/application.css.map +7 -0
- data/examples/ruby-on-rails-api/descope/app/assets/builds/application.js +40368 -0
- data/examples/ruby-on-rails-api/descope/app/assets/builds/application.js.map +7 -0
- data/examples/ruby-on-rails-api/descope/app/assets/builds/components/App.css +62 -0
- data/examples/ruby-on-rails-api/descope/app/assets/builds/components/App.css.map +7 -0
- data/examples/ruby-on-rails-api/descope/app/assets/builds/components/App.js +27979 -0
- data/examples/ruby-on-rails-api/descope/app/assets/builds/components/App.js.map +7 -0
- data/examples/ruby-on-rails-api/descope/app/assets/builds/components/Dashboard.css +62 -0
- data/examples/ruby-on-rails-api/descope/app/assets/builds/components/Dashboard.css.map +7 -0
- data/examples/ruby-on-rails-api/descope/app/assets/builds/components/Dashboard.js +27118 -0
- data/examples/ruby-on-rails-api/descope/app/assets/builds/components/Dashboard.js.map +7 -0
- data/examples/ruby-on-rails-api/descope/app/assets/builds/components/Home.css +62 -0
- data/examples/ruby-on-rails-api/descope/app/assets/builds/components/Home.css.map +7 -0
- data/examples/ruby-on-rails-api/descope/app/assets/builds/components/Home.js +27113 -0
- data/examples/ruby-on-rails-api/descope/app/assets/builds/components/Home.js.map +7 -0
- data/examples/ruby-on-rails-api/descope/app/assets/builds/components/Login.css +62 -0
- data/examples/ruby-on-rails-api/descope/app/assets/builds/components/Login.css.map +7 -0
- data/examples/ruby-on-rails-api/descope/app/assets/builds/components/Login.js +27131 -0
- data/examples/ruby-on-rails-api/descope/app/assets/builds/components/Login.js.map +7 -0
- data/examples/ruby-on-rails-api/descope/app/assets/builds/components/Profile.css +62 -0
- data/examples/ruby-on-rails-api/descope/app/assets/builds/components/Profile.css.map +7 -0
- data/examples/ruby-on-rails-api/descope/app/assets/builds/components/Profile.js +27168 -0
- data/examples/ruby-on-rails-api/descope/app/assets/builds/components/Profile.js.map +7 -0
- data/examples/ruby-on-rails-api/descope/app/assets/builds/components/index.css +62 -0
- data/examples/ruby-on-rails-api/descope/app/assets/builds/components/index.css.map +7 -0
- data/examples/ruby-on-rails-api/descope/app/assets/builds/components/index.js +28236 -0
- data/examples/ruby-on-rails-api/descope/app/assets/builds/components/index.js.map +7 -0
- data/examples/ruby-on-rails-api/descope/app/assets/builds/controllers/application.js +2456 -0
- data/examples/ruby-on-rails-api/descope/app/assets/builds/controllers/application.js.map +7 -0
- data/examples/ruby-on-rails-api/descope/app/assets/builds/controllers/index.js +2453 -0
- data/examples/ruby-on-rails-api/descope/app/assets/builds/controllers/index.js.map +7 -0
- data/examples/ruby-on-rails-api/descope/app/assets/builds/routes/index.css +62 -0
- data/examples/ruby-on-rails-api/descope/app/assets/builds/routes/index.css.map +7 -0
- data/examples/ruby-on-rails-api/descope/app/assets/builds/routes/index.js +27973 -0
- data/examples/ruby-on-rails-api/descope/app/assets/builds/routes/index.js.map +7 -0
- data/examples/ruby-on-rails-api/descope/package-lock.json +1021 -19307
- data/examples/ruby-on-rails-api/descope/package.json +8 -16
- data/examples/ruby-on-rails-api/descope/yarn.lock +459 -10641
- data/lib/descope/api/v1/auth/otp.rb +21 -14
- data/lib/descope/api/v1/auth.rb +37 -25
- data/lib/descope/api/v1/management/access_key.rb +5 -4
- data/lib/descope/api/v1/management/audit.rb +24 -0
- data/lib/descope/api/v1/management/common.rb +5 -1
- data/lib/descope/api/v1/management/role.rb +22 -6
- data/lib/descope/api/v1/management/user.rb +17 -0
- data/lib/descope/mixins/common.rb +6 -13
- data/lib/descope/mixins/http.rb +1 -1
- data/lib/descope/mixins/validation.rb +21 -6
- data/lib/descope/version.rb +1 -1
- data/spec/integration/lib.descope/api/v1/auth/enchantedlink_spec.rb +81 -0
- data/spec/integration/lib.descope/api/v1/auth/magiclink_spec.rb +49 -0
- data/spec/integration/lib.descope/api/v1/auth/otp_spec.rb +103 -0
- data/spec/integration/lib.descope/api/v1/auth/password_spec.rb +41 -0
- data/spec/integration/lib.descope/api/v1/auth/totp_spec.rb +76 -0
- data/spec/integration/lib.descope/api/v1/management/access_key_spec.rb +62 -0
- data/spec/integration/lib.descope/api/v1/management/audit_spec.rb +52 -0
- data/spec/integration/lib.descope/api/v1/management/authz_spec.rb +187 -0
- data/spec/integration/lib.descope/api/v1/management/flow_spec.rb +44 -0
- data/spec/integration/lib.descope/api/v1/management/permissions_spec.rb +27 -0
- data/spec/integration/lib.descope/api/v1/management/project_spec.rb +29 -0
- data/spec/integration/lib.descope/api/v1/management/roles_spec.rb +116 -0
- data/spec/integration/lib.descope/api/v1/management/user_spec.rb +262 -0
- data/spec/lib.descope/api/v1/auth/otp_spec.rb +176 -18
- data/spec/lib.descope/api/v1/auth_spec.rb +50 -1
- data/spec/lib.descope/api/v1/management/access_key_spec.rb +4 -2
- data/spec/lib.descope/api/v1/management/audit_spec.rb +92 -0
- data/spec/lib.descope/api/v1/management/role_spec.rb +35 -6
- data/spec/lib.descope/api/v1/management/user_spec.rb +40 -0
- data/spec/spec_helper.rb +9 -38
- data/spec/support/client_config.rb +5 -1
- data/spec/support/dummy_class.rb +15 -1
- data/spec/support/utils.rb +1 -1
- metadata +77 -133
- data/examples/ruby-on-rails-api/descope/tmp/pids/.keep +0 -0
- data/examples/ruby-on-rails-api/descope/tmp/storage/.keep +0 -0
@@ -180,7 +180,9 @@ describe Descope::Api::V1::Auth do
|
|
180
180
|
token = JWT.encode(default_payload.merge(payload), rsa_private, ALGORITHM)
|
181
181
|
|
182
182
|
expect do
|
183
|
-
|
183
|
+
exp_in_seconds = 20
|
184
|
+
puts "\nAuthSpec.validate_token::Sleeping for #{exp_in_seconds} seconds to test token expiration. Please wait...\n"
|
185
|
+
sleep(exp_in_seconds)
|
184
186
|
@instance.send(:validate_token, token)
|
185
187
|
end.to raise_error(
|
186
188
|
Descope::AuthException, /Signature has expired/
|
@@ -369,4 +371,51 @@ describe Descope::Api::V1::Auth do
|
|
369
371
|
expect(@instance.validate_tenant_roles(jwt_response: { 'tenants' => { 't1' => { 'roles' => 'Role 1' } } }, tenant: 't2', roles: [])).to be false
|
370
372
|
end
|
371
373
|
end
|
374
|
+
|
375
|
+
context '.exchange_access_key' do
|
376
|
+
it 'is expected to respond to exchange access key' do
|
377
|
+
expect(@instance).to respond_to(:exchange_access_key)
|
378
|
+
end
|
379
|
+
|
380
|
+
it 'is expected to fail when access key is nil' do
|
381
|
+
expect { @instance.exchange_access_key(access_key: nil) }.to raise_error(Descope::AuthException)
|
382
|
+
end
|
383
|
+
|
384
|
+
it 'is expected to fail when access key is empty' do
|
385
|
+
expect { @instance.exchange_access_key(access_key: '') }.to raise_error(Descope::AuthException)
|
386
|
+
end
|
387
|
+
|
388
|
+
it 'is expected to fail when access key is not a string' do
|
389
|
+
expect { @instance.exchange_access_key(access_key: 123) }.to raise_error(Descope::AuthException)
|
390
|
+
end
|
391
|
+
|
392
|
+
it 'is expected to successfully exchange access key without login_options' do
|
393
|
+
jwt_response = { 'fake': 'response' }
|
394
|
+
access_key = 'abc'
|
395
|
+
|
396
|
+
expect(@instance).to receive(:post).with(
|
397
|
+
EXCHANGE_AUTH_ACCESS_KEY_PATH, { loginOptions: {}, audience: 'IT' }, {}, access_key
|
398
|
+
).and_return(jwt_response)
|
399
|
+
|
400
|
+
allow(@instance).to receive(:generate_jwt_response).and_return(jwt_response)
|
401
|
+
|
402
|
+
expect { @instance.exchange_access_key(access_key:, audience: 'IT') }.not_to raise_error
|
403
|
+
end
|
404
|
+
|
405
|
+
it 'is expected to successfully exchange access key with login_options' do
|
406
|
+
jwt_response = { 'fake': 'response' }
|
407
|
+
access_key = 'abc'
|
408
|
+
|
409
|
+
expect(@instance).to receive(:post).with(
|
410
|
+
EXCHANGE_AUTH_ACCESS_KEY_PATH,
|
411
|
+
{ loginOptions: { customClaims: { k1: 'v1' } }, audience: 'IT' },
|
412
|
+
{},
|
413
|
+
access_key
|
414
|
+
).and_return(jwt_response)
|
415
|
+
|
416
|
+
allow(@instance).to receive(:generate_jwt_response).and_return(jwt_response)
|
417
|
+
|
418
|
+
expect { @instance.exchange_access_key(access_key:, login_options: { customClaims: { k1: 'v1' } }, audience: 'IT') }.not_to raise_error
|
419
|
+
end
|
420
|
+
end
|
372
421
|
end
|
@@ -22,7 +22,8 @@ describe Descope::Api::V1::Management::AccessKey do
|
|
22
22
|
roleNames: ['test'],
|
23
23
|
keyTenants: [
|
24
24
|
{ tenantId: 'test', roleNames: %w[test test2] }
|
25
|
-
]
|
25
|
+
],
|
26
|
+
customClaims: {'k1': 'v1'}
|
26
27
|
}
|
27
28
|
)
|
28
29
|
expect do
|
@@ -32,7 +33,8 @@ describe Descope::Api::V1::Management::AccessKey do
|
|
32
33
|
role_names: ['test'],
|
33
34
|
key_tenants: [
|
34
35
|
{ tenant_id: 'test', role_names: %w[test test2] }
|
35
|
-
]
|
36
|
+
],
|
37
|
+
custom_claims: {'k1': 'v1'}
|
36
38
|
)
|
37
39
|
end.not_to raise_error
|
38
40
|
end
|
@@ -75,4 +75,96 @@ describe Descope::Api::V1::Management::Audit do
|
|
75
75
|
expect(res['audits'][0]['projectId']).to eq('abc')
|
76
76
|
end
|
77
77
|
end
|
78
|
+
|
79
|
+
context '.create_event' do
|
80
|
+
it 'should respond to .audit_create_event' do
|
81
|
+
expect(@instance).to respond_to :audit_create_event
|
82
|
+
end
|
83
|
+
|
84
|
+
it 'should raise an error if type is not info, warn or error' do
|
85
|
+
expect do
|
86
|
+
@instance.audit_create_event(
|
87
|
+
action: 'get',
|
88
|
+
type: 'debug',
|
89
|
+
data: { key: 'value' },
|
90
|
+
user_id: 'user_id',
|
91
|
+
actor_id: 'actor_id',
|
92
|
+
tenant_id: 'tenant_id'
|
93
|
+
)
|
94
|
+
end.to raise_error(Descope::AuthException, 'type must be either info, warn or error')
|
95
|
+
end
|
96
|
+
|
97
|
+
it 'should raise an error if data is not a hash' do
|
98
|
+
expect do
|
99
|
+
@instance.audit_create_event(
|
100
|
+
action: 'get',
|
101
|
+
type: 'info',
|
102
|
+
data: 'data',
|
103
|
+
user_id: 'user_id',
|
104
|
+
actor_id: 'actor_id',
|
105
|
+
tenant_id: 'tenant_id'
|
106
|
+
)
|
107
|
+
end.to raise_error(Descope::AuthException, 'data must be provided as a key, value Hash')
|
108
|
+
end
|
109
|
+
|
110
|
+
it 'should raise an error if action is not provided' do
|
111
|
+
expect do
|
112
|
+
@instance.audit_create_event(
|
113
|
+
type: 'info',
|
114
|
+
data: { key: 'value' },
|
115
|
+
user_id: 'user_id',
|
116
|
+
actor_id: 'actor_id',
|
117
|
+
tenant_id: 'tenant_id'
|
118
|
+
)
|
119
|
+
end.to raise_error(Descope::AuthException, 'action must be provided')
|
120
|
+
end
|
121
|
+
|
122
|
+
it 'should raise an error if actor is not provided' do
|
123
|
+
expect do
|
124
|
+
@instance.audit_create_event(
|
125
|
+
action: 'get',
|
126
|
+
type: 'info',
|
127
|
+
data: { key: 'value' },
|
128
|
+
user_id: 'user_id',
|
129
|
+
tenant_id: 'tenant_id'
|
130
|
+
)
|
131
|
+
end.to raise_error(Descope::AuthException, 'actor_id must be provided')
|
132
|
+
end
|
133
|
+
|
134
|
+
it 'should raise an error if tenant_id is not provided' do
|
135
|
+
expect do
|
136
|
+
@instance.audit_create_event(
|
137
|
+
action: 'get',
|
138
|
+
type: 'info',
|
139
|
+
data: { key: 'value' },
|
140
|
+
user_id: 'user_id',
|
141
|
+
actor_id: 'actor_id'
|
142
|
+
)
|
143
|
+
end.to raise_error(Descope::AuthException, 'tenant_id must be provided')
|
144
|
+
end
|
145
|
+
|
146
|
+
it 'is expected to create an audit event' do
|
147
|
+
expect(@instance).to receive(:post).with(
|
148
|
+
'/v1/mgmt/audit/event',
|
149
|
+
{
|
150
|
+
action: 'get',
|
151
|
+
type: 'info',
|
152
|
+
actorId: 'actor_id',
|
153
|
+
data: { key: 'value' },
|
154
|
+
tenantId: 'tenant_id',
|
155
|
+
userId: 'user_id'
|
156
|
+
}
|
157
|
+
)
|
158
|
+
expect do
|
159
|
+
@instance.audit_create_event(
|
160
|
+
action: 'get',
|
161
|
+
type: 'info',
|
162
|
+
data: { key: 'value' },
|
163
|
+
user_id: 'user_id',
|
164
|
+
actor_id: 'actor_id',
|
165
|
+
tenant_id: 'tenant_id'
|
166
|
+
)
|
167
|
+
end.not_to raise_error
|
168
|
+
end
|
169
|
+
end
|
78
170
|
end
|
@@ -19,14 +19,16 @@ describe Descope::Api::V1::Management::Role do
|
|
19
19
|
ROLE_CREATE_PATH, {
|
20
20
|
name: 'test',
|
21
21
|
description: 'test',
|
22
|
-
permissionNames: ['test']
|
22
|
+
permissionNames: ['test'],
|
23
|
+
tenantId: 'test'
|
23
24
|
}
|
24
25
|
)
|
25
26
|
expect do
|
26
27
|
@instance.create_role(
|
27
28
|
name: 'test',
|
28
29
|
description: 'test',
|
29
|
-
permission_names: ['test']
|
30
|
+
permission_names: ['test'],
|
31
|
+
tenant_id: 'test'
|
30
32
|
)
|
31
33
|
end.not_to raise_error
|
32
34
|
end
|
@@ -43,7 +45,8 @@ describe Descope::Api::V1::Management::Role do
|
|
43
45
|
name: 'test',
|
44
46
|
newName: 'production',
|
45
47
|
description: 'test',
|
46
|
-
permissionNames: ['test']
|
48
|
+
permissionNames: ['test'],
|
49
|
+
tenantId: 'test'
|
47
50
|
}
|
48
51
|
)
|
49
52
|
expect do
|
@@ -51,7 +54,8 @@ describe Descope::Api::V1::Management::Role do
|
|
51
54
|
name: 'test',
|
52
55
|
new_name: 'production',
|
53
56
|
description: 'test',
|
54
|
-
permission_names: ['test']
|
57
|
+
permission_names: ['test'],
|
58
|
+
tenant_id: 'test'
|
55
59
|
)
|
56
60
|
end.not_to raise_error
|
57
61
|
end
|
@@ -64,10 +68,10 @@ describe Descope::Api::V1::Management::Role do
|
|
64
68
|
|
65
69
|
it 'is expected to delete a role' do
|
66
70
|
expect(@instance).to receive(:post).with(
|
67
|
-
ROLE_DELETE_PATH, { name: 'test' }
|
71
|
+
ROLE_DELETE_PATH, { name: 'test', tenantId: 'test' }
|
68
72
|
)
|
69
73
|
expect do
|
70
|
-
@instance.delete_role('test')
|
74
|
+
@instance.delete_role(name: 'test', tenant_id: 'test')
|
71
75
|
end.not_to raise_error
|
72
76
|
end
|
73
77
|
end
|
@@ -82,4 +86,29 @@ describe Descope::Api::V1::Management::Role do
|
|
82
86
|
expect { @instance.load_all_roles }.not_to raise_error
|
83
87
|
end
|
84
88
|
end
|
89
|
+
|
90
|
+
context '.search_roles' do
|
91
|
+
it 'should respond to .search_roles' do
|
92
|
+
expect(@instance).to respond_to :search_roles
|
93
|
+
end
|
94
|
+
|
95
|
+
it 'is expected to search roles' do
|
96
|
+
expect(@instance).to receive(:post).with(
|
97
|
+
ROLE_SEARCH_PATH, {
|
98
|
+
roleNames: %w[tester test2],
|
99
|
+
tenantIds: %w[t1 t2],
|
100
|
+
roleNameLike: 'test',
|
101
|
+
permissionNames: %w[perm1 perm2]
|
102
|
+
}
|
103
|
+
)
|
104
|
+
expect do
|
105
|
+
@instance.search_roles(
|
106
|
+
role_names: %w[tester test2],
|
107
|
+
tenant_ids: %w[t1 t2],
|
108
|
+
role_name_like: 'test',
|
109
|
+
permission_names: %w[perm1 perm2]
|
110
|
+
)
|
111
|
+
end.not_to raise_error
|
112
|
+
end
|
113
|
+
end
|
85
114
|
end
|
@@ -548,6 +548,46 @@ describe Descope::Api::V1::Management::User do
|
|
548
548
|
end
|
549
549
|
end
|
550
550
|
|
551
|
+
context '.set_temporary_password' do
|
552
|
+
it 'is expected to respond to a set_temporary_password method' do
|
553
|
+
expect(@instance).to respond_to(:set_temporary_password)
|
554
|
+
|
555
|
+
expect(@instance).to receive(:post).with(
|
556
|
+
USER_SET_TEMPORARY_PASSWORD_PATH, {
|
557
|
+
loginId: 'someone@example.com',
|
558
|
+
password: 's3cr3t'
|
559
|
+
}
|
560
|
+
)
|
561
|
+
|
562
|
+
expect do
|
563
|
+
@instance.set_temporary_password(
|
564
|
+
login_id: 'someone@example.com',
|
565
|
+
password: 's3cr3t'
|
566
|
+
)
|
567
|
+
end.not_to raise_error
|
568
|
+
end
|
569
|
+
end
|
570
|
+
|
571
|
+
context '.set_active_password' do
|
572
|
+
it 'is expected to respond to a set_active_password method' do
|
573
|
+
expect(@instance).to respond_to(:set_active_password)
|
574
|
+
|
575
|
+
expect(@instance).to receive(:post).with(
|
576
|
+
USER_SET_ACTIVE_PASSWORD_PATH, {
|
577
|
+
loginId: 'someone@example.com',
|
578
|
+
password: 's3cr3t'
|
579
|
+
}
|
580
|
+
)
|
581
|
+
|
582
|
+
expect do
|
583
|
+
@instance.set_active_password(
|
584
|
+
login_id: 'someone@example.com',
|
585
|
+
password: 's3cr3t'
|
586
|
+
)
|
587
|
+
end.not_to raise_error
|
588
|
+
end
|
589
|
+
end
|
590
|
+
|
551
591
|
context '.set_password' do
|
552
592
|
it 'is expected to respond to a set_password method' do
|
553
593
|
expect(@instance).to respond_to(:set_password)
|
data/spec/spec_helper.rb
CHANGED
@@ -7,41 +7,27 @@ require 'base64'
|
|
7
7
|
require 'descope'
|
8
8
|
require 'super_diff/rspec'
|
9
9
|
require 'factory_bot'
|
10
|
-
|
11
|
-
if RUBY_VERSION >= '2.7.2'
|
12
|
-
# NOTE: https://bugs.ruby-lang.org/issues/17000
|
13
|
-
Warning[:deprecated] = true
|
14
|
-
end
|
15
|
-
|
16
10
|
require 'simplecov'
|
17
11
|
require 'simplecov-html'
|
18
|
-
|
19
|
-
SimpleCov.start
|
20
|
-
SimpleCov.formatter = SimpleCov::Formatter::HTMLFormatter
|
21
|
-
|
22
|
-
if ENV['CI'] == 'true'
|
23
|
-
require 'simplecov-cobertura'
|
24
|
-
SimpleCov.formatter = SimpleCov::Formatter::CoberturaFormatter
|
25
|
-
end
|
26
|
-
|
27
|
-
require 'webmock/rspec'
|
28
|
-
WebMock.allow_net_connect!
|
12
|
+
require 'rspec'
|
29
13
|
|
30
14
|
$LOAD_PATH.unshift File.expand_path('..', __FILE__)
|
31
15
|
$LOAD_PATH.unshift File.expand_path('../../lib', __FILE__)
|
32
16
|
|
33
|
-
Dir['./lib/*.rb'].each { |f| require f }
|
34
|
-
Dir['./lib/api/**/*.rb'].each { |f| require f }
|
35
|
-
Dir['./spec/support/**/*.rb'].each { |f| require f }
|
36
|
-
Dir['./spec/support/*.rb'].each { |f| require f }
|
37
|
-
|
38
17
|
include Descope::Api::V1::Management::Common
|
39
18
|
include Descope::Mixins::Common
|
40
19
|
include Descope::Mixins::Common::EndpointsV1
|
41
20
|
include Descope::Mixins::Common::EndpointsV2
|
42
21
|
include Descope::Api::V1::Auth
|
43
22
|
|
44
|
-
require
|
23
|
+
Dir['./lib/*.rb'].each { |f| require f }
|
24
|
+
Dir['./lib/api/**/*.rb'].each { |f| require f }
|
25
|
+
Dir['./spec/support/**/*.rb'].each { |f| require f }
|
26
|
+
Dir['./spec/support/*.rb'].each { |f| require f }
|
27
|
+
|
28
|
+
SimpleCov.start
|
29
|
+
SimpleCov.formatter = SimpleCov::Formatter::HTMLFormatter
|
30
|
+
|
45
31
|
RSpec.configure do |config|
|
46
32
|
config.filter_run focus: true
|
47
33
|
config.run_all_when_everything_filtered = true
|
@@ -55,18 +41,3 @@ RSpec.configure do |config|
|
|
55
41
|
FactoryBot.find_definitions
|
56
42
|
end
|
57
43
|
end
|
58
|
-
|
59
|
-
|
60
|
-
def wait(time, increment = 5, elapsed_time = 0, &block)
|
61
|
-
yield
|
62
|
-
rescue RSpec::Expectations::ExpectationNotMetError => e
|
63
|
-
raise e if elapsed_time >= time
|
64
|
-
sleep increment
|
65
|
-
wait(time, increment, elapsed_time + increment, &block)
|
66
|
-
end
|
67
|
-
|
68
|
-
def entity_suffix
|
69
|
-
'rubytest-210908'
|
70
|
-
end
|
71
|
-
|
72
|
-
puts "Entity suffix is #{entity_suffix}"
|
@@ -1,11 +1,15 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
+
|
3
4
|
module Configuration
|
4
5
|
module_function
|
5
6
|
|
6
7
|
def config
|
8
|
+
raise 'DESCOPE_MANAGEMENT_KEY is not set' if ENV['DESCOPE_MANAGEMENT_KEY'].nil?
|
9
|
+
raise 'DESCOPE_PROJECT_ID is not set' if ENV['DESCOPE_PROJECT_ID'].nil?
|
10
|
+
|
7
11
|
{
|
8
|
-
|
12
|
+
descope_base_uri: ENV.fetch('DESCOPE_BASE_URI', Descope::Mixins::Common::DEFAULT_BASE_URL),
|
9
13
|
project_id: ENV.fetch('DESCOPE_PROJECT_ID', nil),
|
10
14
|
management_key: ENV.fetch('DESCOPE_MANAGEMENT_KEY', nil),
|
11
15
|
log_level: ENV.fetch('DESCOPE_LOG_LEVEL', 'info')
|
data/spec/support/dummy_class.rb
CHANGED
@@ -5,6 +5,7 @@ class DummyClass
|
|
5
5
|
include Descope::Mixins::Headers
|
6
6
|
include Descope::Mixins::Common
|
7
7
|
include Descope::Mixins::Common::EndpointsV1
|
8
|
+
include Descope::Mixins::Common::EndpointsV2
|
8
9
|
include Descope::Api::V1::Management::Common
|
9
10
|
include Descope::Api::V1::Auth
|
10
11
|
|
@@ -22,7 +23,20 @@ class DummyClass
|
|
22
23
|
@management_key = 'management_key'
|
23
24
|
@public_keys = {}
|
24
25
|
@mlock = Mutex.new
|
25
|
-
@logger ||= Descope::Mixins::Logging.logger_for(self.class.name, 'info')
|
26
|
+
@logger ||= Descope::Mixins::Logging.logger_for(self.class.name, ENV.fetch('DESCOPE_LOG_LEVEL', 'info'))
|
27
|
+
end
|
28
|
+
|
29
|
+
def add_headers(h = {})
|
30
|
+
raise ArgumentError, 'Headers must be an object which responds to #to_hash' unless h.respond_to?(:to_hash)
|
31
|
+
|
32
|
+
@headers ||= {}
|
33
|
+
@headers.merge!(h.to_hash)
|
34
|
+
end
|
35
|
+
|
36
|
+
def authorization_header(pswd = nil)
|
37
|
+
pswd = @default_pswd if pswd.nil? || pswd.empty?
|
38
|
+
bearer = "#{@project_id}:#{pswd}"
|
39
|
+
add_headers('Authorization' => "Bearer #{bearer}")
|
26
40
|
end
|
27
41
|
|
28
42
|
%i[get post post_file post_form put patch delete delete_with_body].each do |method|
|
data/spec/support/utils.rb
CHANGED
@@ -16,7 +16,7 @@ module SpecUtils
|
|
16
16
|
special_chars.sample
|
17
17
|
|
18
18
|
# Fill in remaining characters randomly
|
19
|
-
|
19
|
+
5.times { password += [lowercase_characters, uppercase_characters, digits, special_chars].sample.sample }
|
20
20
|
|
21
21
|
# Randomize the order of characters to make the password less predictable
|
22
22
|
password.split('').shuffle.join
|