diff --git a/bandwidth.yml b/bandwidth.yml index 22b13cec..7c08f291 100644 --- a/bandwidth.yml +++ b/bandwidth.yml @@ -163,7 +163,13 @@ paths: /users/{accountId}/messages: get: summary: List Messages - description: Returns a list of messages based on query parameters. + description: > + Returns a list of messages based on query parameters. + + + **Rate Limit:** This endpoint is rate limited to 3500 requests per 5 + minutes per Source IP address. Exceeding the limit returns HTTP 429 with + a `Retry-After` header. operationId: listMessages tags: - Messages @@ -207,10 +213,12 @@ paths: $ref: '#/components/responses/messagingForbiddenError' '404': $ref: '#/components/responses/messagingNotFoundError' + '405': + $ref: '#/components/responses/messagingMethodNotAllowedError' '415': $ref: '#/components/responses/messagingInvalidMediaTypeError' '429': - $ref: '#/components/responses/messagingTooManyRequestsError' + $ref: '#/components/responses/listMessagesTooManyRequestsError' '500': $ref: '#/components/responses/messagingInternalServerError' post: @@ -2257,7 +2265,9 @@ components: type: object properties: media: - $ref: '#/components/schemas/rbmMessageContentFile' + type: array + items: + $ref: '#/components/schemas/rbmMessageContentFile' suggestions: $ref: '#/components/schemas/multiChannelFullActions' required: @@ -5875,7 +5885,6 @@ components: type: object internalTicketNumber: type: string - format: uuid description: >- Unique identifier (UUID) generated by Bandwidth to assist in tracking the verification status of a toll-free number - included in all webhook @@ -5883,7 +5892,6 @@ components: example: acde070d-8c4c-4f0d-9d8a-162843c10333 internalTicketNumberForWebhook: type: string - format: uuid description: >- Unique identifier (UUID) generated by Bandwidth to assist in tracking the verification status of a toll-free number. @@ -6752,6 +6760,21 @@ components: - type: internal-server-error description: Internal server error. No further information available source: {} + listMessagesTooManyRequestsError: + description: Too Many Requests + headers: + Retry-After: + description: The number of seconds to wait before retrying the request. + schema: + type: integer + example: 300 + content: + application/json: + schema: + $ref: "#/components/schemas/messagingRequestError" + example: + type: rate_limit_exceeded + description: Rate limit exceeded. Wait for Retry-After time before sending another request. createCallResponse: description: Created headers: diff --git a/bandwidth/api/messages_api.py b/bandwidth/api/messages_api.py index a19d5ae9..9520798d 100644 --- a/bandwidth/api/messages_api.py +++ b/bandwidth/api/messages_api.py @@ -412,7 +412,7 @@ def list_messages( ) -> MessagesList: """List Messages - Returns a list of messages based on query parameters. + Returns a list of messages based on query parameters. **Rate Limit:** This endpoint is rate limited to 3500 requests per 5 minutes per Source IP address. Exceeding the limit returns HTTP 429 with a `Retry-After` header. :param account_id: Your Bandwidth Account ID. (required) :type account_id: str @@ -533,6 +533,7 @@ def list_messages( '401': "MessagingRequestError", '403': "MessagingRequestError", '404': "MessagingRequestError", + '405': "MessagingRequestError", '415': "MessagingRequestError", '429': "MessagingRequestError", '500': "MessagingRequestError", @@ -594,7 +595,7 @@ def list_messages_with_http_info( ) -> ApiResponse[MessagesList]: """List Messages - Returns a list of messages based on query parameters. + Returns a list of messages based on query parameters. **Rate Limit:** This endpoint is rate limited to 3500 requests per 5 minutes per Source IP address. Exceeding the limit returns HTTP 429 with a `Retry-After` header. :param account_id: Your Bandwidth Account ID. (required) :type account_id: str @@ -715,6 +716,7 @@ def list_messages_with_http_info( '401': "MessagingRequestError", '403': "MessagingRequestError", '404': "MessagingRequestError", + '405': "MessagingRequestError", '415': "MessagingRequestError", '429': "MessagingRequestError", '500': "MessagingRequestError", @@ -776,7 +778,7 @@ def list_messages_without_preload_content( ) -> RESTResponseType: """List Messages - Returns a list of messages based on query parameters. + Returns a list of messages based on query parameters. **Rate Limit:** This endpoint is rate limited to 3500 requests per 5 minutes per Source IP address. Exceeding the limit returns HTTP 429 with a `Retry-After` header. :param account_id: Your Bandwidth Account ID. (required) :type account_id: str @@ -897,6 +899,7 @@ def list_messages_without_preload_content( '401': "MessagingRequestError", '403': "MessagingRequestError", '404': "MessagingRequestError", + '405': "MessagingRequestError", '415': "MessagingRequestError", '429': "MessagingRequestError", '500': "MessagingRequestError", diff --git a/bandwidth/models/blocked_webhook.py b/bandwidth/models/blocked_webhook.py index f1f534f0..22eff561 100644 --- a/bandwidth/models/blocked_webhook.py +++ b/bandwidth/models/blocked_webhook.py @@ -21,7 +21,6 @@ from pydantic import BaseModel, ConfigDict, Field, StrictBool, StrictStr, field_validator from typing import Any, ClassVar, Dict, List, Optional from typing_extensions import Annotated -from uuid import UUID from bandwidth.models.tfv_callback_status_enum import TfvCallbackStatusEnum from typing import Optional, Set from typing_extensions import Self @@ -33,7 +32,7 @@ class BlockedWebhook(BaseModel): account_id: Optional[StrictStr] = Field(default=None, description="User's account ID.", alias="accountId") phone_number: Optional[Annotated[str, Field(min_length=12, strict=True, max_length=12)]] = Field(default=None, description="Toll-free telephone number in E.164 format.", alias="phoneNumber") status: Optional[TfvCallbackStatusEnum] = None - internal_ticket_number: Optional[UUID] = Field(default=None, description="Unique identifier (UUID) generated by Bandwidth to assist in tracking the verification status of a toll-free number.", alias="internalTicketNumber") + internal_ticket_number: Optional[StrictStr] = Field(default=None, description="Unique identifier (UUID) generated by Bandwidth to assist in tracking the verification status of a toll-free number.", alias="internalTicketNumber") blocked: Optional[StrictBool] = Field(default=None, description="Whether a Toll-Free Verification is blocked. This attribute will only be defined when the number is blocked.") blocked_reason: Optional[StrictStr] = Field(default=None, description="The reason why the Toll-Free Verification is blocked. This attribute will only be defined when the number is blocked.", alias="blockedReason") additional_properties: Dict[str, Any] = {} diff --git a/bandwidth/models/failure_webhook.py b/bandwidth/models/failure_webhook.py index c06e21d4..5c502946 100644 --- a/bandwidth/models/failure_webhook.py +++ b/bandwidth/models/failure_webhook.py @@ -21,7 +21,6 @@ from pydantic import BaseModel, ConfigDict, Field, StrictStr, field_validator from typing import Any, ClassVar, Dict, List, Optional from typing_extensions import Annotated -from uuid import UUID from typing import Optional, Set from typing_extensions import Self @@ -34,7 +33,7 @@ class FailureWebhook(BaseModel): error_code: Optional[StrictStr] = Field(default=None, description="An error code indicating what error was encountered. This code can be interpreted as an HTTP status code in regards to the error that was encountered.", alias="errorCode") error_message: Optional[StrictStr] = Field(default=None, description="A description of the error that was encountered.", alias="errorMessage") errors: Optional[List[StrictStr]] = Field(default=None, description="Details of the errors that were encountered when processing the request.") - internal_ticket_number: Optional[UUID] = Field(default=None, description="Unique identifier (UUID) generated by Bandwidth to assist in tracking the verification status of a toll-free number.", alias="internalTicketNumber") + internal_ticket_number: Optional[StrictStr] = Field(default=None, description="Unique identifier (UUID) generated by Bandwidth to assist in tracking the verification status of a toll-free number.", alias="internalTicketNumber") additional_properties: Dict[str, Any] = {} __properties: ClassVar[List[str]] = ["accountId", "phoneNumber", "errorCode", "errorMessage", "errors", "internalTicketNumber"] diff --git a/bandwidth/models/rbm_message_media.py b/bandwidth/models/rbm_message_media.py index 259bb0e9..ec54c62a 100644 --- a/bandwidth/models/rbm_message_media.py +++ b/bandwidth/models/rbm_message_media.py @@ -30,7 +30,7 @@ class RbmMessageMedia(BaseModel): """ RbmMessageMedia """ # noqa: E501 - media: RbmMessageContentFile + media: List[RbmMessageContentFile] suggestions: Optional[Annotated[List[MultiChannelAction], Field(max_length=11)]] = Field(default=None, description="An array of suggested actions for the recipient.") additional_properties: Dict[str, Any] = {} __properties: ClassVar[List[str]] = ["media", "suggestions"] @@ -76,9 +76,13 @@ def to_dict(self) -> Dict[str, Any]: exclude=excluded_fields, exclude_none=True, ) - # override the default output from pydantic by calling `to_dict()` of media + # override the default output from pydantic by calling `to_dict()` of each item in media (list) + _items = [] if self.media: - _dict['media'] = self.media.to_dict() + for _item_media in self.media: + if _item_media: + _items.append(_item_media.to_dict()) + _dict['media'] = _items # override the default output from pydantic by calling `to_dict()` of each item in suggestions (list) _items = [] if self.suggestions: @@ -103,7 +107,7 @@ def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: return cls.model_validate(obj) _obj = cls.model_validate({ - "media": RbmMessageContentFile.from_dict(obj["media"]) if obj.get("media") is not None else None, + "media": [RbmMessageContentFile.from_dict(_item) for _item in obj["media"]] if obj.get("media") is not None else None, "suggestions": [MultiChannelAction.from_dict(_item) for _item in obj["suggestions"]] if obj.get("suggestions") is not None else None }) # store additional fields in additional_properties diff --git a/bandwidth/models/tfv_status.py b/bandwidth/models/tfv_status.py index 3a10fb79..6cafbb2c 100644 --- a/bandwidth/models/tfv_status.py +++ b/bandwidth/models/tfv_status.py @@ -22,7 +22,6 @@ from pydantic import BaseModel, ConfigDict, Field, StrictBool, StrictStr, field_validator from typing import Any, ClassVar, Dict, List, Optional from typing_extensions import Annotated -from uuid import UUID from bandwidth.models.tfv_status_enum import TfvStatusEnum from bandwidth.models.tfv_submission_info import TfvSubmissionInfo from typing import Optional, Set @@ -34,7 +33,7 @@ class TfvStatus(BaseModel): """ # noqa: E501 phone_number: Optional[Annotated[str, Field(min_length=12, strict=True, max_length=12)]] = Field(default=None, description="Toll-free telephone number in E.164 format.", alias="phoneNumber") status: Optional[TfvStatusEnum] = None - internal_ticket_number: Optional[UUID] = Field(default=None, description="Unique identifier (UUID) generated by Bandwidth to assist in tracking the verification status of a toll-free number - included in all webhook payloads.", alias="internalTicketNumber") + internal_ticket_number: Optional[StrictStr] = Field(default=None, description="Unique identifier (UUID) generated by Bandwidth to assist in tracking the verification status of a toll-free number - included in all webhook payloads.", alias="internalTicketNumber") decline_reason_description: Optional[StrictStr] = Field(default=None, description="Explanation for why a verification request was declined.", alias="declineReasonDescription") resubmit_allowed: Optional[StrictBool] = Field(default=None, description="Whether a Toll-Free Verification request qualifies for resubmission via PUT.", alias="resubmitAllowed") created_date_time: Optional[datetime] = Field(default=None, description="Date and time the verification request was created.", alias="createdDateTime") diff --git a/bandwidth/models/verification_denial_webhook.py b/bandwidth/models/verification_denial_webhook.py index 75ef42da..0b690589 100644 --- a/bandwidth/models/verification_denial_webhook.py +++ b/bandwidth/models/verification_denial_webhook.py @@ -21,7 +21,6 @@ from pydantic import BaseModel, ConfigDict, Field, StrictBool, StrictInt, StrictStr, field_validator from typing import Any, ClassVar, Dict, List, Optional from typing_extensions import Annotated -from uuid import UUID from bandwidth.models.additional_denial_reason import AdditionalDenialReason from typing import Optional, Set from typing_extensions import Self @@ -34,7 +33,7 @@ class VerificationDenialWebhook(BaseModel): additional_denial_reasons: Optional[List[AdditionalDenialReason]] = Field(default=None, description="An optional list of denial reasons in addition to declineReasonDescription when multiple reasons apply.", alias="additionalDenialReasons") decline_reason_description: Optional[StrictStr] = Field(default=None, description="Explanation for why a verification request was declined.", alias="declineReasonDescription") denial_status_code: Optional[StrictInt] = Field(default=None, description="Reason code for denial.", alias="denialStatusCode") - internal_ticket_number: Optional[UUID] = Field(default=None, description="Unique identifier (UUID) generated by Bandwidth to assist in tracking the verification status of a toll-free number.", alias="internalTicketNumber") + internal_ticket_number: Optional[StrictStr] = Field(default=None, description="Unique identifier (UUID) generated by Bandwidth to assist in tracking the verification status of a toll-free number.", alias="internalTicketNumber") phone_number: Optional[Annotated[str, Field(min_length=12, strict=True, max_length=12)]] = Field(default=None, description="Toll-free telephone number in E.164 format.", alias="phoneNumber") resubmit_allowed: Optional[StrictBool] = Field(default=None, description="Whether a Toll-Free Verification request qualifies for resubmission via PUT.", alias="resubmitAllowed") status: Optional[StrictStr] = 'UNVERIFIED' diff --git a/bandwidth/models/verification_webhook.py b/bandwidth/models/verification_webhook.py index 762e55c5..458fa3af 100644 --- a/bandwidth/models/verification_webhook.py +++ b/bandwidth/models/verification_webhook.py @@ -21,7 +21,6 @@ from pydantic import BaseModel, ConfigDict, Field, StrictStr, field_validator from typing import Any, ClassVar, Dict, List, Optional from typing_extensions import Annotated -from uuid import UUID from bandwidth.models.tfv_callback_status_enum import TfvCallbackStatusEnum from typing import Optional, Set from typing_extensions import Self @@ -33,7 +32,7 @@ class VerificationWebhook(BaseModel): account_id: Optional[StrictStr] = Field(default=None, description="User's account ID.", alias="accountId") phone_number: Optional[Annotated[str, Field(min_length=12, strict=True, max_length=12)]] = Field(default=None, description="Toll-free telephone number in E.164 format.", alias="phoneNumber") status: Optional[TfvCallbackStatusEnum] = None - internal_ticket_number: Optional[UUID] = Field(default=None, description="Unique identifier (UUID) generated by Bandwidth to assist in tracking the verification status of a toll-free number.", alias="internalTicketNumber") + internal_ticket_number: Optional[StrictStr] = Field(default=None, description="Unique identifier (UUID) generated by Bandwidth to assist in tracking the verification status of a toll-free number.", alias="internalTicketNumber") additional_properties: Dict[str, Any] = {} __properties: ClassVar[List[str]] = ["accountId", "phoneNumber", "status", "internalTicketNumber"] diff --git a/docs/MessagesApi.md b/docs/MessagesApi.md index 6f2e3fb4..041285a6 100644 --- a/docs/MessagesApi.md +++ b/docs/MessagesApi.md @@ -113,6 +113,9 @@ List Messages Returns a list of messages based on query parameters. +**Rate Limit:** This endpoint is rate limited to 3500 requests per 5 minutes per Source IP address. Exceeding the limit returns HTTP 429 with a `Retry-After` header. + + ### Example * Basic Authentication (Basic): @@ -251,8 +254,9 @@ Name | Type | Description | Notes **401** | Unauthorized | - | **403** | Forbidden | - | **404** | Not Found | - | +**405** | Method Not Allowed | - | **415** | Unsupported Media Type | - | -**429** | Too Many Requests | - | +**429** | Too Many Requests | * Retry-After - The number of seconds to wait before retrying the request.
| **500** | Internal Server Error | - | [[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) diff --git a/docs/MultiChannelChannelListRBMObjectAllOfContent.md b/docs/MultiChannelChannelListRBMObjectAllOfContent.md index e3763c6e..acfe5a4b 100644 --- a/docs/MultiChannelChannelListRBMObjectAllOfContent.md +++ b/docs/MultiChannelChannelListRBMObjectAllOfContent.md @@ -8,7 +8,7 @@ Name | Type | Description | Notes ------------ | ------------- | ------------- | ------------- **text** | **str** | The text associated with the message. Must be 3270 characters or less | **suggestions** | [**List[MultiChannelAction]**](MultiChannelAction.md) | An array of suggested actions for the recipient. | [optional] -**media** | [**RbmMessageContentFile**](RbmMessageContentFile.md) | | +**media** | [**List[RbmMessageContentFile]**](RbmMessageContentFile.md) | | **orientation** | [**StandaloneCardOrientationEnum**](StandaloneCardOrientationEnum.md) | | **thumbnail_image_alignment** | [**ThumbnailAlignmentEnum**](ThumbnailAlignmentEnum.md) | | **card_content** | [**RbmCardContent**](RbmCardContent.md) | | diff --git a/docs/RbmMessageMedia.md b/docs/RbmMessageMedia.md index d6ffe448..644b0c75 100644 --- a/docs/RbmMessageMedia.md +++ b/docs/RbmMessageMedia.md @@ -5,7 +5,7 @@ Name | Type | Description | Notes ------------ | ------------- | ------------- | ------------- -**media** | [**RbmMessageContentFile**](RbmMessageContentFile.md) | | +**media** | [**List[RbmMessageContentFile]**](RbmMessageContentFile.md) | | **suggestions** | [**List[MultiChannelAction]**](MultiChannelAction.md) | An array of suggested actions for the recipient. | [optional] ## Example diff --git a/test/smoke/test_multi_channel_api.py b/test/smoke/test_multi_channel_api.py index 965e4ecc..7e4a0cb6 100644 --- a/test/smoke/test_multi_channel_api.py +++ b/test/smoke/test_multi_channel_api.py @@ -40,6 +40,17 @@ from bandwidth.models.rbm_action_dial import RbmActionDial from bandwidth.models.rbm_action_type_enum import RbmActionTypeEnum from bandwidth.models.multi_channel_channel_list_rbm_response_object import MultiChannelChannelListRBMResponseObject +from bandwidth.models.rbm_message_media import RbmMessageMedia +from bandwidth.models.rbm_message_content_file import RbmMessageContentFile +from bandwidth.models.rbm_message_content_rich_card import RbmMessageContentRichCard +from bandwidth.models.rbm_standalone_card import RbmStandaloneCard +from bandwidth.models.standalone_card_orientation_enum import StandaloneCardOrientationEnum +from bandwidth.models.thumbnail_alignment_enum import ThumbnailAlignmentEnum +from bandwidth.models.rbm_card_content import RbmCardContent +from bandwidth.models.rbm_card_content_media import RbmCardContentMedia +from bandwidth.models.rbm_media_height_enum import RbmMediaHeightEnum +from bandwidth.models.rbm_message_carousel_card import RbmMessageCarouselCard +from bandwidth.models.card_width_enum import CardWidthEnum class TestMultiChannelApi(unittest.TestCase): """MultiChannelApi unit test stubs""" @@ -63,21 +74,21 @@ def test_create_multi_channel_sms_message(self) -> None: channel_list_item = MultiChannelChannelListRequestObject( MultiChannelChannelListSMSObject( - var_from = BW_NUMBER, - application_id = BW_MESSAGING_APPLICATION_ID, - channel = MultiChannelMessageChannelEnum.SMS, - content = SmsMessageContent( - text = 'Hello, this is a test message.', + var_from=BW_NUMBER, + application_id=BW_MESSAGING_APPLICATION_ID, + channel=MultiChannelMessageChannelEnum.SMS, + content=SmsMessageContent( + text='Hello, this is a test message.', ) ) ) multi_channel_message_request = MultiChannelMessageRequest( - to = USER_NUMBER, - channel_list = [channel_list_item], - tag = 'tag', - priority = 'high', - expiration = self.expiration.isoformat(), + to=USER_NUMBER, + channel_list=[channel_list_item], + tag='tag', + priority='high', + expiration=self.expiration.isoformat(), ) response = self.multi_channel_api_instance.create_multi_channel_message_with_http_info( @@ -122,22 +133,22 @@ def test_create_multi_channel_mms_message(self) -> None: channel_list_item = MultiChannelChannelListRequestObject( MultiChannelChannelListMMSObject( - var_from = BW_NUMBER, - application_id = BW_MESSAGING_APPLICATION_ID, - channel = MultiChannelMessageChannelEnum.MMS, - content = MmsMessageContent( - text = 'Hello, this is a test message.', - media = [MmsMessageContentFile(fileUrl="https://image.com/image.png")] + var_from=BW_NUMBER, + application_id=BW_MESSAGING_APPLICATION_ID, + channel=MultiChannelMessageChannelEnum.MMS, + content=MmsMessageContent( + text='Hello, this is a test message.', + media=[MmsMessageContentFile(fileUrl="https://image.com/image.png")] ) ) ) multi_channel_message_request = MultiChannelMessageRequest( - to = USER_NUMBER, - channel_list = [channel_list_item], - tag = 'tag', - priority = 'high', - expiration = self.expiration.isoformat(), + to=USER_NUMBER, + channel_list=[channel_list_item], + tag='tag', + priority='high', + expiration=self.expiration.isoformat(), ) response = self.multi_channel_api_instance.create_multi_channel_message_with_http_info( @@ -176,20 +187,20 @@ def test_create_multi_channel_mms_message(self) -> None: # assert_that(mms_object.content.media[0].file_url, equal_to("https://image.com/image.png")) # assert_that(mms_object.owner, equal_to(BW_NUMBER)) - def test_create_multi_channel_rbm_message(self) -> None: + def test_create_multi_channel_rbm_text_message(self) -> None: """Test case for create_multi_channel_message - Create Multi-Channel Message + Create Multi-Channel Text Message """ channel_list_item = MultiChannelChannelListRequestObject( MultiChannelChannelListRBMObject( - var_from = BW_NUMBER, - application_id = BW_MESSAGING_APPLICATION_ID, - channel = MultiChannelMessageChannelEnum.RBM, - content = MultiChannelChannelListRBMObjectAllOfContent( + var_from=BW_NUMBER, + application_id=BW_MESSAGING_APPLICATION_ID, + channel=MultiChannelMessageChannelEnum.RBM, + content=MultiChannelChannelListRBMObjectAllOfContent( RbmMessageContentText( - text = 'Hello, this is a test message.', + text='Hello, this is a test message.', suggestions=[ MultiChannelAction(RbmActionDial( type=RbmActionTypeEnum.DIAL_PHONE, @@ -205,11 +216,11 @@ def test_create_multi_channel_rbm_message(self) -> None: ) multi_channel_message_request = MultiChannelMessageRequest( - to = USER_NUMBER, - channel_list = [channel_list_item], - tag = 'tag', - priority = 'high', - expiration = self.expiration.isoformat(), + to=USER_NUMBER, + channel_list=[channel_list_item], + tag='tag', + priority='high', + expiration=self.expiration.isoformat(), ) response = self.multi_channel_api_instance.create_multi_channel_message_with_http_info( @@ -233,30 +244,312 @@ def test_create_multi_channel_rbm_message(self) -> None: assert_that(response.data.data.expiration, instance_of(datetime)) assert_that(response.data.data.channel_list, instance_of(list)) assert_that(response.data.data.channel_list[0], instance_of(MultiChannelChannelListResponseObject)) + assert_that(response.data.data.channel_list[0].actual_instance, instance_of(MultiChannelChannelListRBMResponseObject)) + rbm_object = response.data.data.channel_list[0].actual_instance + assert_that(rbm_object.var_from, equal_to(BW_NUMBER)) + assert_that(rbm_object.application_id, equal_to(BW_MESSAGING_APPLICATION_ID)) + assert_that(rbm_object.channel, equal_to(MultiChannelMessageChannelEnum.RBM)) + assert_that(rbm_object.owner, equal_to(BW_NUMBER)) + assert_that(rbm_object.content, is_not(none())) + assert_that(rbm_object.content, instance_of(MultiChannelChannelListRBMObjectAllOfContent)) + assert_that(rbm_object.content.actual_instance, instance_of(RbmMessageContentText)) + rbm_content = rbm_object.content.actual_instance + assert_that(rbm_content.text, equal_to('Hello, this is a test message.')) + assert_that(rbm_content.suggestions, is_not(none())) + assert_that(rbm_content.suggestions, instance_of(list)) + assert_that(len(rbm_content.suggestions), equal_to(1)) + assert_that(rbm_content.suggestions[0], instance_of(MultiChannelAction)) # skip below for now because python doesn't respect discriminator field properly + # action = rbm_content.suggestions[0] + # assert_that(action.actual_instance, instance_of(RbmActionDial)) + # dial_action = action.actual_instance + # assert_that(dial_action.type, equal_to(RbmActionTypeEnum.DIAL_PHONE)) + # assert_that(dial_action.text, equal_to("Call Us")) + # assert_that(dial_action.postback_data, equal_to('U0dWc2JHOGdkMjl5YkdRPQ==')) + # assert_that(dial_action.phone_number, equal_to(BW_NUMBER)) + + def test_create_multi_channel_rbm_media_message(self) -> None: + """Test case for create_multi_channel_message + + Create Multi-Channel Media Message + """ + + channel_list_item = MultiChannelChannelListRequestObject( + MultiChannelChannelListRBMObject( + var_from=BW_NUMBER, + application_id=BW_MESSAGING_APPLICATION_ID, + channel=MultiChannelMessageChannelEnum.RBM, + content=MultiChannelChannelListRBMObjectAllOfContent( + RbmMessageMedia( + media=[RbmMessageContentFile( + file_url="https://image.com/image.png", + thumbnail_url="https://image.com/thumbnail.png", + )], + suggestions=[ + MultiChannelAction(RbmActionDial( + type=RbmActionTypeEnum.DIAL_PHONE, + text="Call Us", + postback_data='U0dWc2JHOGdkMjl5YkdRPQ==', + phone_number=BW_NUMBER + )) + ] + ) + + ) + ) + ) + + multi_channel_message_request = MultiChannelMessageRequest( + to=USER_NUMBER, + channel_list=[channel_list_item], + tag='tag', + priority='high', + expiration=self.expiration.isoformat(), + ) + + response = self.multi_channel_api_instance.create_multi_channel_message_with_http_info( + BW_ACCOUNT_ID, + multi_channel_message_request + ) - # assert_that(response.data.data.channel_list[0].actual_instance, instance_of(MultiChannelChannelListRBMResponseObject)) - # rbm_object = response.data.data.channel_list[0].actual_instance - # assert_that(rbm_object.var_from, equal_to(BW_NUMBER)) - # assert_that(rbm_object.application_id, equal_to(BW_MESSAGING_APPLICATION_ID)) - # assert_that(rbm_object.channel, equal_to(MultiChannelMessageChannelEnum.RBM)) - # assert_that(rbm_object.content, is_not(none())) - # assert_that(rbm_object.content, instance_of(MultiChannelChannelListRBMObjectAllOfContent)) - # assert_that(rbm_object.content.actual_instance, instance_of(RbmMessageContentText)) - # assert_that(rbm_object.content.actual_instance.text, equal_to('Hello, this is a test message.')) - # assert_that(rbm_object.content.actual_instance.suggestions, is_not(none())) - # assert_that(rbm_object.content.actual_instance.suggestions, instance_of(list)) - # assert_that(len(rbm_object.content.actual_instance.suggestions), equal_to(1)) - # assert_that(rbm_object.content.actual_instance.suggestions[0], instance_of(MultiChannelAction)) - # action = rbm_object.content.actual_instance.suggestions[0] + assert_that(response.status_code, equal_to(202)) + assert_that(response.data, is_not(none())) + assert_that(response.data, instance_of(CreateMultiChannelMessageResponse)) + assert_that(response.data.links, is_not(none())) + assert_that(response.data.links, instance_of(list)) + assert_that(response.data.data, is_not(none())) + assert_that(response.data.data, instance_of(MultiChannelMessageResponseData)) + assert_that(response.data.data.id, instance_of(str)) + assert_that(response.data.data.time, instance_of(datetime)) + assert_that(response.data.data.direction, instance_of(str)) + assert_that(response.data.data.to, instance_of(list)) + assert_that(response.data.data.tag, instance_of(str)) + assert_that(response.data.data.priority, instance_of(PriorityEnum)) + assert_that(response.data.data.expiration, instance_of(datetime)) + assert_that(response.data.data.channel_list, instance_of(list)) + assert_that(response.data.data.channel_list[0], instance_of(MultiChannelChannelListResponseObject)) + assert_that(response.data.data.channel_list[0].actual_instance, instance_of(MultiChannelChannelListRBMResponseObject)) + rbm_object = response.data.data.channel_list[0].actual_instance + assert_that(rbm_object.var_from, equal_to(BW_NUMBER)) + assert_that(rbm_object.application_id, equal_to(BW_MESSAGING_APPLICATION_ID)) + assert_that(rbm_object.channel, equal_to(MultiChannelMessageChannelEnum.RBM)) + assert_that(rbm_object.owner, equal_to(BW_NUMBER)) + assert_that(rbm_object.content, is_not(none())) + assert_that(rbm_object.content, instance_of(MultiChannelChannelListRBMObjectAllOfContent)) + assert_that(rbm_object.content.actual_instance, instance_of(RbmMessageMedia)) + rbm_content = rbm_object.content.actual_instance + assert_that(len(rbm_content.media), equal_to(1)) + assert_that(rbm_content.media[0].file_url, instance_of(str)) + assert_that(rbm_content.media[0].thumbnail_url, instance_of(str)) + assert_that(rbm_content.suggestions, is_not(none())) + assert_that(rbm_content.suggestions, instance_of(list)) + assert_that(len(rbm_content.suggestions), equal_to(1)) + assert_that(rbm_content.suggestions[0], instance_of(MultiChannelAction)) + + # skip below for now because python doesn't respect discriminator field properly + # action = rbm_content.suggestions[0] # assert_that(action.actual_instance, instance_of(RbmActionDial)) # dial_action = action.actual_instance # assert_that(dial_action.type, equal_to(RbmActionTypeEnum.DIAL_PHONE)) # assert_that(dial_action.text, equal_to("Call Us")) # assert_that(dial_action.postback_data, equal_to('U0dWc2JHOGdkMjl5YkdRPQ==')) # assert_that(dial_action.phone_number, equal_to(BW_NUMBER)) - # assert_that(rbm_object.owner, equal_to(BW_NUMBER)) + + def test_create_multi_channel_rbm_rich_standalone_message(self) -> None: + """Test case for create_multi_channel_message + + Create Multi-Channel Standalone Rich Card Message + """ + + channel_list_item = MultiChannelChannelListRequestObject( + MultiChannelChannelListRBMObject( + var_from=BW_NUMBER, + application_id=BW_MESSAGING_APPLICATION_ID, + channel=MultiChannelMessageChannelEnum.RBM, + content=MultiChannelChannelListRBMObjectAllOfContent( + RbmMessageContentRichCard( + RbmStandaloneCard( + orientation=StandaloneCardOrientationEnum.HORIZONTAL, + thumbnail_image_alignment=ThumbnailAlignmentEnum.LEFT, + card_content=RbmCardContent( + title="Welcome to our service", + description="We are glad to have you here.", + media=RbmCardContentMedia( + file_url="https://image.com/image.png", + thumbnail_url="https://image.com/thumbnail.png", + height=RbmMediaHeightEnum.TALL + ), + suggestions=[ + MultiChannelAction(RbmActionDial( + type=RbmActionTypeEnum.DIAL_PHONE, + text="Call Us", + postback_data='U0dWc2JHOGdkMjl5YkdRPQ==', + phone_number=BW_NUMBER + )) + ] + ) + ) + ) + ) + ) + ) + + multi_channel_message_request = MultiChannelMessageRequest( + to=USER_NUMBER, + channel_list=[channel_list_item], + tag='tag', + priority='high', + expiration=self.expiration.isoformat(), + ) + + response = self.multi_channel_api_instance.create_multi_channel_message_with_http_info( + BW_ACCOUNT_ID, + multi_channel_message_request + ) + + assert_that(response.status_code, equal_to(202)) + assert_that(response.data, is_not(none())) + assert_that(response.data, instance_of(CreateMultiChannelMessageResponse)) + assert_that(response.data.links, is_not(none())) + assert_that(response.data.links, instance_of(list)) + assert_that(response.data.data, is_not(none())) + assert_that(response.data.data, instance_of(MultiChannelMessageResponseData)) + assert_that(response.data.data.id, instance_of(str)) + assert_that(response.data.data.time, instance_of(datetime)) + assert_that(response.data.data.direction, instance_of(str)) + assert_that(response.data.data.to, instance_of(list)) + assert_that(response.data.data.tag, instance_of(str)) + assert_that(response.data.data.priority, instance_of(PriorityEnum)) + assert_that(response.data.data.expiration, instance_of(datetime)) + assert_that(response.data.data.channel_list, instance_of(list)) + assert_that(response.data.data.channel_list[0], instance_of(MultiChannelChannelListResponseObject)) + assert_that(response.data.data.channel_list[0].actual_instance, instance_of(MultiChannelChannelListRBMResponseObject)) + rbm_object = response.data.data.channel_list[0].actual_instance + assert_that(rbm_object.var_from, equal_to(BW_NUMBER)) + assert_that(rbm_object.application_id, equal_to(BW_MESSAGING_APPLICATION_ID)) + assert_that(rbm_object.channel, equal_to(MultiChannelMessageChannelEnum.RBM)) + assert_that(rbm_object.owner, equal_to(BW_NUMBER)) + assert_that(rbm_object.content, is_not(none())) + assert_that(rbm_object.content, instance_of(MultiChannelChannelListRBMObjectAllOfContent)) + assert_that(rbm_object.content.actual_instance.actual_instance, instance_of(RbmStandaloneCard)) + rbm_content = rbm_object.content.actual_instance.actual_instance + assert_that(rbm_content.orientation, equal_to(StandaloneCardOrientationEnum.HORIZONTAL)) + assert_that(rbm_content.thumbnail_image_alignment, equal_to(ThumbnailAlignmentEnum.LEFT)) + assert_that(rbm_content.card_content, is_not(none())) + assert_that(rbm_content.card_content, instance_of(RbmCardContent)) + assert_that(rbm_content.card_content.title, equal_to("Welcome to our service")) + assert_that(rbm_content.card_content.description, equal_to("We are glad to have you here.")) + assert_that(rbm_content.card_content.media, is_not(none())) + assert_that(rbm_content.card_content.media, instance_of(RbmCardContentMedia)) + assert_that(rbm_content.card_content.media.file_url, instance_of(str)) + assert_that(rbm_content.card_content.media.thumbnail_url, instance_of(str)) + assert_that(rbm_content.card_content.media.height, equal_to(RbmMediaHeightEnum.TALL)) + assert_that(rbm_content.card_content.suggestions, is_not(none())) + assert_that(rbm_content.card_content.suggestions, instance_of(list)) + assert_that(len(rbm_content.card_content.suggestions), equal_to(1)) + assert_that(rbm_content.card_content.suggestions[0], instance_of(MultiChannelAction)) + + def test_create_multi_channel_rbm_rich_carousel_message(self) -> None: + """Test case for create_multi_channel_message + + Create Multi-Channel Carousel Rich Card Message + """ + + channel_list_item = MultiChannelChannelListRequestObject( + MultiChannelChannelListRBMObject( + var_from=BW_NUMBER, + application_id=BW_MESSAGING_APPLICATION_ID, + channel=MultiChannelMessageChannelEnum.RBM, + content=MultiChannelChannelListRBMObjectAllOfContent( + RbmMessageContentRichCard( + RbmMessageCarouselCard( + card_width=CardWidthEnum.MEDIUM, + card_contents=[ + RbmCardContent( + title="Card 1 Title", + description="We are glad to have you here.", + media=RbmCardContentMedia( + file_url="https://image.com/image.png", + thumbnail_url="https://image.com/thumbnail.png", + height=RbmMediaHeightEnum.TALL + ), + suggestions=[ + MultiChannelAction(RbmActionDial( + type=RbmActionTypeEnum.DIAL_PHONE, + text="Call Us", + postback_data='U0dWc2JHOGdkMjl5YkdRPQ==', + phone_number=BW_NUMBER + )) + ] + ), + RbmCardContent( + title="Card 2 Title" + ) + ] + ) + ) + ) + ) + ) + + multi_channel_message_request = MultiChannelMessageRequest( + to=USER_NUMBER, + channel_list=[channel_list_item], + tag='tag', + priority='high', + expiration=self.expiration.isoformat(), + ) + + response = self.multi_channel_api_instance.create_multi_channel_message_with_http_info( + BW_ACCOUNT_ID, + multi_channel_message_request + ) + + assert_that(response.status_code, equal_to(202)) + assert_that(response.data, is_not(none())) + assert_that(response.data, instance_of(CreateMultiChannelMessageResponse)) + assert_that(response.data.links, is_not(none())) + assert_that(response.data.links, instance_of(list)) + assert_that(response.data.data, is_not(none())) + assert_that(response.data.data, instance_of(MultiChannelMessageResponseData)) + assert_that(response.data.data.id, instance_of(str)) + assert_that(response.data.data.time, instance_of(datetime)) + assert_that(response.data.data.direction, instance_of(str)) + assert_that(response.data.data.to, instance_of(list)) + assert_that(response.data.data.tag, instance_of(str)) + assert_that(response.data.data.priority, instance_of(PriorityEnum)) + assert_that(response.data.data.expiration, instance_of(datetime)) + assert_that(response.data.data.channel_list, instance_of(list)) + assert_that(response.data.data.channel_list[0], instance_of(MultiChannelChannelListResponseObject)) + assert_that(response.data.data.channel_list[0].actual_instance, instance_of(MultiChannelChannelListRBMResponseObject)) + rbm_object = response.data.data.channel_list[0].actual_instance + assert_that(rbm_object.var_from, equal_to(BW_NUMBER)) + assert_that(rbm_object.application_id, equal_to(BW_MESSAGING_APPLICATION_ID)) + assert_that(rbm_object.channel, equal_to(MultiChannelMessageChannelEnum.RBM)) + assert_that(rbm_object.owner, equal_to(BW_NUMBER)) + assert_that(rbm_object.content, is_not(none())) + assert_that(rbm_object.content, instance_of(MultiChannelChannelListRBMObjectAllOfContent)) + assert_that(rbm_object.content.actual_instance.actual_instance, instance_of(RbmMessageCarouselCard)) + rbm_content = rbm_object.content.actual_instance.actual_instance + assert_that(rbm_content.card_width, equal_to(CardWidthEnum.MEDIUM)) + assert_that(rbm_content.card_contents, is_not(none())) + assert_that(rbm_content.card_contents, instance_of(list)) + assert_that(len(rbm_content.card_contents), equal_to(2)) + assert_that(rbm_content.card_contents[0], instance_of(RbmCardContent)) + assert_that(rbm_content.card_contents[0].title, equal_to("Card 1 Title")) + assert_that(rbm_content.card_contents[0].description, equal_to("We are glad to have you here.")) + assert_that(rbm_content.card_contents[0].media, is_not(none())) + assert_that(rbm_content.card_contents[0].media, instance_of(RbmCardContentMedia)) + assert_that(rbm_content.card_contents[0].media.file_url, instance_of(str)) + assert_that(rbm_content.card_contents[0].media.thumbnail_url, instance_of(str)) + assert_that(rbm_content.card_contents[0].media.height, equal_to(RbmMediaHeightEnum.TALL)) + assert_that(rbm_content.card_contents[0].suggestions, is_not(none())) + assert_that(rbm_content.card_contents[0].suggestions, instance_of(list)) + assert_that(len(rbm_content.card_contents[0].suggestions), equal_to(1)) + assert_that(rbm_content.card_contents[0].suggestions[0], instance_of(MultiChannelAction)) + assert_that(rbm_content.card_contents[1], instance_of(RbmCardContent)) + assert_that(rbm_content.card_contents[1].title, equal_to("Card 2 Title")) if __name__ == '__main__': unittest.main() diff --git a/test/unit/api/test_toll_free_verification_api.py b/test/unit/api/test_toll_free_verification_api.py index 371bc20c..54ad7cbd 100644 --- a/test/unit/api/test_toll_free_verification_api.py +++ b/test/unit/api/test_toll_free_verification_api.py @@ -15,7 +15,6 @@ import unittest from datetime import datetime -from uuid import UUID from hamcrest import * from test.utils.env_variables import * @@ -144,7 +143,7 @@ def test_get_toll_free_verification_status(self) -> None: assert_that(response.data, instance_of(TfvStatus)) assert_that(response.data.phone_number, instance_of(str)) assert_that(response.data.status, is_in(TfvStatusEnum)) - assert_that(response.data.internal_ticket_number, instance_of(UUID)) + assert_that(response.data.internal_ticket_number, instance_of(str)) assert_that(response.data.decline_reason_description, instance_of(str)) assert_that(response.data.resubmit_allowed, instance_of(bool)) assert_that(response.data.created_date_time, instance_of(datetime)) diff --git a/test/unit/models/test_blocked_webhook.py b/test/unit/models/test_blocked_webhook.py index 5609062b..6685f921 100644 --- a/test/unit/models/test_blocked_webhook.py +++ b/test/unit/models/test_blocked_webhook.py @@ -14,7 +14,6 @@ import unittest -from uuid import UUID from bandwidth.models.blocked_webhook import BlockedWebhook @@ -39,7 +38,7 @@ def make_instance(self, include_optional) -> BlockedWebhook: account_id = '1234567', phone_number = '+18005555555', status = 'VERIFIED', - internal_ticket_number = UUID('acde070d-8c4c-4f0d-9d8a-162843c10333'), + internal_ticket_number = 'acde070d-8c4c-4f0d-9d8a-162843c10333', blocked = True, blocked_reason = 'Toll-free number was used to send spam messages' ) @@ -55,7 +54,7 @@ def testBlockedWebhook(self): assert instance.account_id == '1234567' assert instance.phone_number == '+18005555555' assert instance.status == 'VERIFIED' - assert instance.internal_ticket_number == UUID('acde070d-8c4c-4f0d-9d8a-162843c10333') + assert instance.internal_ticket_number == 'acde070d-8c4c-4f0d-9d8a-162843c10333' assert instance.blocked == True assert instance.blocked_reason == 'Toll-free number was used to send spam messages' diff --git a/test/unit/models/test_failure_webhook.py b/test/unit/models/test_failure_webhook.py index d5c61058..4ea4704a 100644 --- a/test/unit/models/test_failure_webhook.py +++ b/test/unit/models/test_failure_webhook.py @@ -14,7 +14,6 @@ import unittest -from uuid import UUID from bandwidth.models.failure_webhook import FailureWebhook @@ -41,7 +40,7 @@ def make_instance(self, include_optional) -> FailureWebhook: errors = [ 'optInWorkflowImageURLs: Entries must be a valid array of objects.' ], - internal_ticket_number = UUID('acde070d-8c4c-4f0d-9d8a-162843c10333') + internal_ticket_number = 'acde070d-8c4c-4f0d-9d8a-162843c10333' ) else: return FailureWebhook( @@ -59,7 +58,7 @@ def testFailureWebhook(self): assert isinstance(instance.errors, list) assert len(instance.errors) == 1 assert instance.errors[0] == 'optInWorkflowImageURLs: Entries must be a valid array of objects.' - assert instance.internal_ticket_number == UUID('acde070d-8c4c-4f0d-9d8a-162843c10333') + assert instance.internal_ticket_number == 'acde070d-8c4c-4f0d-9d8a-162843c10333' if __name__ == '__main__': unittest.main() diff --git a/test/unit/models/test_multi_channel_channel_list_rbm_object_all_of_content.py b/test/unit/models/test_multi_channel_channel_list_rbm_object_all_of_content.py index 78c95500..3629f6fe 100644 --- a/test/unit/models/test_multi_channel_channel_list_rbm_object_all_of_content.py +++ b/test/unit/models/test_multi_channel_channel_list_rbm_object_all_of_content.py @@ -58,10 +58,10 @@ def testMultiChannelChannelListRBMObjectAllOfContent(self): ] )) media = MultiChannelChannelListRBMObjectAllOfContent(RbmMessageMedia( - media = RbmMessageContentFile( + media = [RbmMessageContentFile( file_url = 'https://dev.bandwidth.com/images/bandwidth-logo.png', thumbnail_url = 'https://dev.bandwidth.com/images/bandwidth-logo.png' - ), + )], suggestions = [ MultiChannelAction( RbmActionBase( diff --git a/test/unit/models/test_rbm_message_media.py b/test/unit/models/test_rbm_message_media.py index 88ce0bf4..0d7dcbb6 100644 --- a/test/unit/models/test_rbm_message_media.py +++ b/test/unit/models/test_rbm_message_media.py @@ -36,10 +36,10 @@ def make_instance(self, include_optional) -> RbmMessageMedia: optional params are included """ if include_optional: return RbmMessageMedia( - media = RbmMessageContentFile( + media = [RbmMessageContentFile( file_url = 'https://dev.bandwidth.com/images/bandwidth-logo.png', thumbnail_url = 'https://dev.bandwidth.com/images/bandwidth-logo.png' - ), + )], suggestions = [ MultiChannelAction( RbmActionBase( @@ -64,7 +64,8 @@ def testRbmMessageMedia(self): assert instance is not None assert isinstance(instance, RbmMessageMedia) assert instance.media is not None - assert isinstance(instance.media, RbmMessageContentFile) + assert isinstance(instance.media, list) + assert isinstance(instance.media[0], RbmMessageContentFile) assert instance.suggestions is not None assert isinstance(instance.suggestions, list) diff --git a/test/unit/models/test_tfv_status.py b/test/unit/models/test_tfv_status.py index 9701bb98..bd4f40e3 100644 --- a/test/unit/models/test_tfv_status.py +++ b/test/unit/models/test_tfv_status.py @@ -15,7 +15,6 @@ import unittest from datetime import datetime -from uuid import UUID from bandwidth.models.tfv_status import TfvStatus from bandwidth.models.tfv_submission_info import TfvSubmissionInfo @@ -41,7 +40,7 @@ def make_instance(self, include_optional) -> TfvStatus: return TfvStatus( phone_number = '+18005555555', status = 'VERIFIED', - internal_ticket_number = UUID('acde070d-8c4c-4f0d-9d8a-162843c10333'), + internal_ticket_number = 'acde070d-8c4c-4f0d-9d8a-162843c10333', decline_reason_description = 'Invalid Information - Can\'t Validate URL - Website is not accessible / not available', resubmit_allowed = True, created_date_time = '2021-06-08T06:45:13Z', @@ -94,7 +93,7 @@ def testTfvStatus(self): assert isinstance(instance, TfvStatus) assert instance.phone_number == '+18005555555' assert instance.status == 'VERIFIED' - assert instance.internal_ticket_number == UUID('acde070d-8c4c-4f0d-9d8a-162843c10333') + assert instance.internal_ticket_number == 'acde070d-8c4c-4f0d-9d8a-162843c10333' assert instance.decline_reason_description == 'Invalid Information - Can\'t Validate URL - Website is not accessible / not available' assert instance.resubmit_allowed == True assert isinstance(instance.created_date_time, datetime) diff --git a/test/unit/models/test_verification_denial_webhook.py b/test/unit/models/test_verification_denial_webhook.py index 0e698914..04420b07 100644 --- a/test/unit/models/test_verification_denial_webhook.py +++ b/test/unit/models/test_verification_denial_webhook.py @@ -14,7 +14,6 @@ import unittest -from uuid import UUID from bandwidth.models.verification_denial_webhook import VerificationDenialWebhook @@ -38,7 +37,7 @@ def make_instance(self, include_optional) -> VerificationDenialWebhook: additional_denial_reasons = [{"statusCode":512,"reason":"Reason A","resubmitAllowed":True},{"statusCode":513,"reason":"Reason B","resubmitAllowed":True}], decline_reason_description = 'Invalid Information - Can\'t Validate URL - Website is not accessible / not available', denial_status_code = 511, - internal_ticket_number = UUID('acde070d-8c4c-4f0d-9d8a-162843c10333'), + internal_ticket_number = 'acde070d-8c4c-4f0d-9d8a-162843c10333', phone_number = '+18005555555', resubmit_allowed = True, status = 'UNVERIFIED', @@ -65,7 +64,7 @@ def testVerificationDenialWebhook(self): assert instance.additional_denial_reasons[1].resubmit_allowed == True assert instance.decline_reason_description == 'Invalid Information - Can\'t Validate URL - Website is not accessible / not available' assert instance.denial_status_code == 511 - assert instance.internal_ticket_number == UUID('acde070d-8c4c-4f0d-9d8a-162843c10333') + assert instance.internal_ticket_number == 'acde070d-8c4c-4f0d-9d8a-162843c10333' assert instance.phone_number == '+18005555555' assert instance.resubmit_allowed == True assert instance.status == 'UNVERIFIED' diff --git a/test/unit/models/test_verification_webhook.py b/test/unit/models/test_verification_webhook.py index 80fcb6bf..c53df78a 100644 --- a/test/unit/models/test_verification_webhook.py +++ b/test/unit/models/test_verification_webhook.py @@ -14,7 +14,6 @@ import unittest -from uuid import UUID from bandwidth.models.verification_webhook import VerificationWebhook @@ -37,7 +36,7 @@ def make_instance(self, include_optional) -> VerificationWebhook: account_id = '1234567', phone_number = '+18005555555', status = 'VERIFIED', - internal_ticket_number = UUID('acde070d-8c4c-4f0d-9d8a-162843c10333') + internal_ticket_number = 'acde070d-8c4c-4f0d-9d8a-162843c10333' ) else: return VerificationWebhook( @@ -51,7 +50,7 @@ def testVerificationWebhook(self): assert instance.account_id == '1234567' assert instance.phone_number == '+18005555555' assert instance.status == 'VERIFIED' - assert instance.internal_ticket_number == UUID('acde070d-8c4c-4f0d-9d8a-162843c10333') + assert instance.internal_ticket_number == 'acde070d-8c4c-4f0d-9d8a-162843c10333' if __name__ == '__main__': unittest.main()