Skip to content

Commit dbe9aca

Browse files
Add domain_data to Organization API and deprecate domains (#257)
* Add `domain_data` to Organization API and deprecate domains * lint * Update `update_organization` and tests * s/status/state --------- Co-authored-by: Michael Hadley <[email protected]>
1 parent 11eb960 commit dbe9aca

File tree

3 files changed

+90
-9
lines changed

3 files changed

+90
-9
lines changed

tests/test_organizations.py

Lines changed: 57 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -185,18 +185,41 @@ def test_get_organization(self, mock_organization, mock_request_method):
185185

186186
assert organization == mock_organization
187187

188-
def test_create_organization(self, mock_organization, mock_request_method):
188+
def test_create_organization_with_domain_data(
189+
self, mock_organization, mock_request_method
190+
):
189191
mock_request_method("post", mock_organization, 201)
190192

191-
payload = {"domains": ["example.com"], "name": "Test Organization"}
193+
payload = {
194+
"domain_data": [{"domain": "example.com", "state": "verified"}],
195+
"name": "Test Organization",
196+
}
192197
organization = self.organizations.create_organization(payload)
193198

194199
assert organization["id"] == "org_01EHT88Z8J8795GZNQ4ZP1J81T"
195200
assert organization["name"] == "Foo Corporation"
196201

202+
def test_create_organization_with_domains(
203+
self, mock_organization, mock_request_method
204+
):
205+
mock_request_method("post", mock_organization, 201)
206+
207+
payload = {"domains": ["example.com"], "name": "Test Organization"}
208+
with pytest.warns(
209+
DeprecationWarning,
210+
match="The 'domains' parameter for 'create_organization' is deprecated.",
211+
):
212+
organization = self.organizations.create_organization(payload)
213+
214+
assert organization["id"] == "org_01EHT88Z8J8795GZNQ4ZP1J81T"
215+
assert organization["name"] == "Foo Corporation"
216+
197217
def test_sends_idempotency_key(self, capture_and_mock_request):
198218
idempotency_key = "test_123456789"
199-
payload = {"domains": ["example.com"], "name": "Foo Corporation"}
219+
payload = {
220+
"domain_data": [{"domain": "example.com", "state": "verified"}],
221+
"name": "Foo Corporation",
222+
}
200223

201224
_, request_kwargs = capture_and_mock_request("post", payload, 200)
202225

@@ -207,13 +230,15 @@ def test_sends_idempotency_key(self, capture_and_mock_request):
207230
assert request_kwargs["headers"]["idempotency-key"] == idempotency_key
208231
assert response["name"] == "Foo Corporation"
209232

210-
def test_update_organization(self, mock_organization_updated, mock_request_method):
233+
def test_update_organization_with_domain_data(
234+
self, mock_organization_updated, mock_request_method
235+
):
211236
mock_request_method("put", mock_organization_updated, 201)
212237

213238
updated_organization = self.organizations.update_organization(
214239
organization="org_01EHT88Z8J8795GZNQ4ZP1J81T",
215240
name="Example Organization",
216-
domains=["example.io"],
241+
domain_data=[{"domain": "example.io", "state": "verified"}],
217242
allow_profiles_outside_organization=True,
218243
)
219244

@@ -228,6 +253,33 @@ def test_update_organization(self, mock_organization_updated, mock_request_metho
228253
]
229254
assert updated_organization["allow_profiles_outside_organization"]
230255

256+
def test_update_organization_with_domains(
257+
self, mock_organization_updated, mock_request_method
258+
):
259+
mock_request_method("put", mock_organization_updated, 201)
260+
261+
with pytest.warns(
262+
DeprecationWarning,
263+
match="The 'domains' parameter for 'update_organization' is deprecated.",
264+
):
265+
updated_organization = self.organizations.update_organization(
266+
organization="org_01EHT88Z8J8795GZNQ4ZP1J81T",
267+
name="Example Organization",
268+
domains=["example.io"],
269+
allow_profiles_outside_organization=True,
270+
)
271+
272+
assert updated_organization["id"] == "org_01EHT88Z8J8795GZNQ4ZP1J81T"
273+
assert updated_organization["name"] == "Example Organization"
274+
assert updated_organization["domains"] == [
275+
{
276+
"domain": "example.io",
277+
"object": "organization_domain",
278+
"id": "org_domain_01EHT88Z8WZEFWYPM6EC9BX2R8",
279+
}
280+
]
281+
assert updated_organization["allow_profiles_outside_organization"]
282+
231283
def test_delete_organization(self, setup, mock_raw_request_method):
232284
mock_raw_request_method(
233285
"delete",

tests/utils/fixtures/mock_organization.py

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,13 @@ def __init__(self, id):
1010
self.allow_profiles_outside_organization = False
1111
self.created_at = datetime.datetime.now()
1212
self.updated_at = datetime.datetime.now()
13-
self.domains = ["domain1.com"]
13+
self.domains = [
14+
{
15+
"domain": "example.io",
16+
"object": "organization_domain",
17+
"id": "org_domain_01EHT88Z8WZEFWYPM6EC9BX2R8",
18+
}
19+
]
1420

1521
OBJECT_FIELDS = [
1622
"id",

workos/organizations.py

Lines changed: 26 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -178,7 +178,9 @@ def create_organization(self, organization, idempotency_key=None):
178178
organization[allow_profiles_outside_organization] (boolean) - Whether Connections
179179
within the Organization allow profiles that are outside of the Organization's
180180
configured User Email Domains. (Optional)
181-
organization[domains] (list) - List of domains that belong to the organization
181+
organization[domain_data] (list[dict]) - List of domains that belong to the organization.
182+
organization[domain_data][][domain] - The domain of the organization.
183+
organization[domain_data][][state] - The state of the domain: either 'verified' or 'pending'.
182184
idempotency_key (str) - Idempotency key for creating an organization. (Optional)
183185
184186
Returns:
@@ -188,6 +190,12 @@ def create_organization(self, organization, idempotency_key=None):
188190
if idempotency_key:
189191
headers["idempotency-key"] = idempotency_key
190192

193+
if "domains" in organization:
194+
warn(
195+
"The 'domains' parameter for 'create_organization' is deprecated. Please use 'domain_data' instead.",
196+
DeprecationWarning,
197+
)
198+
191199
response = self.request_helper.request(
192200
ORGANIZATIONS_PATH,
193201
method=REQUEST_METHOD_POST,
@@ -199,7 +207,12 @@ def create_organization(self, organization, idempotency_key=None):
199207
return WorkOSOrganization.construct_from_response(response).to_dict()
200208

201209
def update_organization(
202-
self, organization, name, allow_profiles_outside_organization=None, domains=None
210+
self,
211+
organization,
212+
name,
213+
allow_profiles_outside_organization=None,
214+
domains=None,
215+
domain_data=None,
203216
):
204217
"""Update an organization
205218
@@ -209,14 +222,24 @@ def update_organization(
209222
allow_profiles_outside_organization (boolean) - Whether Connections
210223
within the Organization allow profiles that are outside of the Organization's
211224
configured User Email Domains. (Optional)
212-
domains (list) - List of domains that belong to the organization. (Optional)
225+
domains (list) - [Deprecated] Use domain_data instead. List of domains that belong to the organization. (Optional)
226+
domain_data (list[dict]) - List of domains that belong to the organization. (Optional)
227+
domain_data[][domain] - The domain of the organization.
228+
domain_data[][state] - The state of the domain: either 'verified' or 'pending'.
213229
214230
Returns:
215231
dict: Updated Organization response from WorkOS.
216232
"""
233+
if domains:
234+
warn(
235+
"The 'domains' parameter for 'update_organization' is deprecated. Please use 'domain_data' instead.",
236+
DeprecationWarning,
237+
)
238+
217239
params = {
218240
"name": name,
219241
"domains": domains,
242+
"domain_data": domain_data,
220243
"allow_profiles_outside_organization": allow_profiles_outside_organization,
221244
}
222245
response = self.request_helper.request(

0 commit comments

Comments
 (0)