Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
136 changes: 136 additions & 0 deletions tests/test_organization_domains.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,136 @@
from typing import Union
import pytest
from tests.utils.syncify import syncify
from workos.organization_domains import AsyncOrganizationDomains, OrganizationDomains


@pytest.mark.sync_and_async(OrganizationDomains, AsyncOrganizationDomains)
class TestOrganizationDomains:
@pytest.fixture(autouse=True)
def setup(
self, module_instance: Union[OrganizationDomains, AsyncOrganizationDomains]
):
self.http_client = module_instance._http_client
self.organization_domains = module_instance

@pytest.fixture
def mock_organization_domain(self):
return {
"object": "organization_domain",
"id": "org_domain_01EHT88Z8WZEFWYPM6EC9BX2R8",
"organization_id": "org_01EHT88Z8J8795GZNQ4ZP1J81T",
"domain": "example.com",
"state": "pending",
"verification_strategy": "dns",
"verification_token": "workos_example_verification_token_12345",
"verification_prefix": "_workos-challenge",
"created_at": "2023-01-01T12:00:00.000Z",
"updated_at": "2023-01-01T12:00:00.000Z",
}

@pytest.fixture
def mock_organization_domain_verified(self):
return {
"object": "organization_domain",
"id": "org_domain_01EHT88Z8WZEFWYPM6EC9BX2R8",
"organization_id": "org_01EHT88Z8J8795GZNQ4ZP1J81T",
"domain": "example.com",
"state": "verified",
"verification_strategy": "dns",
"verification_token": "workos_example_verification_token_12345",
"verification_prefix": "_workos-challenge",
"created_at": "2023-01-01T12:00:00.000Z",
"updated_at": "2023-01-01T12:00:00.000Z",
}

def test_get_organization_domain(
self, capture_and_mock_http_client_request, mock_organization_domain
):
request_kwargs = capture_and_mock_http_client_request(
self.http_client,
mock_organization_domain,
200,
)

organization_domain = syncify(
self.organization_domains.get_organization_domain(
organization_domain_id="org_domain_01EHT88Z8WZEFWYPM6EC9BX2R8"
)
)

assert request_kwargs["url"].endswith(
"/organization_domains/org_domain_01EHT88Z8WZEFWYPM6EC9BX2R8"
)
assert request_kwargs["method"] == "get"
assert organization_domain.id == "org_domain_01EHT88Z8WZEFWYPM6EC9BX2R8"
assert organization_domain.domain == "example.com"
assert organization_domain.state == "pending"
assert organization_domain.verification_strategy == "dns"

def test_create_organization_domain(
self, capture_and_mock_http_client_request, mock_organization_domain
):
request_kwargs = capture_and_mock_http_client_request(
self.http_client,
mock_organization_domain,
201,
)

organization_domain = syncify(
self.organization_domains.create_organization_domain(
organization_id="org_01EHT88Z8J8795GZNQ4ZP1J81T",
domain="example.com",
)
)

assert request_kwargs["url"].endswith("/organization_domains")
assert request_kwargs["method"] == "post"
assert request_kwargs["json"] == {
"organization_id": "org_01EHT88Z8J8795GZNQ4ZP1J81T",
"domain": "example.com",
}
assert organization_domain.id == "org_domain_01EHT88Z8WZEFWYPM6EC9BX2R8"
assert organization_domain.domain == "example.com"
assert organization_domain.organization_id == "org_01EHT88Z8J8795GZNQ4ZP1J81T"

def test_verify_organization_domain(
self, capture_and_mock_http_client_request, mock_organization_domain_verified
):
request_kwargs = capture_and_mock_http_client_request(
self.http_client,
mock_organization_domain_verified,
200,
)

organization_domain = syncify(
self.organization_domains.verify_organization_domain(
organization_domain_id="org_domain_01EHT88Z8WZEFWYPM6EC9BX2R8"
)
)

assert request_kwargs["url"].endswith(
"/organization_domains/org_domain_01EHT88Z8WZEFWYPM6EC9BX2R8/verify"
)
assert request_kwargs["method"] == "post"
assert organization_domain.id == "org_domain_01EHT88Z8WZEFWYPM6EC9BX2R8"
assert organization_domain.state == "verified"

