From 2651f7655093caa822fd6c31b9c262262898d579 Mon Sep 17 00:00:00 2001 From: Nikita Demidovich Date: Wed, 18 Jan 2023 14:41:14 +0300 Subject: [PATCH] refactor: Proccessing of unsupported sync source types --- pybotx/client/users_api/user_from_csv.py | 4 +-- pybotx/models/enums.py | 29 ++++++++++++++++++--- pybotx/models/users.py | 4 +-- pyproject.toml | 2 +- tests/client/users_api/test_users_as_csv.py | 16 +++++++++++- 5 files changed, 45 insertions(+), 10 deletions(-) diff --git a/pybotx/client/users_api/user_from_csv.py b/pybotx/client/users_api/user_from_csv.py index 88d4453c..bd760c54 100644 --- a/pybotx/client/users_api/user_from_csv.py +++ b/pybotx/client/users_api/user_from_csv.py @@ -1,4 +1,4 @@ -from typing import Optional +from typing import Optional, Union from uuid import UUID from pydantic import Field, validator @@ -19,7 +19,7 @@ class BotXAPIUserFromCSVResult(VerifiedPayloadBaseModel): ad_domain: str = Field(alias="Domain") email: Optional[str] = Field(alias="AD E-mail") name: str = Field(alias="Name") - sync_source: APISyncSourceTypes = Field(alias="Sync source") + sync_source: Union[APISyncSourceTypes, str] = Field(alias="Sync source") active: bool = Field(alias="Active") user_kind: APIUserKinds = Field(alias="Kind") company: Optional[str] = Field(alias="Company") diff --git a/pybotx/models/enums.py b/pybotx/models/enums.py index d61f0a54..869ebb8f 100644 --- a/pybotx/models/enums.py +++ b/pybotx/models/enums.py @@ -67,7 +67,9 @@ class SyncSourceTypes(AutoName): OPENID = auto() -IncomingChatTypes = Union[ChatTypes, Literal["UNSUPPORTED"]] +UNSUPPORTED = Literal["UNSUPPORTED"] +IncomingChatTypes = Union[ChatTypes, UNSUPPORTED] +IncomingSyncSourceTypes = Union[SyncSourceTypes, UNSUPPORTED] class StrEnum(str, Enum): # noqa: WPS600 (pydantic needs this inheritance) @@ -258,7 +260,7 @@ def convert_chat_type_to_domain(chat_type: APIChatTypes) -> ChatTypes: @overload -def convert_chat_type_to_domain(chat_type: str) -> Literal["UNSUPPORTED"]: +def convert_chat_type_to_domain(chat_type: str) -> UNSUPPORTED: ... # noqa: WPS428 @@ -283,9 +285,21 @@ def convert_chat_type_to_domain( return converted_type +@overload def convert_sync_source_type_to_domain( sync_type: APISyncSourceTypes, ) -> SyncSourceTypes: + ... # noqa: WPS428 + + +@overload +def convert_sync_source_type_to_domain(sync_type: str) -> UNSUPPORTED: + ... # noqa: WPS428 + + +def convert_sync_source_type_to_domain( + sync_type: Union[APISyncSourceTypes, str], +) -> IncomingSyncSourceTypes: sync_source_types_mapping = { APISyncSourceTypes.AD: SyncSourceTypes.AD, APISyncSourceTypes.ADMIN: SyncSourceTypes.ADMIN, @@ -293,8 +307,15 @@ def convert_sync_source_type_to_domain( APISyncSourceTypes.OPENID: SyncSourceTypes.OPENID, } - converted_type = sync_source_types_mapping.get(sync_type) + converted_type: Optional[IncomingSyncSourceTypes] + try: + converted_type = sync_source_types_mapping.get(APISyncSourceTypes(sync_type)) + except ValueError: + converted_type = "UNSUPPORTED" + if converted_type is None: - raise NotImplementedError(f"Unsupported sync source type: {sync_type}") + raise NotImplementedError( + f"Unsupported sync source type: {sync_type}", + ) from None return converted_type diff --git a/pybotx/models/users.py b/pybotx/models/users.py index cfbc08e0..f043f505 100644 --- a/pybotx/models/users.py +++ b/pybotx/models/users.py @@ -2,7 +2,7 @@ from typing import List, Optional from uuid import UUID -from pybotx.models.enums import SyncSourceTypes, UserKinds +from pybotx.models.enums import IncomingSyncSourceTypes, UserKinds @dataclass @@ -55,7 +55,7 @@ class UserFromCSV: ad_login: str ad_domain: str username: str - sync_source: SyncSourceTypes + sync_source: IncomingSyncSourceTypes active: bool user_kind: UserKinds email: Optional[str] = None diff --git a/pyproject.toml b/pyproject.toml index 01f4efea..48fcff1d 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "pybotx" -version = "0.52.1" +version = "0.53.0" description = "A python library for interacting with eXpress BotX API" authors = [ "Sidnev Nikolay ", diff --git a/tests/client/users_api/test_users_as_csv.py b/tests/client/users_api/test_users_as_csv.py index 95280390..9b82085b 100644 --- a/tests/client/users_api/test_users_as_csv.py +++ b/tests/client/users_api/test_users_as_csv.py @@ -73,7 +73,8 @@ async def test__users_as_csv__succeed( status_code=HTTPStatus.OK, content=( b"HUID,AD Login,Domain,AD E-mail,Name,Sync source,Active,Kind,Company,Department,Position\n" - b"dbc8934f-d0d7-4a9e-89df-d45c137a851c,test_user_17,cts.example.com,,test_user_17,ad,true,cts_user,,," + b"dbc8934f-d0d7-4a9e-89df-d45c137a851c,test_user_17,cts.example.com,,test_user_17,ad,true,cts_user,,,\n" + b"13a6909c-bce1-4dbf-8359-efb7ef8e5b34,test_user_18,cts.example.com,,test_user_18,unsupported,true,cts_user,,," ), ), ) @@ -103,4 +104,17 @@ async def test__users_as_csv__succeed( department=None, position=None, ), + UserFromCSV( + huid=UUID("13a6909c-bce1-4dbf-8359-efb7ef8e5b34"), + ad_login="test_user_18", + ad_domain="cts.example.com", + username="test_user_18", + sync_source="UNSUPPORTED", + active=True, + user_kind=UserKinds.CTS_USER, + email=None, + company=None, + department=None, + position=None, + ), ]