Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 4 additions & 4 deletions Source/ZoomNet.UnitTests/Models/PhoneCallRecordings.cs
Original file line number Diff line number Diff line change
Expand Up @@ -150,10 +150,10 @@ public void Parse_Json_PhoneCallRecording()
result.ShouldNotBeNull();
result.Id.ShouldBe("1234abcd5678efgh9012ijkl3456mnop");
result.CallerNumber.ShouldBe("+12345678901");
result.CallerNumberType.ShouldBe(PhoneCallRecordingCallerNumberType.External);
result.CallerNumberType.ShouldBe(PhoneCallNumberType.External);
result.CallerName.ShouldBe("12345678901");
result.CalleeNumber.ShouldBe("123");
result.CalleeNumberType.ShouldBe(PhoneCallRecordingCalleeNumberType.Internal);
result.CalleeNumberType.ShouldBe(PhoneCallNumberType.Internal);
result.CalleeName.ShouldBe("Callee Name");
result.CallInitiator.ShouldBeNull();
result.CallReceiver.ShouldBeNull();
Expand Down Expand Up @@ -189,10 +189,10 @@ public void Parse_Json_PhoneCallRecording_Extended()
result.ShouldNotBeNull();
result.Id.ShouldBe("1234abcd5678efgh9012ijkl3456mnop");
result.CallerNumber.ShouldBe("+12345678901");
result.CallerNumberType.ShouldBe(PhoneCallRecordingCallerNumberType.External);
result.CallerNumberType.ShouldBe(PhoneCallNumberType.External);
result.CallerName.ShouldBe("12345678901");
result.CalleeNumber.ShouldBe("123");
result.CalleeNumberType.ShouldBe(PhoneCallRecordingCalleeNumberType.Internal);
result.CalleeNumberType.ShouldBe(PhoneCallNumberType.Internal);
result.CalleeName.ShouldBe("Callee Name");
result.CallInitiator.Name.ShouldBe("Call Initiator");
result.CallInitiator.ExtensionNumber.ShouldBe("100");
Expand Down
126 changes: 123 additions & 3 deletions Source/ZoomNet.UnitTests/PhoneWebhookParserTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -644,6 +644,65 @@ public void PhoneSmsSentFailed()
VerifySmsMessage(parsedEvent.Message);
}

[Fact]
public void PhoneVoicemailDeleted()
{
var parsedEvent = ParseWebhookEvent<PhoneVoicemailDeletedEvent>(Resource.phone_voicemail_deleted_webhook);

VerifyPhoneVoicemailEvent(parsedEvent, ZoomNet.Models.Webhooks.EventType.PhoneVoicemailDeleted);

parsedEvent.Voicemails.ShouldNotBeNull();
parsedEvent.Voicemails.ShouldHaveSingleItem();
parsedEvent.Voicemails[0].Id.ShouldBe("0388975092074598b47330a6a87e9a7b");
}

[Fact]
public void PhoneVoicemailPermanentlyDeleted()
{
var parsedEvent = ParseWebhookEvent<PhoneVoicemailPermanentlyDeletedEvent>(Resource.phone_voicemail_permanently_deleted_webhook);

VerifyPhoneVoicemailEvent(parsedEvent, ZoomNet.Models.Webhooks.EventType.PhoneVoicemailPermanentlyDeleted);

parsedEvent.Voicemails.ShouldNotBeNull();
parsedEvent.Voicemails.ShouldHaveSingleItem();
parsedEvent.Voicemails[0].Id.ShouldBe("0388975092074598b47330a6a87e9a7b");
}

[Fact]
public void PhoneVoicemailReceived()
{
var parsedEvent = ParseWebhookEvent<PhoneVoicemailReceivedEvent>(Resource.phone_voicemail_received_webhook);

VerifyPhoneVoicemailEvent(parsedEvent, ZoomNet.Models.Webhooks.EventType.PhoneVoicemailReceived);

VerifyVoicemail(parsedEvent.Voicemail);
}

