Skip to content

Commit

Permalink
Fix SDK bug. Add UT for Call Connection apis.
Browse files Browse the repository at this point in the history
  • Loading branch information
zihzhan-msft committed Sep 10, 2021
1 parent d15dbca commit 3f54f92
Show file tree
Hide file tree
Showing 13 changed files with 917 additions and 142 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@

from ._generated.operations import CallConnectionsOperations
from ._generated.models import CancelAllMediaOperationsRequest, PlayAudioRequest, PhoneNumberIdentifierModel
from ._converters import PlayAudioRequestConverter
from ._converters import PlayAudioRequestConverter, AddParticipantRequestConverter
from ._models import PlayAudioOptions, PlayAudioResult, CancelAllMediaOperationsResult, AddParticipantResult
from ._communication_identifier_serializer import (deserialize_identifier,
serialize_identifier)
Expand Down Expand Up @@ -60,53 +60,17 @@ def cancel_all_media_operations(
def play_audio(
self,
audio_file_uri, # type: str
loop, # type: bool
audio_file_id, # type: str
callback_uri, # type: str
operation_context = None, # type: Optional[str]
**kwargs, # type: str: Any
): # type: (...) -> PlayAudioResult

try:
if not audio_file_uri.lower().startswith('http'):
audio_file_uri = "https://" + audio_file_uri
except AttributeError:
raise ValueError("URL must be a string.")

if not audio_file_id:
raise ValueError("audio_file_id can not be None")

try:
if not callback_uri.lower().startswith('http'):
callback_uri = "https://" + callback_uri
except AttributeError:
raise ValueError("URL must be a string.")

play_audio_options = PlayAudioOptions(
audio_file_uri=audio_file_uri,
loop = loop,
audio_file_id=audio_file_id,
callback_uri=callback_uri,
operation_context=operation_context,
)

return self.play_audio(
playaudio_options=play_audio_options,
**kwargs
)

@distributed_trace()
@overload
def play_audio(
self,
play_audio_options, # type: PlayAudioOptions
**kwargs, # type: str: Any
): # type: (...) -> PlayAudioResult

if not audio_file_uri:
raise ValueError("audio_file_uri can not be None")

if not play_audio_options:
raise ValueError("options can not be None")

play_audio_request = PlayAudioRequestConverter.convert(play_audio_options)
play_audio_request = PlayAudioRequestConverter.convert(audio_file_uri, play_audio_options)

play_audio_result = self.call_connection_client.play_audio(
call_connection_id=self.call_connection_id,
Expand All @@ -128,12 +92,17 @@ def add_participant(
if not participant:
raise ValueError("participant can not be None")

alternate_caller_id = None if alternate_caller_id == None else PhoneNumberIdentifierModel(value=alternate_caller_id)

add_participant_request = AddParticipantRequestConverter.convert(
serialize_identifier(participant),
alternate_caller_id,
operation_context
)

add_participant_result = self.call_connection_client.add_participant(
call_connection_id=self.call_connection_id,
participant=serialize_identifier(participant),
alternate_caller_id=None if alternate_caller_id == None else PhoneNumberIdentifierModel(value=alternate_caller_id.properties['value']),
operation_context=operation_context,
callback_uri=None,
add_participant_request=add_participant_request,
**kwargs
)

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -162,7 +162,7 @@ def create_call_connection(
callback_uri=options.callback_uri,
requested_media_types=options.requested_media_types,
requested_call_events=options.requested_call_events,
alternate_caller_id=None if options.alternate_Caller_Id == None else PhoneNumberIdentifierModel(value=options.alternate_Caller_Id),
alternate_caller_id=None if options.alternate_Caller_Id == None else PhoneNumberIdentifierModel(value=options.alternate_Caller_Id.properties['value']),
subject=options.subject,
**kwargs
)
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
from ._converter import JoinCallRequestConverter, PlayAudioRequestConverter
from ._converter import JoinCallRequestConverter, PlayAudioRequestConverter, AddParticipantRequestConverter

__all__ = [
'JoinCallRequestConverter',
'PlayAudioRequestConverter'
'PlayAudioRequestConverter',
"AddParticipantRequestConverter"
]
Original file line number Diff line number Diff line change
Expand Up @@ -5,12 +5,23 @@
# --------------------------------------------------------------------------

from .._models import JoinCallOptions, PlayAudioOptions
from .._shared.models import CommunicationIdentifier
from .._generated.models import JoinCallRequest, PlayAudioRequest, CommunicationIdentifierModel
from .._shared.models import CommunicationIdentifier, PhoneNumberIdentifier
from .._generated.models import (
JoinCallRequest,
PlayAudioRequest,
CommunicationIdentifierModel,
AddParticipantRequest,
PhoneNumberIdentifierModel
)

class JoinCallRequestConverter(object):
@classmethod
def convert(self, source: CommunicationIdentifierModel, join_call_options: JoinCallOptions):
def convert(
self,
source: CommunicationIdentifierModel,
join_call_options: JoinCallOptions
): # type: (...) -> JoinCallRequest

if not source:
raise ValueError("source can not be None")
if not join_call_options:
Expand All @@ -21,19 +32,46 @@ def convert(self, source: CommunicationIdentifierModel, join_call_options: JoinC
callback_uri=join_call_options.callback_uri,
requested_media_types=join_call_options.requested_media_types,
requested_call_events=join_call_options.requested_call_events,
subject= join_call_options.subject)
subject= join_call_options.subject
)


class PlayAudioRequestConverter(object):
@classmethod
def convert(self, play_audio_options: PlayAudioOptions):
def convert(
self,
audio_file_uri: str,
play_audio_options: PlayAudioOptions
): # type: (...) -> PlayAudioRequest

if not audio_file_uri:
raise ValueError("audio_file_uri can not be None")
if not play_audio_options:
raise ValueError("playaudio_options can not be None")

return PlayAudioRequest(
audio_file_uri=play_audio_options.audio_file_uri,
audio_file_uri=audio_file_uri,
loop = play_audio_options.loop,
operation_context=play_audio_options,
audio_file_id=play_audio_options.audio_file_id,
callback_uri=play_audio_options.callback_uri)
callback_uri=play_audio_options.callback_uri
)

class AddParticipantRequestConverter(object):
@classmethod
def convert(
self,
participant: CommunicationIdentifierModel,
alternate_caller_id: PhoneNumberIdentifierModel = None,
operation_context: str = None
): # type: (...) -> AddParticipantRequest

if not participant:
raise ValueError("participant can not be None")

return AddParticipantRequest(
alternate_caller_id = alternate_caller_id,
participant = participant,
operation_context=operation_context,
callback_uri=None
)
Original file line number Diff line number Diff line change
Expand Up @@ -125,13 +125,11 @@ class PlayAudioOptions(object):
def __init__(
self,
*,
audio_file_uri: str,
loop: bool,
operation_context: str,
audio_file_id: str,
callback_uri: str,
):
self.audio_file_uri = audio_file_uri
self.loop = loop
self.operation_context = operation_context
self.audio_file_id = audio_file_id
Expand Down Expand Up @@ -179,15 +177,15 @@ def __init__(
self.result_info = kwargs['result_info']

@classmethod
def _from_generated(cls, play_audio_result):
if play_audio_result is None:
def _from_generated(cls, cancel_all_media_operations_result):
if cancel_all_media_operations_result is None:
return None

return cls(
operation_id=play_audio_result.operation_id,
status=play_audio_result.status,
operation_context=play_audio_result.operation_context,
result_info=ResultInfo._from_generated(play_audio_result.result_info)
operation_id=cancel_all_media_operations_result.operation_id,
status=cancel_all_media_operations_result.status,
operation_context=cancel_all_media_operations_result.operation_context,
result_info=ResultInfo._from_generated(cancel_all_media_operations_result.result_info)
)

class AddParticipantResult(object):
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@

from .._generated.aio.operations import CallConnectionsOperations
from .._generated.models import CancelAllMediaOperationsRequest, PlayAudioRequest, PhoneNumberIdentifierModel
from .._converters import PlayAudioRequestConverter
from .._converters import PlayAudioRequestConverter, AddParticipantRequestConverter
from .._models import PlayAudioOptions, PlayAudioResult, CancelAllMediaOperationsResult, AddParticipantResult
from .._communication_identifier_serializer import (deserialize_identifier,
serialize_identifier)
Expand Down Expand Up @@ -60,53 +60,17 @@ async def cancel_all_media_operations(
async def play_audio(
self,
audio_file_uri, # type: str
loop, # type: bool
audio_file_id, # type: str
callback_uri, # type: str
operation_context = None, # type: Optional[str]
**kwargs, # type: str: Any
): # type: (...) -> PlayAudioResult

try:
if not audio_file_uri.lower().startswith('http'):
audio_file_uri = "https://" + audio_file_uri
except AttributeError:
raise ValueError("URL must be a string.")

if not audio_file_id:
raise ValueError("audio_file_id can not be None")

try:
if not callback_uri.lower().startswith('http'):
callback_uri = "https://" + callback_uri
except AttributeError:
raise ValueError("URL must be a string.")

play_audio_options = PlayAudioOptions(
audio_file_uri=audio_file_uri,
loop = loop,
audio_file_id=audio_file_id,
callback_uri=callback_uri,
operation_context=operation_context,
)

return await self.play_audio(
playaudio_options=play_audio_options,
**kwargs
)

@distributed_trace_async()
@overload
async def play_audio(
self,
play_audio_options, # type: PlayAudioOptions
**kwargs, # type: str: Any
): # type: (...) -> PlayAudioResult

if not audio_file_uri:
raise ValueError("audio_file_uri can not be None")

if not play_audio_options:
raise ValueError("options can not be None")

play_audio_request = PlayAudioRequestConverter.convert(play_audio_options)
play_audio_request = PlayAudioRequestConverter.convert(audio_file_uri, play_audio_options)

play_audio_result = await self.call_connection_client.play_audio(
call_connection_id=self.call_connection_id,
Expand All @@ -129,12 +93,17 @@ async def add_participant(
if not participant:
raise ValueError("participant can not be None")

alternate_caller_id = None if alternate_caller_id == None else PhoneNumberIdentifierModel(value=alternate_caller_id)

add_participant_request = AddParticipantRequestConverter.convert(
serialize_identifier(participant),
alternate_caller_id,
operation_context
)

add_participant_result = await self.call_connection_client.add_participant(
call_connection_id=self.call_connection_id,
participant=serialize_identifier(participant),
alternate_caller_id=None if alternate_caller_id == None else PhoneNumberIdentifierModel(value=alternate_caller_id.properties['value']),
operation_context=operation_context,
callback_uri=None,
add_participant_request=add_participant_request,
**kwargs
)

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -161,7 +161,7 @@ async def create_call_connection(
callback_uri=options.callback_uri,
requested_media_types=options.requested_media_types,
requested_call_events=options.requested_call_events,
alternate_caller_id=None if options.alternate_Caller_Id == None else PhoneNumberIdentifierModel(value=options.alternate_Caller_Id),
alternate_caller_id=None if options.alternate_Caller_Id == None else PhoneNumberIdentifierModel(value=options.alternate_Caller_Id.properties['value']),
subject=options.subject,
**kwargs
)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,20 +6,58 @@

RESOURCE_SOURCE = "8:acs:resource_source"
RESOURCE_TARGET = "8:acs:resource_target"
Phone_Number = "+14255550123"
CALL_ID = "cad9df7b-f3ac-4c53-96f7-c76e7437b3c1"
CALLBACK_URI = "callBackUri"
CONNECTION_STRING = "endpoint=https://REDACTED.communication.azure.com/;accesskey=eyJhbG=="
FAKE_ENDPOINT = "https://endpoint"
FAKE_TOKEN = "Fake Token"
CALL_SUBJECT = "testsubject"

# CreateOrJoinCall
CreateOrJoinCallPayload={
"callLegId": CALL_ID,
"callConnectionId": CALL_ID,
}
ErrorPayload={"msg": "some error"}
"callLegId": CALL_ID,
"callConnectionId": CALL_ID,
}

# Common
Phone_Number = "+14255550123"
OPERATION_CONTEXT = "dummyOperationContext"
ErrorPayload={"msg": "some error"}
ClientType_ConnectionString = "use connectionString"
ClientType_ManagedIdentity = "use managedIdentity"
CALLBACK_URI = "https://bot.contoso.io/callback"
CONNECTION_STRING = "endpoint=https://REDACTED.communication.azure.com/;accesskey=eyJhbG=="

# CancelAllMediaOperaions
CancelAllMediaOperaionsResponsePayload = {
"operationId": "dummyId",
"status": "completed",
"operationContext": OPERATION_CONTEXT,
"resultInfo": {
"code": 200,
"subcode": 200,
"message": "dummyMessage"
}
}

SEVERCALL_ID = "b3ba87f4-9daf-4d0b-b95a-53d955a40577"

# PlayAudio
AUDIO_FILE_URI = "https://bot.contoso.io/audio/sample-message.wav"
AUDIO_FILE_ID = "sampleAudioFileId"
PlayAudioResponsePayload = {
"operationId": "dummyId",
"status": "running",
"operationContext": OPERATION_CONTEXT,
"resultInfo": {
"code": 200,
"subcode": 200,
"message": "dummyMessage"
}
}

# AddParticipant
AddParticipantResultPayload = {
"participantId": "dummyparticipantid"
}

SEVERCALL_ID = "b3ba87f4-9daf-4d0b-b95a-53d955a40577"
# RemoveParticipant
ParticipantId = "dummyParticipantId"
Loading

0 comments on commit 3f54f92

Please sign in to comment.