def test_delete_organization_domain(self, capture_and_mock_http_client_request):
request_kwargs = capture_and_mock_http_client_request(
self.http_client,
None,
204,
headers={"content-type": "text/plain; charset=utf-8"},
)

response = syncify(
self.organization_domains.delete_organization_domain(
organization_domain_id="org_domain_01EHT88Z8WZEFWYPM6EC9BX2R8"
)
)

assert request_kwargs["url"].endswith(
"/organization_domains/org_domain_01EHT88Z8WZEFWYPM6EC9BX2R8"
)
assert request_kwargs["method"] == "delete"
assert response is None
19 changes: 0 additions & 19 deletions tests/test_organizations.py
Original file line number Diff line number Diff line change
Expand Up @@ -218,25 +218,6 @@ def test_delete_organization(self, capture_and_mock_http_client_request):
assert request_kwargs["method"] == "delete"
assert response is None

def test_delete_organization_domain(self, capture_and_mock_http_client_request):
request_kwargs = capture_and_mock_http_client_request(
self.http_client,
204,
headers={"content-type": "text/plain; charset=utf-8"},
)

response = syncify(
self.organizations.delete_organization_domain(
organization_domain_id="org_domain_01EHT88Z8WZEFWYPM6EC9BX2R8"
)
)

assert request_kwargs["url"].endswith(
"/organization_domains/org_domain_01EHT88Z8WZEFWYPM6EC9BX2R8"
)
assert request_kwargs["method"] == "delete"
assert response is None

def test_list_organizations_auto_pagination_for_single_page(
self,
mock_organizations_single_page_response,
Expand Down
2 changes: 1 addition & 1 deletion tests/utils/fixtures/mock_organization.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import datetime

from workos.types.organizations import Organization
from workos.types.organizations.organization_domain import OrganizationDomain
from workos.types.organization_domains import OrganizationDomain


class MockOrganization(Organization):
Expand Down
5 changes: 5 additions & 0 deletions workos/_base_client.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
from workos.events import EventsModule
from workos.mfa import MFAModule
from workos.organizations import OrganizationsModule
from workos.organization_domains import OrganizationDomainsModule
from workos.passwordless import PasswordlessModule
from workos.portal import PortalModule
from workos.sso import SSOModule
Expand Down Expand Up @@ -88,6 +89,10 @@ def mfa(self) -> MFAModule: ...
@abstractmethod
def organizations(self) -> OrganizationsModule: ...

@property
@abstractmethod
def organization_domains(self) -> OrganizationDomainsModule: ...

@property
@abstractmethod
def passwordless(self) -> PasswordlessModule: ...
Expand Down
9 changes: 9 additions & 0 deletions workos/async_client.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
from workos.fga import FGAModule
from workos.mfa import MFAModule
from workos.organizations import AsyncOrganizations
from workos.organization_domains import AsyncOrganizationDomains
from workos.passwordless import PasswordlessModule
from workos.portal import PortalModule
from workos.sso import AsyncSSO
Expand Down Expand Up @@ -80,6 +81,14 @@ def organizations(self) -> AsyncOrganizations:
self._organizations = AsyncOrganizations(self._http_client)
return self._organizations

@property
def organization_domains(self) -> AsyncOrganizationDomains:
if not getattr(self, "_organization_domains", None):
self._organization_domains = AsyncOrganizationDomains(
http_client=self._http_client, client_configuration=self
)
return self._organization_domains

@property
def passwordless(self) -> PasswordlessModule:
raise NotImplementedError(
Expand Down
9 changes: 9 additions & 0 deletions workos/client.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
from workos.directory_sync import DirectorySync
from workos.fga import FGA
from workos.organizations import Organizations
from workos.organization_domains import OrganizationDomains
from workos.passwordless import Passwordless
from workos.portal import Portal
from workos.sso import SSO
Expand Down Expand Up @@ -80,6 +81,14 @@ def organizations(self) -> Organizations:
self._organizations = Organizations(self._http_client)
return self._organizations

@property
def organization_domains(self) -> OrganizationDomains:
if not getattr(self, "_organization_domains", None):
self._organization_domains = OrganizationDomains(
http_client=self._http_client, client_configuration=self
)
return self._organization_domains

@property
def passwordless(self) -> Passwordless:
if not getattr(self, "_passwordless", None):
Expand Down
Loading