[Fact]
public void PhoneVoicemailReceivedForAccessMember()
{
var parsedEvent = ParseWebhookEvent<PhoneVoicemailReceivedForAccessMemberEvent>(Resource.phone_voicemail_received_for_access_member_webhook);

parsedEvent.EventType.ShouldBe(ZoomNet.Models.Webhooks.EventType.PhoneVoicemailReceivedForAccessMember);
parsedEvent.Timestamp.ShouldBe(eventTimestamp);
parsedEvent.AccountId.ShouldBe(AccountId);

VerifyVoicemail(parsedEvent.Voicemail, callerUserId: null);

parsedEvent.AccessMemberExtensionType.ShouldBe(PhoneCallExtensionType.User);
parsedEvent.AccessMemberId.ShouldBe("z8yCxjabcdEFGHfp8uQ");
}

[Fact]
public void PhoneVoicemailTranscriptCompleted()
{
var parsedEvent = ParseWebhookEvent<PhoneVoicemailTranscriptCompletedEvent>(Resource.phone_voicemail_transcript_completed_webhook);

VerifyPhoneVoicemailEvent(parsedEvent, ZoomNet.Models.Webhooks.EventType.PhoneVoicemailTranscriptCompleted);

VerifyVoicemail(parsedEvent.Voicemail, voicemailTranscript: true, callerUserId: null);
}

#endregion

