diff --git a/sinch/__init__.py b/sinch/__init__.py index b643433f..2d00736e 100644 --- a/sinch/__init__.py +++ b/sinch/__init__.py @@ -3,4 +3,4 @@ from sinch.core.clients.sinch_client_sync import SinchClient -__all__ = SinchClient +__all__ = ["SinchClient"] diff --git a/sinch/domains/numbers/api/v1/active_numbers_apis.py b/sinch/domains/numbers/api/v1/active_numbers_apis.py index 2f2746f9..ef10ed1c 100644 --- a/sinch/domains/numbers/api/v1/active_numbers_apis.py +++ b/sinch/domains/numbers/api/v1/active_numbers_apis.py @@ -27,8 +27,8 @@ class ActiveNumbers(BaseNumbers): def list( self, - region_code: str, - number_type: NumberType, + region_code: Optional[str] = None, + number_type: Optional[NumberType] = None, number_pattern: Optional[str] = None, number_search_pattern: Optional[NumberSearchPatternType] = None, capabilities: Optional[List[CapabilityType]] = None, diff --git a/sinch/domains/numbers/models/v1/internal/list_active_numbers_request.py b/sinch/domains/numbers/models/v1/internal/list_active_numbers_request.py index b484595a..f832beb5 100644 --- a/sinch/domains/numbers/models/v1/internal/list_active_numbers_request.py +++ b/sinch/domains/numbers/models/v1/internal/list_active_numbers_request.py @@ -12,11 +12,12 @@ class ListActiveNumbersRequest(BaseModelConfigurationRequest): - region_code: StrictStr = Field( + region_code: Optional[StrictStr] = Field( + default=None, alias="regionCode", description="ISO 3166-1 alpha-2 country code. Example: US, GB or SE.", ) - number_type: NumberType = Field(alias="type") + number_type: Optional[NumberType] = Field(default=None, alias="type") page_size: Optional[StrictInt] = Field(default=None, alias="pageSize") capabilities: Optional[conlist(CapabilityType)] = Field(default=None) number_search_pattern: Optional[NumberSearchPatternType] = Field( diff --git a/sinch/domains/numbers/virtual_numbers.py b/sinch/domains/numbers/virtual_numbers.py index 7827db8b..a76e88ab 100644 --- a/sinch/domains/numbers/virtual_numbers.py +++ b/sinch/domains/numbers/virtual_numbers.py @@ -56,8 +56,8 @@ def sinch_events(self, callback_secret: str) -> SinchEvents: def list( self, - region_code: str, - number_type: NumberType, + region_code: Optional[str] = None, + number_type: Optional[NumberType] = None, number_pattern: Optional[str] = None, number_search_pattern: Optional[NumberSearchPatternType] = None, capabilities: Optional[List[CapabilityType]] = None, @@ -69,11 +69,11 @@ def list( """ Search for all active virtual numbers associated with a certain project. - :param region_code: ISO 3166-1 alpha-2 country code. Example: US, GB or SE. - :type region_code: str + :param region_code: Optional. ISO 3166-1 alpha-2 country code. Example: US, GB or SE. + :type region_code: Optional[str] - :param number_type: Type of number (e.g., "MOBILE", "LOCAL", "TOLL_FREE"). - :type number_type: NumberType + :param number_type: Optional. Type of number (e.g., "MOBILE", "LOCAL", "TOLL_FREE"). + :type number_type: Optional[NumberType] :param number_pattern: Specific sequence of digits to search for. :type number_pattern: Optional[str] diff --git a/tests/unit/domains/numbers/v1/endpoints/active/test_list_active_numbers_endpoint.py b/tests/unit/domains/numbers/v1/endpoints/active/test_list_active_numbers_endpoint.py index d291aeab..aa66041a 100644 --- a/tests/unit/domains/numbers/v1/endpoints/active/test_list_active_numbers_endpoint.py +++ b/tests/unit/domains/numbers/v1/endpoints/active/test_list_active_numbers_endpoint.py @@ -74,6 +74,21 @@ def test_build_query_params_expects_correct_mapping(endpoint): assert endpoint.build_query_params() == expected_params +def test_build_query_params_omits_none_region_and_type(): + """ + Optional query params must not be sent when unset. + """ + request_data = ListActiveNumbersRequest( + page_size=10, + capabilities=["SMS"], + ) + endpoint = ListActiveNumbersEndpoint("test_project_id", request_data) + assert endpoint.build_query_params() == { + "pageSize": 10, + "capabilities": ["SMS"], + } + + def test_handle_response_expects_correct_mapping(endpoint, mock_response): """ Check if response is handled and mapped to the appropriate fields correctly. diff --git a/tests/unit/domains/numbers/v1/models/internal/test_list_active_numbers_request_model.py b/tests/unit/domains/numbers/v1/models/internal/test_list_active_numbers_request_model.py index 28e891e6..cedae857 100644 --- a/tests/unit/domains/numbers/v1/models/internal/test_list_active_numbers_request_model.py +++ b/tests/unit/domains/numbers/v1/models/internal/test_list_active_numbers_request_model.py @@ -1,5 +1,4 @@ import pytest -from pydantic import ValidationError from sinch.domains.numbers.models.v1.internal import ListActiveNumbersRequest @@ -70,12 +69,3 @@ def test_list_available_numbers_request_expects_camel_case_input(): request = ListActiveNumbersRequest(**data) assert request.region_code == "US" assert request.number_type == "MOBILE" - - -def test_list_active_numbers_request_expects_validation_error_for_missing_field(): - """ - Test that missing required fields raise a ValidationError. - """ - data = {} - with pytest.raises(ValidationError): - ListActiveNumbersRequest(**data) diff --git a/tests/unit/domains/numbers/v1/models/internal/test_list_available_numbers_request_model.py b/tests/unit/domains/numbers/v1/models/internal/test_list_available_numbers_request_model.py index 31ebe255..da3d02f9 100644 --- a/tests/unit/domains/numbers/v1/models/internal/test_list_available_numbers_request_model.py +++ b/tests/unit/domains/numbers/v1/models/internal/test_list_available_numbers_request_model.py @@ -85,13 +85,12 @@ def test_list_available_numbers_request_expects_validation_error_for_missing_req data = { "number_type": "MOBILE", "size": 10, - "capabilities": ["SMS", "VOICE"] + "capabilities": ["SMS", "VOICE"], } with pytest.raises(ValidationError) as exc_info: ListAvailableNumbersRequest(**data) - # Assert the error mentions the missing region_code field assert "region_code" in str(exc_info.value) or "regionCode" in str(exc_info.value)