workos 0.11.0 → 1.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.
- checksums.yaml +4 -4
- data/Gemfile.lock +2 -2
- data/LICENSE +1 -1
- data/README.md +13 -230
- data/lib/workos/client.rb +18 -1
- data/lib/workos/connection.rb +5 -1
- data/lib/workos/directory_user.rb +4 -1
- data/lib/workos/organizations.rb +150 -0
- data/lib/workos/passwordless.rb +4 -0
- data/lib/workos/portal.rb +0 -80
- data/lib/workos/profile_and_token.rb +28 -0
- data/lib/workos/sso.rb +8 -100
- data/lib/workos/types/connection_struct.rb +1 -0
- data/lib/workos/types/directory_user_struct.rb +1 -0
- data/lib/workos/version.rb +1 -1
- data/lib/workos.rb +2 -0
- data/spec/lib/workos/organizations_spec.rb +164 -0
- data/spec/lib/workos/portal_spec.rb +0 -113
- data/spec/lib/workos/sso_spec.rb +9 -120
- data/spec/support/fixtures/vcr_cassettes/organization/get.yml +73 -0
- data/spec/support/fixtures/vcr_cassettes/{sso/create_connection_with_invalid_source.yml → organization/get_invalid.yml} +26 -12
- data/spec/support/fixtures/vcr_cassettes/organization/update.yml +73 -0
- data/spec/support/fixtures/vcr_cassettes/organization/update_invalid.yml +73 -0
- metadata +15 -7
- data/spec/support/fixtures/vcr_cassettes/sso/create_connection_with_valid_source.yml +0 -63
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
# typed: true
|
|
3
|
+
|
|
4
|
+
module WorkOS
|
|
5
|
+
# The ProfileAndToken class represents a Profile and a corresponding
|
|
6
|
+
# Access Token. This class is not meant to be instantiated in user space, and
|
|
7
|
+
# is instantiated internally but exposed.
|
|
8
|
+
class ProfileAndToken
|
|
9
|
+
extend T::Sig
|
|
10
|
+
|
|
11
|
+
attr_accessor :access_token, :profile
|
|
12
|
+
|
|
13
|
+
sig { params(profile_and_token_json: String).void }
|
|
14
|
+
def initialize(profile_and_token_json)
|
|
15
|
+
json = JSON.parse(profile_and_token_json, symbolize_names: true)
|
|
16
|
+
|
|
17
|
+
@access_token = T.let(json[:access_token], String)
|
|
18
|
+
@profile = WorkOS::Profile.new(profile_and_token_json)
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
def to_json(*)
|
|
22
|
+
{
|
|
23
|
+
access_token: access_token,
|
|
24
|
+
profile: profile.to_json,
|
|
25
|
+
}
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
end
|
data/lib/workos/sso.rb
CHANGED
|
@@ -30,8 +30,6 @@ module WorkOS
|
|
|
30
30
|
# WorkOS.
|
|
31
31
|
# @param [String] client_id The WorkOS client ID for the environment
|
|
32
32
|
# where you've configured your SSO connection.
|
|
33
|
-
# @param [String] project_id The WorkOS project ID for the project.
|
|
34
|
-
# The project_id is deprecated in Dashboard2.
|
|
35
33
|
# @param [String] redirect_uri The URI where users are directed
|
|
36
34
|
# after completing the authentication step. Must match a
|
|
37
35
|
# configured redirect URI on your WorkOS dashboard.
|
|
@@ -56,7 +54,6 @@ module WorkOS
|
|
|
56
54
|
sig do
|
|
57
55
|
params(
|
|
58
56
|
redirect_uri: String,
|
|
59
|
-
project_id: T.nilable(String),
|
|
60
57
|
client_id: T.nilable(String),
|
|
61
58
|
domain: T.nilable(String),
|
|
62
59
|
provider: T.nilable(String),
|
|
@@ -64,22 +61,14 @@ module WorkOS
|
|
|
64
61
|
state: T.nilable(String),
|
|
65
62
|
).returns(String)
|
|
66
63
|
end
|
|
67
|
-
# rubocop:disable Metrics/MethodLength, Metrics/ParameterLists
|
|
68
64
|
def authorization_url(
|
|
69
65
|
redirect_uri:,
|
|
70
|
-
project_id: nil,
|
|
71
66
|
client_id: nil,
|
|
72
67
|
domain: nil,
|
|
73
68
|
provider: nil,
|
|
74
69
|
connection: nil,
|
|
75
70
|
state: ''
|
|
76
71
|
)
|
|
77
|
-
if project_id
|
|
78
|
-
warn '[DEPRECATION] `project_id` is deprecated.
|
|
79
|
-
Please use `client_id` instead.'
|
|
80
|
-
client_id = project_id
|
|
81
|
-
end
|
|
82
|
-
|
|
83
72
|
validate_authorization_url_arguments(
|
|
84
73
|
provider: provider,
|
|
85
74
|
domain: domain,
|
|
@@ -98,46 +87,21 @@ module WorkOS
|
|
|
98
87
|
|
|
99
88
|
"https://#{WorkOS::API_HOSTNAME}/sso/authorize?#{query}"
|
|
100
89
|
end
|
|
101
|
-
# rubocop:enable Metrics/MethodLength, Metrics/ParameterLists
|
|
102
90
|
|
|
103
91
|
# Fetch the profile details for the authenticated SSO user.
|
|
104
92
|
#
|
|
105
93
|
# @param [String] code The authorization code provided in the callback URL
|
|
106
94
|
# @param [String] client_id The WorkOS client ID for the environment
|
|
107
|
-
# where you've
|
|
108
|
-
# @param [String] project_id The WorkOS project ID for the project.
|
|
109
|
-
# The project_id is deprecated in Dashboard2.
|
|
110
|
-
#
|
|
111
|
-
# @example
|
|
112
|
-
# WorkOS::SSO.profile(
|
|
113
|
-
# code: 'acme.com',
|
|
114
|
-
# client_id: 'project_01DG5TGK363GRVXP3ZS40WNGEZ'
|
|
115
|
-
# )
|
|
116
|
-
# => #<WorkOS::Profile:0x00007fb6e4193d20
|
|
117
|
-
# @id="prof_01DRA1XNSJDZ19A31F183ECQW5",
|
|
118
|
-
# @email="demo@workos-okta.com",
|
|
119
|
-
# @first_name="WorkOS",
|
|
120
|
-
# @connection_type="OktaSAML",
|
|
121
|
-
# @last_name="Demo",
|
|
122
|
-
# @idp_id="00u1klkowm8EGah2H357",
|
|
123
|
-
# @access_token="01DVX6QBS3EG6FHY2ESAA5Q65X"
|
|
124
|
-
# >
|
|
95
|
+
# where you've configured your SSO connection
|
|
125
96
|
#
|
|
126
|
-
# @return [WorkOS::
|
|
97
|
+
# @return [WorkOS::ProfileAndToken]
|
|
127
98
|
sig do
|
|
128
99
|
params(
|
|
129
100
|
code: String,
|
|
130
|
-
project_id: T.nilable(String),
|
|
131
101
|
client_id: T.nilable(String),
|
|
132
|
-
).returns(WorkOS::
|
|
102
|
+
).returns(WorkOS::ProfileAndToken)
|
|
133
103
|
end
|
|
134
|
-
def
|
|
135
|
-
if project_id
|
|
136
|
-
warn '[DEPRECATION] `project_id` is deprecated.
|
|
137
|
-
Please use `client_id` instead.'
|
|
138
|
-
client_id = project_id
|
|
139
|
-
end
|
|
140
|
-
|
|
104
|
+
def profile_and_token(code:, client_id: nil)
|
|
141
105
|
body = {
|
|
142
106
|
client_id: client_id,
|
|
143
107
|
client_secret: WorkOS.key!,
|
|
@@ -146,65 +110,9 @@ module WorkOS
|
|
|
146
110
|
}
|
|
147
111
|
|
|
148
112
|
response = client.request(post_request(path: '/sso/token', body: body))
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
WorkOS::Profile.new(response.body)
|
|
152
|
-
end
|
|
153
|
-
|
|
154
|
-
# Promote a DraftConnection created via the WorkOS.js embed such that the
|
|
155
|
-
# Enterprise users can begin signing into your application.
|
|
156
|
-
#
|
|
157
|
-
# @param [String] token The Draft Connection token that's been provided to
|
|
158
|
-
# you by the WorkOS.js
|
|
159
|
-
#
|
|
160
|
-
# @example
|
|
161
|
-
# WorkOS::SSO.promote_draft_connection(
|
|
162
|
-
# token: 'draft_conn_429u59js',
|
|
163
|
-
# )
|
|
164
|
-
# => true
|
|
165
|
-
#
|
|
166
|
-
# @return [Bool] - returns `true` if successful, `false` otherwise.
|
|
167
|
-
# @see https://github.com/workos-inc/ruby-idp-link-example
|
|
168
|
-
sig { params(token: String).returns(T::Boolean) }
|
|
169
|
-
def promote_draft_connection(token:)
|
|
170
|
-
request = post_request(
|
|
171
|
-
auth: true,
|
|
172
|
-
path: "/draft_connections/#{token}/activate",
|
|
173
|
-
)
|
|
174
|
-
|
|
175
|
-
response = client.request(request)
|
|
176
|
-
|
|
177
|
-
response.is_a? Net::HTTPSuccess
|
|
178
|
-
end
|
|
113
|
+
check_and_raise_profile_and_token_error(response: response)
|
|
179
114
|
|
|
180
|
-
|
|
181
|
-
#
|
|
182
|
-
# @param [String] source The Draft Connection token that's been provided
|
|
183
|
-
# to you by WorkOS.js
|
|
184
|
-
#
|
|
185
|
-
# @example
|
|
186
|
-
# WorkOS::SSO.create_connection(source: 'draft_conn_429u59js')
|
|
187
|
-
# => #<WorkOS::Connection:0x00007fb6e4193d20
|
|
188
|
-
# @id="conn_02DRA1XNSJDZ19A31F183ECQW9",
|
|
189
|
-
# @name="Foo Corp",
|
|
190
|
-
# @connection_type="OktaSAML",
|
|
191
|
-
# @domains=
|
|
192
|
-
# [{:object=>"connection_domain",
|
|
193
|
-
# :id=>"domain_01E6PK9N3XMD8RHWF7S66380AR",
|
|
194
|
-
# :domain=>"example.com"}]>
|
|
195
|
-
#
|
|
196
|
-
# @return [WorkOS::Connection]
|
|
197
|
-
sig { params(source: String).returns(WorkOS::Connection) }
|
|
198
|
-
def create_connection(source:)
|
|
199
|
-
request = post_request(
|
|
200
|
-
auth: true,
|
|
201
|
-
path: '/connections',
|
|
202
|
-
body: { source: source },
|
|
203
|
-
)
|
|
204
|
-
|
|
205
|
-
response = execute_request(request: request)
|
|
206
|
-
|
|
207
|
-
WorkOS::Connection.new(response.body)
|
|
115
|
+
WorkOS::ProfileAndToken.new(response.body)
|
|
208
116
|
end
|
|
209
117
|
|
|
210
118
|
# Retrieve connections.
|
|
@@ -323,10 +231,10 @@ module WorkOS
|
|
|
323
231
|
end
|
|
324
232
|
|
|
325
233
|
sig { params(response: Net::HTTPResponse).void }
|
|
326
|
-
def
|
|
234
|
+
def check_and_raise_profile_and_token_error(response:)
|
|
327
235
|
begin
|
|
328
236
|
body = JSON.parse(response.body)
|
|
329
|
-
return if body['profile']
|
|
237
|
+
return if body['access_token'] && body['profile']
|
|
330
238
|
|
|
331
239
|
message = body['message']
|
|
332
240
|
request_id = response['x-request-id']
|
data/lib/workos/version.rb
CHANGED
data/lib/workos.rb
CHANGED
|
@@ -35,9 +35,11 @@ module WorkOS
|
|
|
35
35
|
autoload :Directory, 'workos/directory'
|
|
36
36
|
autoload :DirectoryGroup, 'workos/directory_group'
|
|
37
37
|
autoload :Organization, 'workos/organization'
|
|
38
|
+
autoload :Organizations, 'workos/organizations'
|
|
38
39
|
autoload :Passwordless, 'workos/passwordless'
|
|
39
40
|
autoload :Portal, 'workos/portal'
|
|
40
41
|
autoload :Profile, 'workos/profile'
|
|
42
|
+
autoload :ProfileAndToken, 'workos/profile_and_token'
|
|
41
43
|
autoload :SSO, 'workos/sso'
|
|
42
44
|
autoload :DirectoryUser, 'workos/directory_user'
|
|
43
45
|
|
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
# typed: false
|
|
3
|
+
|
|
4
|
+
describe WorkOS::Organizations do
|
|
5
|
+
describe '.create_organization' do
|
|
6
|
+
context 'with valid payload' do
|
|
7
|
+
it 'creates an organization' do
|
|
8
|
+
VCR.use_cassette 'organization/create' do
|
|
9
|
+
organization = described_class.create_organization(
|
|
10
|
+
domains: ['example.com'],
|
|
11
|
+
name: 'Test Organization',
|
|
12
|
+
)
|
|
13
|
+
|
|
14
|
+
expect(organization.id).to eq('org_01EHT88Z8J8795GZNQ4ZP1J81T')
|
|
15
|
+
expect(organization.name).to eq('Test Organization')
|
|
16
|
+
expect(organization.domains.first[:domain]).to eq('example.com')
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
context 'with an invalid payload' do
|
|
22
|
+
it 'returns an error' do
|
|
23
|
+
VCR.use_cassette 'organization/create_invalid' do
|
|
24
|
+
expect do
|
|
25
|
+
described_class.create_organization(
|
|
26
|
+
domains: ['example.com'],
|
|
27
|
+
name: 'Test Organization 2',
|
|
28
|
+
)
|
|
29
|
+
end.to raise_error(
|
|
30
|
+
WorkOS::APIError,
|
|
31
|
+
/An Organization with the domain example.com already exists/,
|
|
32
|
+
)
|
|
33
|
+
end
|
|
34
|
+
end
|
|
35
|
+
end
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
describe '.list_organizations' do
|
|
39
|
+
context 'with no options' do
|
|
40
|
+
it 'returns organizations and metadata' do
|
|
41
|
+
expected_metadata = {
|
|
42
|
+
'after' => nil,
|
|
43
|
+
'before' => 'before-id',
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
VCR.use_cassette 'organization/list' do
|
|
47
|
+
organizations = described_class.list_organizations
|
|
48
|
+
|
|
49
|
+
expect(organizations.data.size).to eq(7)
|
|
50
|
+
expect(organizations.list_metadata).to eq(expected_metadata)
|
|
51
|
+
end
|
|
52
|
+
end
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
context 'with the before option' do
|
|
56
|
+
it 'forms the proper request to the API' do
|
|
57
|
+
request_args = [
|
|
58
|
+
'/organizations?before=before-id',
|
|
59
|
+
'Content-Type' => 'application/json'
|
|
60
|
+
]
|
|
61
|
+
|
|
62
|
+
expected_request = Net::HTTP::Get.new(*request_args)
|
|
63
|
+
|
|
64
|
+
expect(Net::HTTP::Get).to receive(:new).with(*request_args).
|
|
65
|
+
and_return(expected_request)
|
|
66
|
+
|
|
67
|
+
VCR.use_cassette 'organization/list', match_requests_on: [:path] do
|
|
68
|
+
organizations = described_class.list_organizations(
|
|
69
|
+
before: 'before-id',
|
|
70
|
+
)
|
|
71
|
+
|
|
72
|
+
expect(organizations.data.size).to eq(7)
|
|
73
|
+
end
|
|
74
|
+
end
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
context 'with the after option' do
|
|
78
|
+
it 'forms the proper request to the API' do
|
|
79
|
+
request_args = [
|
|
80
|
+
'/organizations?after=after-id',
|
|
81
|
+
'Content-Type' => 'application/json'
|
|
82
|
+
]
|
|
83
|
+
|
|
84
|
+
expected_request = Net::HTTP::Get.new(*request_args)
|
|
85
|
+
|
|
86
|
+
expect(Net::HTTP::Get).to receive(:new).with(*request_args).
|
|
87
|
+
and_return(expected_request)
|
|
88
|
+
|
|
89
|
+
VCR.use_cassette 'organization/list', match_requests_on: [:path] do
|
|
90
|
+
organizations = described_class.list_organizations(after: 'after-id')
|
|
91
|
+
|
|
92
|
+
expect(organizations.data.size).to eq(7)
|
|
93
|
+
end
|
|
94
|
+
end
|
|
95
|
+
end
|
|
96
|
+
|
|
97
|
+
context 'with the limit option' do
|
|
98
|
+
it 'forms the proper request to the API' do
|
|
99
|
+
request_args = [
|
|
100
|
+
'/organizations?limit=10',
|
|
101
|
+
'Content-Type' => 'application/json'
|
|
102
|
+
]
|
|
103
|
+
|
|
104
|
+
expected_request = Net::HTTP::Get.new(*request_args)
|
|
105
|
+
|
|
106
|
+
expect(Net::HTTP::Get).to receive(:new).with(*request_args).
|
|
107
|
+
and_return(expected_request)
|
|
108
|
+
|
|
109
|
+
VCR.use_cassette 'organization/list', match_requests_on: [:path] do
|
|
110
|
+
organizations = described_class.list_organizations(limit: 10)
|
|
111
|
+
|
|
112
|
+
expect(organizations.data.size).to eq(7)
|
|
113
|
+
end
|
|
114
|
+
end
|
|
115
|
+
end
|
|
116
|
+
end
|
|
117
|
+
|
|
118
|
+
describe '.get_organization' do
|
|
119
|
+
context 'with a valid id' do
|
|
120
|
+
it 'gets the organization details' do
|
|
121
|
+
VCR.use_cassette('organization/get') do
|
|
122
|
+
organization = described_class.get_organization(
|
|
123
|
+
id: 'org_01EZDF20TZEJXKPSX2BJRN6TV6',
|
|
124
|
+
)
|
|
125
|
+
|
|
126
|
+
expect(organization.id).to eq('org_01EZDF20TZEJXKPSX2BJRN6TV6')
|
|
127
|
+
expect(organization.name).to eq('Foo Corp')
|
|
128
|
+
expect(organization.domains.first[:domain]).to eq('foo-corp.com')
|
|
129
|
+
end
|
|
130
|
+
end
|
|
131
|
+
end
|
|
132
|
+
|
|
133
|
+
context 'with an invalid id' do
|
|
134
|
+
it 'raises an error' do
|
|
135
|
+
VCR.use_cassette('organization/get_invalid') do
|
|
136
|
+
expect do
|
|
137
|
+
described_class.get_organization(id: 'invalid')
|
|
138
|
+
end.to raise_error(
|
|
139
|
+
WorkOS::APIError,
|
|
140
|
+
'Status 404, Not Found - request ID: ',
|
|
141
|
+
)
|
|
142
|
+
end
|
|
143
|
+
end
|
|
144
|
+
end
|
|
145
|
+
end
|
|
146
|
+
|
|
147
|
+
describe '.update_organization' do
|
|
148
|
+
context 'with valid payload' do
|
|
149
|
+
it 'creates an organization' do
|
|
150
|
+
VCR.use_cassette 'organization/update' do
|
|
151
|
+
organization = described_class.update_organization(
|
|
152
|
+
organization: 'org_01F29YJ068E52HGEB8ZQGC9MJG',
|
|
153
|
+
domains: ['example.me'],
|
|
154
|
+
name: 'Test Organization',
|
|
155
|
+
)
|
|
156
|
+
|
|
157
|
+
expect(organization.id).to eq('org_01F29YJ068E52HGEB8ZQGC9MJG')
|
|
158
|
+
expect(organization.name).to eq('Test Organization')
|
|
159
|
+
expect(organization.domains.first[:domain]).to eq('example.me')
|
|
160
|
+
end
|
|
161
|
+
end
|
|
162
|
+
end
|
|
163
|
+
end
|
|
164
|
+
end
|
|
@@ -2,39 +2,6 @@
|
|
|
2
2
|
# typed: false
|
|
3
3
|
|
|
4
4
|
describe WorkOS::Portal do
|
|
5
|
-
describe '.create_organization' do
|
|
6
|
-
context 'with valid payload' do
|
|
7
|
-
it 'creates an organization' do
|
|
8
|
-
VCR.use_cassette 'organization/create' do
|
|
9
|
-
organization = described_class.create_organization(
|
|
10
|
-
domains: ['example.com'],
|
|
11
|
-
name: 'Test Organization',
|
|
12
|
-
)
|
|
13
|
-
|
|
14
|
-
expect(organization.id).to eq('org_01EHT88Z8J8795GZNQ4ZP1J81T')
|
|
15
|
-
expect(organization.name).to eq('Test Organization')
|
|
16
|
-
expect(organization.domains.first[:domain]).to eq('example.com')
|
|
17
|
-
end
|
|
18
|
-
end
|
|
19
|
-
end
|
|
20
|
-
|
|
21
|
-
context 'with an invalid payload' do
|
|
22
|
-
it 'returns an error' do
|
|
23
|
-
VCR.use_cassette 'organization/create_invalid' do
|
|
24
|
-
expect do
|
|
25
|
-
described_class.create_organization(
|
|
26
|
-
domains: ['example.com'],
|
|
27
|
-
name: 'Test Organization 2',
|
|
28
|
-
)
|
|
29
|
-
end.to raise_error(
|
|
30
|
-
WorkOS::APIError,
|
|
31
|
-
/An Organization with the domain example.com already exists/,
|
|
32
|
-
)
|
|
33
|
-
end
|
|
34
|
-
end
|
|
35
|
-
end
|
|
36
|
-
end
|
|
37
|
-
|
|
38
5
|
describe '.generate_link' do
|
|
39
6
|
let(:organization) { 'org_01EHQMYV6MBK39QC5PZXHY59C3' }
|
|
40
7
|
|
|
@@ -100,84 +67,4 @@ describe WorkOS::Portal do
|
|
|
100
67
|
end
|
|
101
68
|
end
|
|
102
69
|
end
|
|
103
|
-
|
|
104
|
-
describe '.list_organizations' do
|
|
105
|
-
context 'with no options' do
|
|
106
|
-
it 'returns organizations and metadata' do
|
|
107
|
-
expected_metadata = {
|
|
108
|
-
'after' => nil,
|
|
109
|
-
'before' => 'before-id',
|
|
110
|
-
}
|
|
111
|
-
|
|
112
|
-
VCR.use_cassette 'organization/list' do
|
|
113
|
-
organizations = described_class.list_organizations
|
|
114
|
-
|
|
115
|
-
expect(organizations.data.size).to eq(7)
|
|
116
|
-
expect(organizations.list_metadata).to eq(expected_metadata)
|
|
117
|
-
end
|
|
118
|
-
end
|
|
119
|
-
end
|
|
120
|
-
|
|
121
|
-
context 'with the before option' do
|
|
122
|
-
it 'forms the proper request to the API' do
|
|
123
|
-
request_args = [
|
|
124
|
-
'/organizations?before=before-id',
|
|
125
|
-
'Content-Type' => 'application/json'
|
|
126
|
-
]
|
|
127
|
-
|
|
128
|
-
expected_request = Net::HTTP::Get.new(*request_args)
|
|
129
|
-
|
|
130
|
-
expect(Net::HTTP::Get).to receive(:new).with(*request_args).
|
|
131
|
-
and_return(expected_request)
|
|
132
|
-
|
|
133
|
-
VCR.use_cassette 'organization/list', match_requests_on: [:path] do
|
|
134
|
-
organizations = described_class.list_organizations(
|
|
135
|
-
before: 'before-id',
|
|
136
|
-
)
|
|
137
|
-
|
|
138
|
-
expect(organizations.data.size).to eq(7)
|
|
139
|
-
end
|
|
140
|
-
end
|
|
141
|
-
end
|
|
142
|
-
|
|
143
|
-
context 'with the after option' do
|
|
144
|
-
it 'forms the proper request to the API' do
|
|
145
|
-
request_args = [
|
|
146
|
-
'/organizations?after=after-id',
|
|
147
|
-
'Content-Type' => 'application/json'
|
|
148
|
-
]
|
|
149
|
-
|
|
150
|
-
expected_request = Net::HTTP::Get.new(*request_args)
|
|
151
|
-
|
|
152
|
-
expect(Net::HTTP::Get).to receive(:new).with(*request_args).
|
|
153
|
-
and_return(expected_request)
|
|
154
|
-
|
|
155
|
-
VCR.use_cassette 'organization/list', match_requests_on: [:path] do
|
|
156
|
-
organizations = described_class.list_organizations(after: 'after-id')
|
|
157
|
-
|
|
158
|
-
expect(organizations.data.size).to eq(7)
|
|
159
|
-
end
|
|
160
|
-
end
|
|
161
|
-
end
|
|
162
|
-
|
|
163
|
-
context 'with the limit option' do
|
|
164
|
-
it 'forms the proper request to the API' do
|
|
165
|
-
request_args = [
|
|
166
|
-
'/organizations?limit=10',
|
|
167
|
-
'Content-Type' => 'application/json'
|
|
168
|
-
]
|
|
169
|
-
|
|
170
|
-
expected_request = Net::HTTP::Get.new(*request_args)
|
|
171
|
-
|
|
172
|
-
expect(Net::HTTP::Get).to receive(:new).with(*request_args).
|
|
173
|
-
and_return(expected_request)
|
|
174
|
-
|
|
175
|
-
VCR.use_cassette 'organization/list', match_requests_on: [:path] do
|
|
176
|
-
organizations = described_class.list_organizations(limit: 10)
|
|
177
|
-
|
|
178
|
-
expect(organizations.data.size).to eq(7)
|
|
179
|
-
end
|
|
180
|
-
end
|
|
181
|
-
end
|
|
182
|
-
end
|
|
183
70
|
end
|