Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add typing for Directory Sync events #282

Closed
wants to merge 21 commits into from
31 changes: 31 additions & 0 deletions tests/test_events.py
Original file line number Diff line number Diff line change
@@ -1,13 +1,35 @@
import pytest
from workos.events import Events
from tests.utils.fixtures.mock_event import MockEvent
from tests.utils.fixtures.mock_directory_sync_event import MockDirectorySyncEvent


class TestEvents(object):
@pytest.fixture(autouse=True)
def setup(self, set_api_key, set_client_id):
self.events = Events()

@pytest.fixture
def mock_directory_sync_events(self):
events = [MockDirectorySyncEvent(id=str(i)).to_dict() for i in range(100)]

return {
"data": events,
"list_metadata": {"after": None},
"metadata": {
"params": {
"events": None,
"limit": None,
"organization_id": None,
"after": None,
"range_start": None,
"range_end": None,
"default_limit": True,
},
"method": Events.list_directory_sync_events,
},
}

@pytest.fixture
def mock_events(self):
events = [MockEvent(id=str(i)).to_dict() for i in range(100)]
Expand All @@ -29,6 +51,15 @@ def mock_events(self):
},
}

def test_list_directory_sync_events(
self, mock_directory_sync_events, mock_request_method
):
mock_request_method("get", mock_directory_sync_events, 200)

events = self.events.list_directory_sync_events()

assert events == mock_directory_sync_events

def test_list_events(self, mock_events, mock_request_method):
mock_request_method("get", mock_events, 200)

Expand Down
39 changes: 39 additions & 0 deletions tests/utils/fixtures/mock_directory_sync_event.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
import datetime
from workos.resources.base import WorkOSBaseResource
from workos.event_objects.directory_user import DirectoryUserEvent


class MockDirectorySyncEvent(WorkOSBaseResource):
def __init__(self, id):
self.object = "event"
self.id = id
self.event = "dsync.user.created"
self.data = {
"id": "directory_user_01E1X1B89NH8Z3SDFJR4H7RGX7",
"directory_id": "directory_01ECAZ4NV9QMV47GW873HDCX74",
"organization_id": "org_01EZTR6WYX1A0DSE2CYMGXQ24Y",
"idp_id": "8931",
"emails": [
{"primary": True, "type": "work", "value": "[email protected]"}
],
"first_name": "Lela",
"last_name": "Block",
"job_title": "Software Engineer",
"username": "[email protected]",
"state": "active",
"created_at": "2021-06-25T19:07:33.155Z",
"updated_at": "2021-06-25T19:07:33.155Z",
"custom_attributes": {"department": "Engineering"},
"raw_attributes": {},
"object": "directory_user",
}

self.created_at = datetime.datetime.now()

OBJECT_FIELDS = [
"object",
"id",
"event",
"data",
"created_at",
]
7 changes: 5 additions & 2 deletions tests/utils/fixtures/mock_event.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,11 @@ class MockEvent(WorkOSBaseResource):
def __init__(self, id):
self.object = "event"
self.id = id
self.event = "dsync.user.created"
self.data = {"id": "event_01234ABCD", "organization_id": "org_1234"}
self.event = "user.created"
self.data = {
"id": "user_01E4ZCR3C5A4QZ2Z2JQXGKZJ9E",
"email": "[email protected]",
}
self.created_at = datetime.datetime.now()

OBJECT_FIELDS = [
Expand Down
74 changes: 29 additions & 45 deletions workos/directory_sync.py
Original file line number Diff line number Diff line change
@@ -1,11 +1,14 @@
from warnings import warn
from typing import Optional

import workos
from workos.utils.pagination_order import Order
from workos.utils.request import (
RequestHelper,
REQUEST_METHOD_DELETE,
REQUEST_METHOD_GET,
)
from workos.utils.types import JsonDict

from workos.utils.validation import DIRECTORY_SYNC_MODULE, validate_settings
from workos.resources.directory_sync import (
Expand Down Expand Up @@ -107,13 +110,13 @@ def list_users(

def list_users_v2(
self,
directory=None,
group=None,
limit=None,
before=None,
after=None,
order=None,
):
directory: Optional[str] = None,
group: Optional[str] = None,
limit: Optional[int] = None,
before: Optional[str] = None,
after: Optional[str] = None,
order: Optional[Order] = None,
) -> WorkOSListResource:
"""Gets a list of provisioned Users for a Directory.

Note, either 'directory' or 'group' must be provided.
Expand Down Expand Up @@ -247,13 +250,13 @@ def list_groups(

def list_groups_v2(
self,
directory=None,
user=None,
limit=None,
before=None,
after=None,
order=None,
):
directory: Optional[str] = None,
user: Optional[str] = None,
limit: Optional[int] = None,
before: Optional[str] = None,
after: Optional[str] = None,
order: Optional[Order] = None,
) -> WorkOSListResource:
"""Gets a list of provisioned Groups for a Directory .

Note, either 'directory' or 'user' must be provided.
Expand Down Expand Up @@ -312,7 +315,7 @@ def list_groups_v2(

return self.construct_from_response(response)

def get_user(self, user):
def get_user(self, user: str) -> WorkOSDirectoryUser:
"""Gets details for a single provisioned Directory User.

Args:
Expand All @@ -329,7 +332,7 @@ def get_user(self, user):

return WorkOSDirectoryUser.construct_from_response(response).to_dict()

def get_group(self, group):
def get_group(self, group: str) -> WorkOSDirectoryGroup:
"""Gets details for a single provisioned Directory Group.

Args:
Expand All @@ -346,7 +349,7 @@ def get_group(self, group):

return WorkOSDirectoryGroup.construct_from_response(response).to_dict()

def get_directory(self, directory):
def get_directory(self, directory: str) -> WorkOSDirectory:
"""Gets details for a single Directory

Args:
Expand Down Expand Up @@ -439,19 +442,19 @@ def list_directories(

def list_directories_v2(
self,
domain=None,
search=None,
limit=None,
before=None,
after=None,
organization=None,
order=None,
domain: Optional[str] = None,
search: Optional[str] = None,
limit: Optional[int] = None,
before: Optional[str] = None,
after: Optional[str] = None,
organization: Optional[str] = None,
order: Optional[Order] = None,
):
"""Gets details for existing Directories.

Args:
domain (str): Domain of a Directory. (Optional)
organization: ID of an Organization (Optional)
organization (str): ID of an Organization (Optional)
search (str): Searchable text for a Directory. (Optional)
limit (int): Maximum number of records to return. (Optional)
before (str): Pagination cursor to receive records before a provided Directory ID. (Optional)
Expand Down Expand Up @@ -505,26 +508,7 @@ def list_directories_v2(

return self.construct_from_response(response)

def get_directory(self, directory):
"""Gets details for a single Directory

Args:
directory (str): Directory unique identifier.

Returns:
dict: Directory response from WorkOS

"""

response = self.request_helper.request(
"directories/{directory}".format(directory=directory),
method=REQUEST_METHOD_GET,
token=workos.api_key,
)

return WorkOSDirectory.construct_from_response(response).to_dict()

def delete_directory(self, directory):
def delete_directory(self, directory: str) -> JsonDict:
"""Delete one existing Directory.

Args:
Expand Down
Empty file.
Loading
Loading