#region private methods
Expand Down Expand Up @@ -805,7 +864,6 @@ private static void VerifyCallElement(

callElement.RecordingId.ShouldBe(RecordingId);
callElement.RecordingType.ShouldBe(CallElementRecordingType.Automatic);

callElement.VoicemailId.ShouldBe("6cd2da01bcaa47f58e3250a575c5f2bf");

callElement.TalkTime.ShouldBe(31);
Expand Down Expand Up @@ -909,10 +967,10 @@ private static void VerifyPhoneCallRecording(PhoneCallRecording recording, bool

recording.CallLogId.ShouldBe("a297ae04-a875-4cfd-85ab-4adcead91edb");

recording.CallerNumberType.ShouldBe(PhoneCallRecordingCallerNumberType.Internal);
recording.CallerNumberType.ShouldBe(PhoneCallNumberType.Internal);
recording.CallerName.ShouldBe("Caller Name");

recording.CalleeNumberType.ShouldBe(PhoneCallRecordingCalleeNumberType.External);
recording.CalleeNumberType.ShouldBe(PhoneCallNumberType.External);
recording.CalleeName.ShouldBe("Callee Name");

recording.Duration.ShouldBe(43);
Expand Down Expand Up @@ -1059,6 +1117,68 @@ private static void VerifySmsMessage(
message.PhoneNumbersOptStatuses[0].OptInMessage.ShouldBe("Text START to receive text messages from ZOOM.");
}

/// <summary>
/// Verify <see cref="PhoneVoicemailEvent"/> properties.
/// </summary>
private static void VerifyPhoneVoicemailEvent(PhoneVoicemailEvent parsedEvent, ZoomNet.Models.Webhooks.EventType eventType)
{
parsedEvent.EventType.ShouldBe(eventType);
parsedEvent.Timestamp.ShouldBe(eventTimestamp);
parsedEvent.AccountId.ShouldBe(AccountId);
}

/// <summary>
/// Verify <see cref="WebhookVoicemail"/> properties.
/// </summary>
private static void VerifyVoicemail(WebhookVoicemail voicemail, bool voicemailTranscript = false, string callerUserId = "9Y0sGVcgRrW_9eV6kwLf7w")
{
voicemail.ShouldNotBeNull();
voicemail.Id.ShouldBe("70ea156dc8414742839569c1556c3314");
voicemail.CallId.ShouldBe(CallId);
voicemail.CallLogId.ShouldBe("55fd0af0-beb0-433a-be97-388de5e99ab4");
voicemail.CallElementId.ShouldBe(CallElementId);
voicemail.CallHistoryId.ShouldBe(CallHistoryId);
voicemail.CreatedOn.ShouldBe(timestamp);

// There are some differences in available properties depending on voicemail or its transcript.
if (!voicemailTranscript)
{
voicemail.DownloadUrl.ShouldBe("https://example.com");
voicemail.Transcription.ShouldBeNull();

voicemail.Duration.ShouldBe(3);

voicemail.CalleeDidNumber.ShouldBe(PhoneNumberA);
voicemail.CallerDidNumber.ShouldBe(PhoneNumberB);
}
else
{
voicemail.DownloadUrl.ShouldBeNull();
voicemail.Transcription.ShouldNotBeNull();
voicemail.Transcription.Status.ShouldBe(VoicemailTranscriptStatus.Completed);
voicemail.Transcription.Content.ShouldBe("Some Transcript content");

voicemail.Duration.ShouldBeNull();

voicemail.CalleeDidNumber.ShouldBeNull();
voicemail.CallerDidNumber.ShouldBeNull();
}

voicemail.CalleeId.ShouldBe("s6njoqZLT6aPvUQ0JyydeQ");
voicemail.CalleeExtensionType.ShouldBe(PhoneCallExtensionType.User);
voicemail.CalleeName.ShouldBe("Jill Chill");
voicemail.CalleeNumber.ShouldBe("58011");
voicemail.CalleeNumberType.ShouldBe(PhoneCallNumberType.Internal);
voicemail.CalleeAccountCode.ShouldBe("123");
voicemail.CalleeUserId.ShouldBe("s6njoqZLT6aPvUQ0JyydeQ");

voicemail.CallerName.ShouldBe("Rascoe Thomas");
voicemail.CallerNumber.ShouldBe("12058945456");
voicemail.CallerNumberType.ShouldBe(PhoneCallNumberType.External);
voicemail.CallerAccountCode.ShouldBe("456");
voicemail.CallerUserId.ShouldBe(callerUserId);
}

#endregion
}
}
Original file line number Diff line number Diff line change
@@ -1,14 +1,14 @@
{
"event": "phone.voicemail_deleted",
"event_ts": 1626230691572,
"payload": {
"account_id": "Mt6sv4u0TAyPkwgsL2lxiA",
"account_id": "AAAAAABBBB",
"object": {
"voice_mails": [
{
"id": "0388975092074598b47330a6a87e9a7b"
}
]
}
},
"event_ts": 1619155436400
}
}
Original file line number Diff line number Diff line change
@@ -1,14 +1,14 @@
{
"event": "phone.voicemail_permanently_deleted",
"event_ts": 1626230691572,
"payload": {
"account_id": "Mt6sv4u0TAyPkwgsL2lxiA",
"account_id": "AAAAAABBBB",
"object": {
"voice_mails": [
{
"id": "0388975092074598b47330a6a87e9a7b"
}
]
}
},
"event_ts": 1619155436400
}
}
43 changes: 23 additions & 20 deletions Source/ZoomNet.UnitTests/WebhookData/phone.voicemail_received.json
Original file line number Diff line number Diff line change
@@ -1,28 +1,31 @@
{
"event": "phone.voicemail_received",
"event_ts": 1626230691572,
"payload": {
"account_id": "97IYU62bTpSY66_pir2PgA",
"account_id": "AAAAAABBBB",
"object": {
"callee_id": "s6njoqZLT6aPvUQ0JyydeQ",
"call_id": "666888666865648555",
"id": "70ea156dc8414742839569c1556c3314",
"call_id": "6998252113337041462",
"call_log_id": "55fd0af0-beb0-433a-be97-388de5e99ab4",
"call_history_id": "20210819-55fd0af0-beb0-433a-be97-388de5e99ab4",
"call_element_id": "20210609-a297ae04-a875-4cfd-85ab-4adcead91edb",
"call_history_id": "20231008-1ac1df2a-912e-d125-8a15-1a1233d10f1a",
"call_element_id": "20231008-48c1dfd4-91ce-4df5-8495-7c9e33d10869",
"callee_id": "s6njoqZLT6aPvUQ0JyydeQ",
"callee_extension_type": "user",
"callee_name": "Jill Chill",
"callee_did_number": "+12092592844",
"callee_number": "58011",
"callee_number_type": 1,
"callee_account_code": "123",
"callee_user_id": "s6njoqZLT6aPvUQ0JyydeQ",
"date_time": "2021-07-13T21:44:51Z",
"download_url": "https://example.com",
"duration": 3,
"caller_user_id": "9Y0sGVcgRrW_9eV6kwLf7w",
"caller_name": "Rascoe Thomas",
"caller_did_number": "+12055967465",
"callee_extension_type": "callQueue",
"callee_name": "Chris's_CQ01_2_members",
"callee_did_number": "+15104381494",
"callee_number_type": 1,
"date_time": "2021-08-19T00:16:22Z",
"download_url": "https://example.com/v2/phone/voice_mails/download/6q6cLeR8Q4WCdWGmGxCLEw",
"id": "70ea156dc8414742839569c1556c3314",
"callee_number": "58011",
"caller_number": "12059014629",
"caller_number_type": 2
"caller_did_number": "+12058945456",
"caller_number": "12058945456",
"caller_number_type": 2,
"caller_account_code": "456",
"caller_user_id": "9Y0sGVcgRrW_9eV6kwLf7w"
}
},
"event_ts": 1629332182327,
"event": "phone.voicemail_received"
}
}
Original file line number Diff line number Diff line change
@@ -1,29 +1,32 @@
{
"event": "phone.voicemail_received_for_access_member",
"event_ts": 1626230691572,
"payload": {
"account_id": "97IYU62bTpSY66_pir2PgA",
"account_id": "AAAAAABBBB",
"object": {
"callee_id": "s6njoqZLT6aPvUQ0JyydeQ",
"call_id": "666888666865648555",
"id": "70ea156dc8414742839569c1556c3314",
"call_id": "6998252113337041462",
"call_log_id": "55fd0af0-beb0-433a-be97-388de5e99ab4",
"call_history_id": "20210819-55fd0af0-beb0-433a-be97-388de5e99ab4",
"call_element_id": "20210609-a297ae04-a875-4cfd-85ab-4adcead91edb",
"call_history_id": "20231008-1ac1df2a-912e-d125-8a15-1a1233d10f1a",
"call_element_id": "20231008-48c1dfd4-91ce-4df5-8495-7c9e33d10869",
"callee_id": "s6njoqZLT6aPvUQ0JyydeQ",
"callee_extension_type": "user",
"callee_name": "Jill Chill",
"callee_did_number": "+12092592844",
"callee_number": "58011",
"callee_number_type": 1,
"callee_account_code": "123",
"callee_user_id": "s6njoqZLT6aPvUQ0JyydeQ",
"date_time": "2021-07-13T21:44:51Z",
"download_url": "https://example.com",
"duration": 3,
"caller_name": "Rascoe Thomas",
"caller_did_number": "+12055967465",
"callee_extension_type": "callQueue",
"callee_name": "Chris's_CQ01_2_members",
"callee_did_number": "+15104381494",
"callee_number_type": 1,
"date_time": "2021-08-19T00:16:22Z",
"download_url": "https://example.com/v2/phone/voice_mails/download/6q6cLeR8Q4WCdWGmGxCLEw",
"id": "70ea156dc8414742839569c1556c3314",
"callee_number": "58011",
"caller_number": "12059014629",
"caller_did_number": "+12058945456",
"caller_number": "12058945456",
"caller_number_type": 2,
"caller_account_code": "456",
"access_member_id": "z8yCxjabcdEFGHfp8uQ",
"access_member_extension_type": "user"
}
},
"event_ts": 1629332182327,
"event": "phone.voicemail_received_for_access_member"
}
}
Original file line number Diff line number Diff line change
@@ -1,27 +1,30 @@
{
"event": "phone.voicemail_transcript_completed",
"event_ts": 1626230691572,
"payload": {
"account_id": "97IYU62bTpSY66_pir2PgA",
"account_id": "AAAAAABBBB",
"object": {
"callee_id": "s6njoqZLT6aPvUQ0JyydeQ",
"call_id": "666888666865648555",
"call_log_id": "55fd0af0-beb0-433a-be97-388de5e99ab4",
"call_history_id": "20210819-55fd0af0-beb0-433a-be97-388de5e99ab4",
"call_element_id": "20210609-a297ae04-a875-4cfd-85ab-4adcead91edb",
"caller_name": "Rascoe Thomas",
"callee_extension_type": "callQueue",
"callee_name": "Chris's_CQ01_2_members",
"callee_number_type": 1,
"date_time": "2021-08-19T00:16:22Z",
"id": "70ea156dc8414742839569c1556c3314",
"call_id": "6998252113337041462",
"call_log_id": "55fd0af0-beb0-433a-be97-388de5e99ab4",
"call_history_id": "20231008-1ac1df2a-912e-d125-8a15-1a1233d10f1a",
"call_element_id": "20231008-48c1dfd4-91ce-4df5-8495-7c9e33d10869",
"callee_id": "s6njoqZLT6aPvUQ0JyydeQ",
"callee_extension_type": "user",
"callee_name": "Jill Chill",
"callee_number": "58011",
"caller_number": "12059014629",
"callee_number_type": 1,
"callee_account_code": "123",
"callee_user_id": "s6njoqZLT6aPvUQ0JyydeQ",
"date_time": "2021-07-13T21:44:51Z",
"caller_name": "Rascoe Thomas",
"caller_number": "12058945456",
"caller_number_type": 2,
"caller_account_code": "456",
"transcription": {
"status": 2,
"content": "Some Transcript content"
}
}
},
"event_ts": 1629332182327,
"event": "phone.voicemail_transcript_completed"
}
}
17 changes: 17 additions & 0 deletions Source/ZoomNet/Json/WebhookEventConverter.cs
Original file line number Diff line number Diff line change
Expand Up @@ -731,6 +731,23 @@ private static Models.Webhooks.Event ParsePayloadToWebhookEvent(JsonElement root
return payloadJsonProperty.ToObject<PhoneSmsSentEvent>(options);
case Models.Webhooks.EventType.PhoneSmsSentFailed:
return payloadJsonProperty.ToObject<PhoneSmsSentFailedEvent>(options);
case Models.Webhooks.EventType.PhoneVoicemailDeleted:
var phoneVoicemailDeletedEvent = payloadJsonProperty.ToObject<PhoneVoicemailDeletedEvent>(options);
phoneVoicemailDeletedEvent.Voicemails = payloadJsonProperty.GetPropertyValue<VoicemailBasicInfo[]>("object/voice_mails");
return phoneVoicemailDeletedEvent;
case Models.Webhooks.EventType.PhoneVoicemailPermanentlyDeleted:
var phoneVoicemailPermanentlyDeletedEvent = payloadJsonProperty.ToObject<PhoneVoicemailPermanentlyDeletedEvent>(options);
phoneVoicemailPermanentlyDeletedEvent.Voicemails = payloadJsonProperty.GetPropertyValue<VoicemailBasicInfo[]>("object/voice_mails");
return phoneVoicemailPermanentlyDeletedEvent;
case Models.Webhooks.EventType.PhoneVoicemailReceived:
return payloadJsonProperty.ToObject<PhoneVoicemailReceivedEvent>(options);
case Models.Webhooks.EventType.PhoneVoicemailReceivedForAccessMember:
var phoneVoicemailReceivedForAccessMemberEvent = payloadJsonProperty.ToObject<PhoneVoicemailReceivedForAccessMemberEvent>(options);
phoneVoicemailReceivedForAccessMemberEvent.AccessMemberExtensionType = payloadJsonProperty.GetPropertyValue<PhoneCallExtensionType>("object/access_member_extension_type");
phoneVoicemailReceivedForAccessMemberEvent.AccessMemberId = payloadJsonProperty.GetPropertyValue<string>("object/access_member_id", null);
return phoneVoicemailReceivedForAccessMemberEvent;
case Models.Webhooks.EventType.PhoneVoicemailTranscriptCompleted:
return payloadJsonProperty.ToObject<PhoneVoicemailTranscriptCompletedEvent>(options);
default:
throw new JsonException($"{eventType} is an unknown event type");
}
Expand Down
Loading