workos 4.8.0 → 5.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Gemfile.lock +1 -1
- data/lib/workos/client.rb +16 -4
- data/lib/workos/directory_sync.rb +0 -2
- data/lib/workos/errors.rb +18 -1
- data/lib/workos/events.rb +2 -0
- data/lib/workos/organizations.rb +44 -21
- data/lib/workos/version.rb +1 -1
- data/lib/workos.rb +3 -0
- data/spec/lib/workos/client.rb +67 -0
- data/spec/lib/workos/directory_sync_spec.rb +5 -28
- data/spec/lib/workos/event_spec.rb +13 -13
- data/spec/lib/workos/mfa_spec.rb +3 -3
- data/spec/lib/workos/organizations_spec.rb +2 -2
- data/spec/lib/workos/passwordless_spec.rb +2 -2
- data/spec/lib/workos/sso_spec.rb +2 -2
- data/spec/lib/workos/user_management_spec.rb +18 -18
- data/spec/support/fixtures/vcr_cassettes/base/execute_request_unauthenticated.yml +63 -63
- data/spec/support/fixtures/vcr_cassettes/events/list_events_with_after.yml +1 -1
- data/spec/support/fixtures/vcr_cassettes/events/list_events_with_no_options.yml +26 -25
- data/spec/support/fixtures/vcr_cassettes/events/list_events_with_organization_id.yml +1 -1
- data/spec/support/fixtures/vcr_cassettes/events/list_events_with_range.yml +1 -1
- metadata +4 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 928be28f91db58c18a6348d67d6a2db1ffd1de55a1bf84e65dad4b250cbd3c85
|
4
|
+
data.tar.gz: adc3b8e361b4e4da51155a8f68bb79209ad48946b650dcc930c6130dbb3261ee
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 82560b233bd0361d6be1ae87f71c92ebf6af803cfabd1ff0864470769a5a1b1892f052f62c1cd6c4c3f51472a4b1d4e59b720c22100f0e9f7664637ef80e77ed
|
7
|
+
data.tar.gz: 161ab6186cc0ed7230714da2d3a216d3a5727a73e478bddd674110cce88457a31dc70df2f20f4085535bd223f7f7bd14a3b432440ca04d6f863a4e05639827eb
|
data/Gemfile.lock
CHANGED
data/lib/workos/client.rb
CHANGED
@@ -86,7 +86,7 @@ module WorkOS
|
|
86
86
|
].join('; ')
|
87
87
|
end
|
88
88
|
|
89
|
-
# rubocop:disable Metrics/MethodLength, Metrics/AbcSize
|
89
|
+
# rubocop:disable Metrics/MethodLength, Metrics/AbcSize, Metrics/CyclomaticComplexity:
|
90
90
|
def handle_error_response(response:)
|
91
91
|
http_status = response.code.to_i
|
92
92
|
json = JSON.parse(response.body)
|
@@ -99,6 +99,9 @@ module WorkOS
|
|
99
99
|
request_id: response['x-request-id'],
|
100
100
|
code: json['code'],
|
101
101
|
errors: json['errors'],
|
102
|
+
error: json['error'],
|
103
|
+
error_description: json['error_description'],
|
104
|
+
data: json,
|
102
105
|
)
|
103
106
|
when 401
|
104
107
|
raise AuthenticationError.new(
|
@@ -107,7 +110,7 @@ module WorkOS
|
|
107
110
|
request_id: response['x-request-id'],
|
108
111
|
)
|
109
112
|
when 404
|
110
|
-
raise
|
113
|
+
raise NotFoundError.new(
|
111
114
|
message: json['message'],
|
112
115
|
http_status: http_status,
|
113
116
|
request_id: response['x-request-id'],
|
@@ -118,12 +121,21 @@ module WorkOS
|
|
118
121
|
errors = extract_error(json['errors']) if json['errors']
|
119
122
|
message += " (#{errors})" if errors
|
120
123
|
|
121
|
-
raise
|
124
|
+
raise UnprocessableEntityError.new(
|
122
125
|
message: message,
|
123
126
|
http_status: http_status,
|
124
127
|
request_id: response['x-request-id'],
|
128
|
+
error: json['error'],
|
129
|
+
errors: errors,
|
125
130
|
code: code,
|
126
131
|
)
|
132
|
+
when 429
|
133
|
+
raise RateLimitExceededError.new(
|
134
|
+
message: json['message'],
|
135
|
+
http_status: http_status,
|
136
|
+
request_id: response['x-request-id'],
|
137
|
+
retry_after: response['Retry-After'],
|
138
|
+
)
|
127
139
|
else
|
128
140
|
raise APIError.new(
|
129
141
|
message: json['message'],
|
@@ -132,7 +144,7 @@ module WorkOS
|
|
132
144
|
)
|
133
145
|
end
|
134
146
|
end
|
135
|
-
# rubocop:enable Metrics/MethodLength, Metrics/AbcSize
|
147
|
+
# rubocop:enable Metrics/MethodLength, Metrics/AbcSize, Metrics/CyclomaticComplexity:
|
136
148
|
|
137
149
|
private
|
138
150
|
|
@@ -15,8 +15,6 @@ module WorkOS
|
|
15
15
|
# Retrieve directories.
|
16
16
|
#
|
17
17
|
# @param [Hash] options An options hash
|
18
|
-
# @option options [String] domain The domain of the directory to be
|
19
|
-
# retrieved.
|
20
18
|
# @option options [String] search A search term for direcory names.
|
21
19
|
# @option options [String] limit Maximum number of records to return.
|
22
20
|
# @option options [String] order The order in which to paginate records
|
data/lib/workos/errors.rb
CHANGED
@@ -7,6 +7,10 @@ module WorkOS
|
|
7
7
|
attr_reader :request_id
|
8
8
|
attr_reader :code
|
9
9
|
attr_reader :errors
|
10
|
+
attr_reader :error
|
11
|
+
attr_reader :error_description
|
12
|
+
attr_reader :data
|
13
|
+
attr_reader :retry_after
|
10
14
|
|
11
15
|
# rubocop:disable Metrics/ParameterLists
|
12
16
|
def initialize(
|
@@ -16,7 +20,9 @@ module WorkOS
|
|
16
20
|
http_status: nil,
|
17
21
|
request_id: nil,
|
18
22
|
code: nil,
|
19
|
-
errors: nil
|
23
|
+
errors: nil,
|
24
|
+
data: nil,
|
25
|
+
retry_after: nil
|
20
26
|
)
|
21
27
|
@message = message
|
22
28
|
@error = error
|
@@ -25,6 +31,8 @@ module WorkOS
|
|
25
31
|
@request_id = request_id
|
26
32
|
@code = code
|
27
33
|
@errors = errors
|
34
|
+
@data = data
|
35
|
+
@retry_after = retry_after
|
28
36
|
end
|
29
37
|
# rubocop:enable Metrics/ParameterLists
|
30
38
|
|
@@ -62,4 +70,13 @@ module WorkOS
|
|
62
70
|
|
63
71
|
# TimeoutError is raised when the HTTP request to the API times out
|
64
72
|
class TimeoutError < WorkOSError; end
|
73
|
+
|
74
|
+
# RateLimitExceededError is raised when the rate limit for the API has been hit
|
75
|
+
class RateLimitExceededError < WorkOSError; end
|
76
|
+
|
77
|
+
# NotFoundError is raised when a resource is not found
|
78
|
+
class NotFoundError < WorkOSError; end
|
79
|
+
|
80
|
+
# UnprocessableEntityError is raised when a request is made that cannot be processed
|
81
|
+
class UnprocessableEntityError < WorkOSError; end
|
65
82
|
end
|
data/lib/workos/events.rb
CHANGED
data/lib/workos/organizations.rb
CHANGED
@@ -74,12 +74,13 @@ module WorkOS
|
|
74
74
|
# @param [Array<Hash>] domain_data List of domain hashes describing an orgnaization domain.
|
75
75
|
# @option domain_data [String] domain The domain that belongs to the organization.
|
76
76
|
# @option domain_data [String] state The state of the domain. "verified" or "pending"
|
77
|
-
# @param [Array<String>] domains List of domains that belong to the organization.
|
78
|
-
# Deprecated: Use domain_data instead.
|
79
77
|
# @param [String] name A unique, descriptive name for the organization
|
80
|
-
# @param [Boolean, nil] allow_profiles_outside_organization Whether Connections
|
81
|
-
# within the Organization allow profiles that are outside of the Organization's configured User Email Domains.
|
82
78
|
# @param [String] idempotency_key An idempotency key
|
79
|
+
# @param [Boolean, nil] allow_profiles_outside_organization Whether Connections
|
80
|
+
# within the Organization allow profiles that are outside of the Organization's configured User Email Domains.
|
81
|
+
# Deprecated: If you need to allow sign-ins from any email domain, contact suppport@workos.com.
|
82
|
+
# @param [Array<String>] domains List of domains that belong to the organization.
|
83
|
+
# Deprecated: Use domain_data instead.
|
83
84
|
def create_organization(
|
84
85
|
domain_data: nil,
|
85
86
|
domains: nil,
|
@@ -87,16 +88,23 @@ module WorkOS
|
|
87
88
|
allow_profiles_outside_organization: nil,
|
88
89
|
idempotency_key: nil
|
89
90
|
)
|
90
|
-
|
91
|
+
body = { name: name }
|
92
|
+
body[:domain_data] = domain_data if domain_data
|
93
|
+
|
94
|
+
if domains
|
95
|
+
warn_deprecation '`domains` is deprecated. Use `domain_data` instead.'
|
96
|
+
body[:domains] = domains
|
97
|
+
end
|
98
|
+
|
99
|
+
unless allow_profiles_outside_organization.nil?
|
100
|
+
warn_deprecation '`allow_profiles_outside_organization` is deprecated. ' \
|
101
|
+
'If you need to allow sign-ins from any email domain, contact support@workos.com.'
|
102
|
+
body[:allow_profiles_outside_organization] = allow_profiles_outside_organization
|
103
|
+
end
|
91
104
|
|
92
105
|
request = post_request(
|
93
106
|
auth: true,
|
94
|
-
body:
|
95
|
-
domain_data: domain_data,
|
96
|
-
domains: domains,
|
97
|
-
name: name,
|
98
|
-
allow_profiles_outside_organization: allow_profiles_outside_organization,
|
99
|
-
},
|
107
|
+
body: body,
|
100
108
|
path: '/organizations',
|
101
109
|
idempotency_key: idempotency_key,
|
102
110
|
)
|
@@ -113,21 +121,36 @@ module WorkOS
|
|
113
121
|
# @param [Array<Hash>] domain_data List of domain hashes describing an orgnaization domain.
|
114
122
|
# @option domain_data [String] domain The domain that belongs to the organization.
|
115
123
|
# @option domain_data [String] state The state of the domain. "verified" or "pending"
|
116
|
-
# @param [Array<String>] domains List of domains that belong to the organization.
|
117
|
-
# Deprecated: Use domain_data instead.
|
118
124
|
# @param [String] name A unique, descriptive name for the organization
|
119
125
|
# @param [Boolean, nil] allow_profiles_outside_organization Whether Connections
|
120
|
-
#
|
121
|
-
|
122
|
-
|
126
|
+
# within the Organization allow profiles that are outside of the Organization's configured User Email Domains.
|
127
|
+
# Deprecated: If you need to allow sign-ins from any email domain, contact suppport@workos.com.
|
128
|
+
# @param [Array<String>] domains List of domains that belong to the organization.
|
129
|
+
# Deprecated: Use domain_data instead.
|
130
|
+
def update_organization(
|
131
|
+
organization:,
|
132
|
+
domain_data: nil,
|
133
|
+
domains: nil,
|
134
|
+
name:,
|
135
|
+
allow_profiles_outside_organization: nil
|
136
|
+
)
|
137
|
+
body = { name: name }
|
138
|
+
body[:domain_data] = domain_data if domain_data
|
139
|
+
|
140
|
+
if domains
|
141
|
+
warn_deprecation '`domains` is deprecated. Use `domain_data` instead.'
|
142
|
+
body[:domains] = domains
|
143
|
+
end
|
144
|
+
|
145
|
+
unless allow_profiles_outside_organization.nil?
|
146
|
+
warn_deprecation '`allow_profiles_outside_organization` is deprecated. ' \
|
147
|
+
'If you need to allow sign-ins from any email domain, contact support@workos.com.'
|
148
|
+
body[:allow_profiles_outside_organization] = allow_profiles_outside_organization
|
149
|
+
end
|
123
150
|
|
124
151
|
request = put_request(
|
125
152
|
auth: true,
|
126
|
-
body:
|
127
|
-
domains: domains,
|
128
|
-
name: name,
|
129
|
-
allow_profiles_outside_organization: allow_profiles_outside_organization,
|
130
|
-
},
|
153
|
+
body: body,
|
131
154
|
path: "/organizations/#{organization}",
|
132
155
|
)
|
133
156
|
|
data/lib/workos/version.rb
CHANGED
data/lib/workos.rb
CHANGED
@@ -87,4 +87,7 @@ module WorkOS
|
|
87
87
|
autoload :InvalidRequestError, 'workos/errors'
|
88
88
|
autoload :SignatureVerificationError, 'workos/errors'
|
89
89
|
autoload :TimeoutError, 'workos/errors'
|
90
|
+
autoload :NotFoundError, 'workos/errors'
|
91
|
+
autoload :UnprocessableEntityError, 'workos/errors'
|
92
|
+
autoload :RateLimitExceededError, 'workos/errors'
|
90
93
|
end
|
@@ -0,0 +1,67 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# rubocop:disable Style/MultilineBlockChain
|
4
|
+
describe WorkOS::Client do
|
5
|
+
describe '.client' do
|
6
|
+
it 'returns a 400 error with appropriate fields' do
|
7
|
+
VCR.use_cassette('user_management/authenticate_with_code/invalid') do
|
8
|
+
expect do
|
9
|
+
WorkOS::UserManagement.authenticate_with_code(
|
10
|
+
code: 'invalid',
|
11
|
+
client_id: 'client_123',
|
12
|
+
ip_address: '200.240.210.16',
|
13
|
+
user_agent: 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) Chrome/108.0.0.0 Safari/537.36',
|
14
|
+
)
|
15
|
+
end.to raise_error do |error|
|
16
|
+
expect(error).to be_a(WorkOS::InvalidRequestError)
|
17
|
+
expect(error.error).not_to be_nil
|
18
|
+
expect(error.error_description).not_to be_nil
|
19
|
+
expect(error.data).not_to be_nil
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
it 'returns a 401 error with appropriate fields' do
|
25
|
+
VCR.use_cassette('base/execute_request_unauthenticated') do
|
26
|
+
expect do
|
27
|
+
WorkOS::AuditLogs.create_event(
|
28
|
+
organization: 'org_123',
|
29
|
+
event: {},
|
30
|
+
)
|
31
|
+
end.to raise_error do |error|
|
32
|
+
expect(error).to be_a(WorkOS::AuthenticationError)
|
33
|
+
expect(error.message).not_to be_nil
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
it 'returns a 404 error with appropriate fields' do
|
39
|
+
VCR.use_cassette('user_management/get_email_verification/invalid') do
|
40
|
+
expect do
|
41
|
+
WorkOS::UserManagement.get_email_verification(
|
42
|
+
id: 'invalid',
|
43
|
+
)
|
44
|
+
end.to raise_error do |error|
|
45
|
+
expect(error).to be_a(WorkOS::NotFoundError)
|
46
|
+
expect(error.message).not_to be_nil
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
it 'returns a 422 error with appropriate fields' do
|
52
|
+
VCR.use_cassette('user_management/create_user_invalid') do
|
53
|
+
expect do
|
54
|
+
WorkOS::UserManagement.create_user(
|
55
|
+
email: 'invalid',
|
56
|
+
)
|
57
|
+
end.to raise_error do |error|
|
58
|
+
expect(error).to be_a(WorkOS::UnprocessableEntityError)
|
59
|
+
expect(error.message).not_to be_nil
|
60
|
+
expect(error.errors).not_to be_nil
|
61
|
+
expect(error.code).not_to be_nil
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
67
|
+
# rubocop:enable Style/MultilineBlockChain
|
@@ -20,29 +20,6 @@ describe WorkOS::DirectorySync do
|
|
20
20
|
end
|
21
21
|
end
|
22
22
|
|
23
|
-
context 'with domain option' do
|
24
|
-
it 'forms the proper request to the API' do
|
25
|
-
request_args = [
|
26
|
-
'/directories?domain=foo-corp.com&'\
|
27
|
-
'order=desc',
|
28
|
-
'Content-Type' => 'application/json'
|
29
|
-
]
|
30
|
-
|
31
|
-
expected_request = Net::HTTP::Get.new(*request_args)
|
32
|
-
|
33
|
-
expect(Net::HTTP::Get).to receive(:new).with(*request_args).
|
34
|
-
and_return(expected_request)
|
35
|
-
|
36
|
-
VCR.use_cassette 'directory_sync/list_directories/with_domain' do
|
37
|
-
directories = described_class.list_directories(
|
38
|
-
domain: 'foo-corp.com',
|
39
|
-
)
|
40
|
-
|
41
|
-
expect(directories.data.size).to eq(1)
|
42
|
-
end
|
43
|
-
end
|
44
|
-
end
|
45
|
-
|
46
23
|
context 'with search option' do
|
47
24
|
it 'forms the proper request to the API' do
|
48
25
|
request_args = [
|
@@ -171,7 +148,7 @@ describe WorkOS::DirectorySync do
|
|
171
148
|
expect do
|
172
149
|
WorkOS::DirectorySync.get_directory(id: 'invalid')
|
173
150
|
end.to raise_error(
|
174
|
-
WorkOS::
|
151
|
+
WorkOS::NotFoundError,
|
175
152
|
"Status 404, Directory not found: 'invalid'. - request ID: ",
|
176
153
|
)
|
177
154
|
end
|
@@ -185,7 +162,7 @@ describe WorkOS::DirectorySync do
|
|
185
162
|
VCR.use_cassette('directory_sync/list_groups/with_no_options') do
|
186
163
|
expect do
|
187
164
|
WorkOS::DirectorySync.list_groups
|
188
|
-
end.to raise_error(WorkOS::
|
165
|
+
end.to raise_error(WorkOS::UnprocessableEntityError)
|
189
166
|
end
|
190
167
|
end
|
191
168
|
end
|
@@ -319,7 +296,7 @@ describe WorkOS::DirectorySync do
|
|
319
296
|
VCR.use_cassette('directory_sync/list_users/with_no_options') do
|
320
297
|
expect do
|
321
298
|
WorkOS::DirectorySync.list_users
|
322
|
-
end.to raise_error(WorkOS::
|
299
|
+
end.to raise_error(WorkOS::UnprocessableEntityError)
|
323
300
|
end
|
324
301
|
end
|
325
302
|
end
|
@@ -471,7 +448,7 @@ describe WorkOS::DirectorySync do
|
|
471
448
|
VCR.use_cassette('directory_sync/get_group_with_invalid_id') do
|
472
449
|
expect do
|
473
450
|
WorkOS::DirectorySync.get_group('invalid')
|
474
|
-
end.to raise_error(WorkOS::
|
451
|
+
end.to raise_error(WorkOS:: NotFoundError)
|
475
452
|
end
|
476
453
|
end
|
477
454
|
end
|
@@ -498,7 +475,7 @@ describe WorkOS::DirectorySync do
|
|
498
475
|
VCR.use_cassette('directory_sync/get_user_with_invalid_id') do
|
499
476
|
expect do
|
500
477
|
WorkOS::DirectorySync.get_user('invalid')
|
501
|
-
end.to raise_error(WorkOS::
|
478
|
+
end.to raise_error(WorkOS::NotFoundError)
|
502
479
|
end
|
503
480
|
end
|
504
481
|
end
|
@@ -5,16 +5,11 @@ describe WorkOS::Events do
|
|
5
5
|
|
6
6
|
describe '.list_events' do
|
7
7
|
context 'with no options' do
|
8
|
-
it '
|
9
|
-
expected_metadata = {
|
10
|
-
'after' => nil,
|
11
|
-
}
|
12
|
-
|
8
|
+
it 'raises ArgumentError' do
|
13
9
|
VCR.use_cassette 'events/list_events_with_no_options' do
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
expect(events.list_metadata).to eq(expected_metadata)
|
10
|
+
expect do
|
11
|
+
described_class.list_events
|
12
|
+
end.to raise_error(ArgumentError)
|
18
13
|
end
|
19
14
|
end
|
20
15
|
end
|
@@ -44,7 +39,7 @@ describe WorkOS::Events do
|
|
44
39
|
context 'with the after option' do
|
45
40
|
it 'forms the proper request to the API' do
|
46
41
|
request_args = [
|
47
|
-
'/events?after=event_01FGCPNV312FHFRCX0BYWHVSE1',
|
42
|
+
'/events?after=event_01FGCPNV312FHFRCX0BYWHVSE1&events=dsync.user.created',
|
48
43
|
'Content-Type' => 'application/json'
|
49
44
|
]
|
50
45
|
|
@@ -54,7 +49,10 @@ describe WorkOS::Events do
|
|
54
49
|
and_return(expected_request)
|
55
50
|
|
56
51
|
VCR.use_cassette 'events/list_events_with_after' do
|
57
|
-
events = described_class.list_events(
|
52
|
+
events = described_class.list_events(
|
53
|
+
after: 'event_01FGCPNV312FHFRCX0BYWHVSE1',
|
54
|
+
events: ['dsync.user.created'],
|
55
|
+
)
|
58
56
|
|
59
57
|
expect(events.data.size).to eq(1)
|
60
58
|
end
|
@@ -64,7 +62,7 @@ describe WorkOS::Events do
|
|
64
62
|
context 'with the range_start and range_end options' do
|
65
63
|
it 'forms the proper request to the API' do
|
66
64
|
request_args = [
|
67
|
-
'/events?range_start=2023-01-01T00%3A00%3A00Z&range_end=2023-01-03T00%3A00%3A00Z',
|
65
|
+
'/events?events=dsync.user.created&range_start=2023-01-01T00%3A00%3A00Z&range_end=2023-01-03T00%3A00%3A00Z',
|
68
66
|
'Content-Type' => 'application/json'
|
69
67
|
]
|
70
68
|
|
@@ -75,6 +73,7 @@ describe WorkOS::Events do
|
|
75
73
|
|
76
74
|
VCR.use_cassette 'events/list_events_with_range' do
|
77
75
|
events = described_class.list_events(
|
76
|
+
events: ['dsync.user.created'],
|
78
77
|
range_start: '2023-01-01T00:00:00Z',
|
79
78
|
range_end: '2023-01-03T00:00:00Z',
|
80
79
|
)
|
@@ -87,7 +86,7 @@ describe WorkOS::Events do
|
|
87
86
|
context 'with the organization_id option' do
|
88
87
|
it 'forms the proper request to the API' do
|
89
88
|
request_args = [
|
90
|
-
'/events?organization_id=org_1234',
|
89
|
+
'/events?events=dsync.user.created&organization_id=org_1234',
|
91
90
|
'Content-Type' => 'application/json'
|
92
91
|
]
|
93
92
|
|
@@ -98,6 +97,7 @@ describe WorkOS::Events do
|
|
98
97
|
|
99
98
|
VCR.use_cassette 'events/list_events_with_organization_id' do
|
100
99
|
events = described_class.list_events(
|
100
|
+
events: ['dsync.user.created'],
|
101
101
|
organization_id: 'org_1234',
|
102
102
|
)
|
103
103
|
|
data/spec/lib/workos/mfa_spec.rb
CHANGED
@@ -188,7 +188,7 @@ describe WorkOS::MFA do
|
|
188
188
|
authentication_challenge_id: 'auth_challenge_01FZ4YVRBMXP5ZM0A7BP4AJ12J',
|
189
189
|
code: '897792',
|
190
190
|
)
|
191
|
-
end.to raise_error(WorkOS::
|
191
|
+
end.to raise_error(WorkOS::UnprocessableEntityError)
|
192
192
|
end
|
193
193
|
end
|
194
194
|
end
|
@@ -201,7 +201,7 @@ describe WorkOS::MFA do
|
|
201
201
|
authentication_challenge_id: 'auth_challenge_01FZ4YVRBMXP5ZM0A7BP4AJ12J',
|
202
202
|
code: '897792',
|
203
203
|
)
|
204
|
-
end.to raise_error(WorkOS::
|
204
|
+
end.to raise_error(WorkOS::UnprocessableEntityError)
|
205
205
|
end
|
206
206
|
end
|
207
207
|
end
|
@@ -264,7 +264,7 @@ describe WorkOS::MFA do
|
|
264
264
|
described_class.get_factor(
|
265
265
|
id: 'auth_factor_invalid',
|
266
266
|
)
|
267
|
-
end.to raise_error(WorkOS::
|
267
|
+
end.to raise_error(WorkOS::NotFoundError)
|
268
268
|
end
|
269
269
|
end
|
270
270
|
end
|
@@ -257,7 +257,7 @@ describe WorkOS::Organizations do
|
|
257
257
|
expect do
|
258
258
|
described_class.get_organization(id: 'invalid')
|
259
259
|
end.to raise_error(
|
260
|
-
WorkOS::
|
260
|
+
WorkOS::NotFoundError,
|
261
261
|
'Status 404, Not Found - request ID: ',
|
262
262
|
)
|
263
263
|
end
|
@@ -302,7 +302,7 @@ describe WorkOS::Organizations do
|
|
302
302
|
expect do
|
303
303
|
described_class.delete_organization(id: 'invalid')
|
304
304
|
end.to raise_error(
|
305
|
-
WorkOS::
|
305
|
+
WorkOS::NotFoundError,
|
306
306
|
'Status 404, Not Found - request ID: ',
|
307
307
|
)
|
308
308
|
end
|
@@ -32,7 +32,7 @@ describe WorkOS::Passwordless do
|
|
32
32
|
expect do
|
33
33
|
described_class.create_session(invalid_options)
|
34
34
|
end.to raise_error(
|
35
|
-
WorkOS::
|
35
|
+
WorkOS::UnprocessableEntityError,
|
36
36
|
/Status 422, Validation failed \(email: email must be a string; type: type must be a valid enum value\)/,
|
37
37
|
)
|
38
38
|
end
|
@@ -66,7 +66,7 @@ describe WorkOS::Passwordless do
|
|
66
66
|
expect do
|
67
67
|
described_class.send_session('session_123')
|
68
68
|
end.to raise_error(
|
69
|
-
WorkOS::
|
69
|
+
WorkOS::UnprocessableEntityError,
|
70
70
|
/Status 422, The passwordless session 'session_123' has expired or is invalid./,
|
71
71
|
)
|
72
72
|
end
|
data/spec/lib/workos/sso_spec.rb
CHANGED
@@ -618,7 +618,7 @@ describe WorkOS::SSO do
|
|
618
618
|
expect do
|
619
619
|
WorkOS::SSO.get_connection(id: 'invalid')
|
620
620
|
end.to raise_error(
|
621
|
-
WorkOS::
|
621
|
+
WorkOS::NotFoundError,
|
622
622
|
'Status 404, Not Found - request ID: ',
|
623
623
|
)
|
624
624
|
end
|
@@ -645,7 +645,7 @@ describe WorkOS::SSO do
|
|
645
645
|
expect do
|
646
646
|
WorkOS::SSO.delete_connection(id: 'invalid')
|
647
647
|
end.to raise_error(
|
648
|
-
WorkOS::
|
648
|
+
WorkOS::NotFoundError,
|
649
649
|
'Status 404, Not Found - request ID: ',
|
650
650
|
)
|
651
651
|
end
|
@@ -312,7 +312,7 @@ describe WorkOS::UserManagement do
|
|
312
312
|
expect do
|
313
313
|
described_class.create_user(email: '')
|
314
314
|
end.to raise_error(
|
315
|
-
WorkOS::
|
315
|
+
WorkOS::UnprocessableEntityError,
|
316
316
|
/email_string_required/,
|
317
317
|
)
|
318
318
|
end
|
@@ -342,7 +342,7 @@ describe WorkOS::UserManagement do
|
|
342
342
|
VCR.use_cassette 'user_management/update_user/invalid' do
|
343
343
|
expect do
|
344
344
|
described_class.update_user(id: 'invalid')
|
345
|
-
end.to raise_error(WorkOS::
|
345
|
+
end.to raise_error(WorkOS::NotFoundError, /User not found/)
|
346
346
|
end
|
347
347
|
end
|
348
348
|
end
|
@@ -367,7 +367,7 @@ describe WorkOS::UserManagement do
|
|
367
367
|
VCR.use_cassette('user_management/delete_user/invalid') do
|
368
368
|
expect do
|
369
369
|
WorkOS::UserManagement.delete_user(id: 'invalid')
|
370
|
-
end.to raise_error(WorkOS::
|
370
|
+
end.to raise_error(WorkOS::NotFoundError, /User not found/)
|
371
371
|
end
|
372
372
|
end
|
373
373
|
end
|
@@ -400,7 +400,7 @@ describe WorkOS::UserManagement do
|
|
400
400
|
ip_address: '200.240.210.16',
|
401
401
|
user_agent: 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) Chrome/108.0.0.0 Safari/537.36',
|
402
402
|
)
|
403
|
-
end.to raise_error(WorkOS::
|
403
|
+
end.to raise_error(WorkOS::NotFoundError, /User not found/)
|
404
404
|
end
|
405
405
|
end
|
406
406
|
end
|
@@ -512,7 +512,7 @@ describe WorkOS::UserManagement do
|
|
512
512
|
client_id: 'client_123',
|
513
513
|
email: 'test@workos.com',
|
514
514
|
)
|
515
|
-
end.to raise_error(WorkOS::
|
515
|
+
end.to raise_error(WorkOS::NotFoundError, /User not found/)
|
516
516
|
end
|
517
517
|
end
|
518
518
|
end
|
@@ -637,7 +637,7 @@ describe WorkOS::UserManagement do
|
|
637
637
|
VCR.use_cassette('user_management/get_magic_auth/invalid') do
|
638
638
|
expect do
|
639
639
|
WorkOS::UserManagement.get_magic_auth(id: 'invalid')
|
640
|
-
end.to raise_error(WorkOS::
|
640
|
+
end.to raise_error(WorkOS::NotFoundError, /MagicAuth not found/)
|
641
641
|
end
|
642
642
|
end
|
643
643
|
end
|
@@ -756,7 +756,7 @@ describe WorkOS::UserManagement do
|
|
756
756
|
VCR.use_cassette('user_management/get_email_verification/invalid') do
|
757
757
|
expect do
|
758
758
|
WorkOS::UserManagement.get_email_verification(id: 'invalid')
|
759
|
-
end.to raise_error(WorkOS::
|
759
|
+
end.to raise_error(WorkOS::NotFoundError, /Email Verification not found/)
|
760
760
|
end
|
761
761
|
end
|
762
762
|
end
|
@@ -781,7 +781,7 @@ describe WorkOS::UserManagement do
|
|
781
781
|
described_class.send_verification_email(
|
782
782
|
user_id: 'bad_id',
|
783
783
|
)
|
784
|
-
end.to raise_error(WorkOS::
|
784
|
+
end.to raise_error(WorkOS::NotFoundError, /User not found/)
|
785
785
|
end
|
786
786
|
end
|
787
787
|
end
|
@@ -810,7 +810,7 @@ describe WorkOS::UserManagement do
|
|
810
810
|
code: '659770',
|
811
811
|
user_id: 'bad_id',
|
812
812
|
)
|
813
|
-
end.to raise_error(WorkOS::
|
813
|
+
end.to raise_error(WorkOS::NotFoundError, /User not found/)
|
814
814
|
end
|
815
815
|
end
|
816
816
|
end
|
@@ -849,7 +849,7 @@ describe WorkOS::UserManagement do
|
|
849
849
|
VCR.use_cassette('user_management/get_password_reset/invalid') do
|
850
850
|
expect do
|
851
851
|
WorkOS::UserManagement.get_password_reset(id: 'invalid')
|
852
|
-
end.to raise_error(WorkOS::
|
852
|
+
end.to raise_error(WorkOS::NotFoundError, /Password Reset not found/)
|
853
853
|
end
|
854
854
|
end
|
855
855
|
end
|
@@ -893,7 +893,7 @@ describe WorkOS::UserManagement do
|
|
893
893
|
password_reset_url: '',
|
894
894
|
)
|
895
895
|
end.to raise_error(
|
896
|
-
WorkOS::
|
896
|
+
WorkOS::UnprocessableEntityError,
|
897
897
|
/password_reset_url_string_required/,
|
898
898
|
)
|
899
899
|
end
|
@@ -924,7 +924,7 @@ describe WorkOS::UserManagement do
|
|
924
924
|
new_password: 'new_password',
|
925
925
|
)
|
926
926
|
end.to raise_error(
|
927
|
-
WorkOS::
|
927
|
+
WorkOS::NotFoundError,
|
928
928
|
/Could not locate user with provided token/,
|
929
929
|
)
|
930
930
|
end
|
@@ -1048,7 +1048,7 @@ describe WorkOS::UserManagement do
|
|
1048
1048
|
expect do
|
1049
1049
|
described_class.create_organization_membership(user_id: '', organization_id: '')
|
1050
1050
|
end.to raise_error(
|
1051
|
-
WorkOS::
|
1051
|
+
WorkOS::UnprocessableEntityError,
|
1052
1052
|
/user_id_string_required/,
|
1053
1053
|
)
|
1054
1054
|
end
|
@@ -1075,7 +1075,7 @@ describe WorkOS::UserManagement do
|
|
1075
1075
|
VCR.use_cassette('user_management/delete_organization_membership/invalid') do
|
1076
1076
|
expect do
|
1077
1077
|
WorkOS::UserManagement.delete_organization_membership(id: 'invalid')
|
1078
|
-
end.to raise_error(WorkOS::
|
1078
|
+
end.to raise_error(WorkOS::NotFoundError, /Organization Membership not found/)
|
1079
1079
|
end
|
1080
1080
|
end
|
1081
1081
|
end
|
@@ -1150,7 +1150,7 @@ describe WorkOS::UserManagement do
|
|
1150
1150
|
VCR.use_cassette('user_management/get_invitation/invalid') do
|
1151
1151
|
expect do
|
1152
1152
|
WorkOS::UserManagement.get_invitation(id: 'invalid')
|
1153
|
-
end.to raise_error(WorkOS::
|
1153
|
+
end.to raise_error(WorkOS::NotFoundError, /Invitation not found/)
|
1154
1154
|
end
|
1155
1155
|
end
|
1156
1156
|
end
|
@@ -1175,7 +1175,7 @@ describe WorkOS::UserManagement do
|
|
1175
1175
|
VCR.use_cassette('user_management/find_invitation_by_token/invalid') do
|
1176
1176
|
expect do
|
1177
1177
|
WorkOS::UserManagement.find_invitation_by_token(token: 'invalid')
|
1178
|
-
end.to raise_error(WorkOS::
|
1178
|
+
end.to raise_error(WorkOS::NotFoundError, /Invitation not found/)
|
1179
1179
|
end
|
1180
1180
|
end
|
1181
1181
|
end
|
@@ -1346,7 +1346,7 @@ describe WorkOS::UserManagement do
|
|
1346
1346
|
id: 'invalid_id',
|
1347
1347
|
)
|
1348
1348
|
end.to raise_error(
|
1349
|
-
WorkOS::
|
1349
|
+
WorkOS::NotFoundError,
|
1350
1350
|
/Invitation not found/,
|
1351
1351
|
)
|
1352
1352
|
end
|
@@ -1375,7 +1375,7 @@ describe WorkOS::UserManagement do
|
|
1375
1375
|
session_id: 'session_01H5JQDV7R7ATEYZDEG0W5PRYS',
|
1376
1376
|
)
|
1377
1377
|
end.to raise_error(
|
1378
|
-
WorkOS::
|
1378
|
+
WorkOS::NotFoundError,
|
1379
1379
|
/Session not found/,
|
1380
1380
|
)
|
1381
1381
|
end
|
@@ -1,66 +1,66 @@
|
|
1
1
|
---
|
2
2
|
http_interactions:
|
3
|
-
- request:
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
3
|
+
- request:
|
4
|
+
method: post
|
5
|
+
uri: https://api.workos.com/audit_logs/events
|
6
|
+
body:
|
7
|
+
encoding: UTF-8
|
8
|
+
string: '{}'
|
9
|
+
headers:
|
10
|
+
Content-Type:
|
11
|
+
- application/json
|
12
|
+
Accept-Encoding:
|
13
|
+
- gzip;q=1.0,deflate;q=0.6,identity;q=0.3
|
14
|
+
Accept:
|
15
|
+
- '*/*'
|
16
|
+
User-Agent:
|
17
|
+
- WorkOS; ruby/2.6.5; x86_64-darwin19; v0.1.0
|
18
|
+
Authorization:
|
19
|
+
- 'Bearer '
|
20
|
+
response:
|
21
|
+
status:
|
22
|
+
code: 401
|
23
|
+
message: Unauthorized
|
24
|
+
headers:
|
25
|
+
Server:
|
26
|
+
- Cowboy
|
27
|
+
Connection:
|
28
|
+
- keep-alive
|
29
|
+
Access-Control-Allow-Origin:
|
30
|
+
- https://dashboard.workos-test.com
|
31
|
+
Vary:
|
32
|
+
- Origin, Accept-Encoding
|
33
|
+
Access-Control-Allow-Credentials:
|
34
|
+
- 'true'
|
35
|
+
X-Dns-Prefetch-Control:
|
36
|
+
- 'off'
|
37
|
+
X-Frame-Options:
|
38
|
+
- SAMEORIGIN
|
39
|
+
Strict-Transport-Security:
|
40
|
+
- max-age=15552000; includeSubDomains
|
41
|
+
X-Download-Options:
|
42
|
+
- noopen
|
43
|
+
X-Content-Type-Options:
|
44
|
+
- nosniff
|
45
|
+
X-Xss-Protection:
|
46
|
+
- 1; mode=block
|
47
|
+
X-Request-Id:
|
48
|
+
- 32a67a24-bfaf-4463-bf47-c407d54955d3
|
49
|
+
Request-Id:
|
50
|
+
- 32a67a24-bfaf-4463-bf47-c407d54955d3
|
51
|
+
Content-Type:
|
52
|
+
- application/json; charset=utf-8
|
53
|
+
Content-Length:
|
54
|
+
- '26'
|
55
|
+
Etag:
|
56
|
+
- W/"1a-pljHtlo127JYJR4E/RYOPb6ucbw"
|
57
|
+
Date:
|
58
|
+
- Sat, 11 Jan 2020 03:50:27 GMT
|
59
|
+
Via:
|
60
|
+
- 1.1 vegur
|
61
|
+
body:
|
62
|
+
encoding: UTF-8
|
63
|
+
string: '{"message":"Unauthorized"}'
|
64
|
+
http_version:
|
65
|
+
recorded_at: Sat, 11 Jan 2020 03:50:27 GMT
|
66
66
|
recorded_with: VCR 5.0.0
|
@@ -14,40 +14,42 @@ http_interactions:
|
|
14
14
|
Accept:
|
15
15
|
- "*/*"
|
16
16
|
User-Agent:
|
17
|
-
- WorkOS; ruby/
|
17
|
+
- WorkOS; ruby/3.3.0; arm64-darwin23; v4.1.0
|
18
18
|
Authorization:
|
19
19
|
- Bearer <API_KEY>
|
20
20
|
response:
|
21
21
|
status:
|
22
|
-
code:
|
23
|
-
message:
|
22
|
+
code: 400
|
23
|
+
message: Bad Request
|
24
24
|
headers:
|
25
25
|
Date:
|
26
|
-
- Thu,
|
26
|
+
- Thu, 11 Apr 2024 15:44:49 GMT
|
27
27
|
Content-Type:
|
28
28
|
- application/json; charset=utf-8
|
29
29
|
Content-Length:
|
30
|
-
- '
|
30
|
+
- '140'
|
31
31
|
Connection:
|
32
32
|
- keep-alive
|
33
|
+
Cf-Ray:
|
34
|
+
- 872c19a65dcb3af9-IAD
|
35
|
+
Cf-Cache-Status:
|
36
|
+
- DYNAMIC
|
37
|
+
Etag:
|
38
|
+
- W/"8c-3NPoweNh0oXUDzElVKxg5PG7PWk"
|
39
|
+
Strict-Transport-Security:
|
40
|
+
- max-age=15552000; includeSubDomains
|
41
|
+
Vary:
|
42
|
+
- Origin, Accept-Encoding
|
33
43
|
Access-Control-Allow-Credentials:
|
34
44
|
- 'true'
|
35
45
|
Content-Security-Policy:
|
36
46
|
- 'default-src ''self'';base-uri ''self'';block-all-mixed-content;font-src ''self''
|
37
47
|
https: data:;frame-ancestors ''self'';img-src ''self'' data:;object-src ''none'';script-src
|
38
48
|
''self'';script-src-attr ''none'';style-src ''self'' https: ''unsafe-inline'';upgrade-insecure-requests'
|
39
|
-
Etag:
|
40
|
-
- W/"680-NPvBik348v8xg6EE7iZMYwD5UXw"
|
41
49
|
Expect-Ct:
|
42
50
|
- max-age=0
|
43
51
|
Referrer-Policy:
|
44
52
|
- no-referrer
|
45
|
-
Strict-Transport-Security:
|
46
|
-
- max-age=15552000; includeSubDomains
|
47
|
-
Vary:
|
48
|
-
- Origin, Accept-Encoding
|
49
|
-
Via:
|
50
|
-
- 1.1 spaces-router (b642bf20b975)
|
51
53
|
X-Content-Type-Options:
|
52
54
|
- nosniff
|
53
55
|
X-Dns-Prefetch-Control:
|
@@ -59,22 +61,21 @@ http_interactions:
|
|
59
61
|
X-Permitted-Cross-Domain-Policies:
|
60
62
|
- none
|
61
63
|
X-Request-Id:
|
62
|
-
-
|
64
|
+
- 660c0035-b70d-4939-a0d3-2b0917535e7f
|
63
65
|
X-Xss-Protection:
|
64
66
|
- '0'
|
65
|
-
|
66
|
-
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
67
|
+
Set-Cookie:
|
68
|
+
- __cf_bm=UpBr7jsatrWLaunHA8NhaflwkUco6FBxeXhgwz2bAoM-1712850289-1.0.1.1-KJCKaoohiG088DieTdV2V91AtW1fbs7ec.x7gsal9xsVzA2OPf67b0R__57KFvEsEZ97obgydtH.VEwyYhpGTw;
|
69
|
+
path=/; expires=Thu, 11-Apr-24 16:14:49 GMT; domain=.workos.com; HttpOnly;
|
70
|
+
Secure; SameSite=None
|
71
|
+
- __cfruid=bbad8ba60df9a023f0ba77749b5c0b92162e6ed3-1712850289; path=/; domain=.workos.com;
|
72
|
+
HttpOnly; Secure; SameSite=None
|
71
73
|
Server:
|
72
74
|
- cloudflare
|
73
|
-
Cf-Ray:
|
74
|
-
- 72abbbf2b93e8ca5-EWR
|
75
75
|
body:
|
76
|
-
encoding:
|
77
|
-
string: '{"
|
76
|
+
encoding: UTF-8
|
77
|
+
string: '{"message":"One or more event names (e.g. dsync.user.created) must
|
78
|
+
be provided using the events parameter.","code":"invalid_events_request"}'
|
78
79
|
http_version:
|
79
|
-
recorded_at: Thu,
|
80
|
+
recorded_at: Thu, 11 Apr 2024 15:44:49 GMT
|
80
81
|
recorded_with: VCR 5.0.0
|
@@ -2,7 +2,7 @@
|
|
2
2
|
http_interactions:
|
3
3
|
- request:
|
4
4
|
method: get
|
5
|
-
uri: https://api.workos.com/events?range_end=2023-01-03T00:00:00Z&range_start=2023-01-01T00:00:00Z
|
5
|
+
uri: https://api.workos.com/events?events=dsync.user.created&range_end=2023-01-03T00:00:00Z&range_start=2023-01-01T00:00:00Z
|
6
6
|
body:
|
7
7
|
encoding: US-ASCII
|
8
8
|
string: ''
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: workos
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 5.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- WorkOS
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2024-06-
|
11
|
+
date: 2024-06-20 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -152,6 +152,7 @@ files:
|
|
152
152
|
- lib/workos/webhook.rb
|
153
153
|
- lib/workos/webhooks.rb
|
154
154
|
- spec/lib/workos/audit_logs_spec.rb
|
155
|
+
- spec/lib/workos/client.rb
|
155
156
|
- spec/lib/workos/configuration_spec.rb
|
156
157
|
- spec/lib/workos/directory_sync_spec.rb
|
157
158
|
- spec/lib/workos/directory_user_spec.rb
|
@@ -359,6 +360,7 @@ specification_version: 4
|
|
359
360
|
summary: API client for WorkOS
|
360
361
|
test_files:
|
361
362
|
- spec/lib/workos/audit_logs_spec.rb
|
363
|
+
- spec/lib/workos/client.rb
|
362
364
|
- spec/lib/workos/configuration_spec.rb
|
363
365
|
- spec/lib/workos/directory_sync_spec.rb
|
364
366
|
- spec/lib/workos/directory_user_spec.rb
|