From ca7f917da9060e30c91441f87e3ef19e35e4952b Mon Sep 17 00:00:00 2001 From: zedy Date: Thu, 10 Jun 2021 10:57:19 +0800 Subject: [PATCH 1/5] Upgrade EventGrid to the new SDKs --- .../Controllers/ChoreographyController.cs | 11 ++- ...am.Choreography.ChoreographyService.csproj | 3 +- .../Services/EventRepository.cs | 17 ++-- .../Services/IEventRepository.cs | 2 +- .../ChoreographyControllerFixture.cs | 90 ++++++++++++++----- ...reography.ChoreographyService.Tests.csproj | 1 + 6 files changed, 86 insertions(+), 38 deletions(-) diff --git a/choreography/src/choreography/Fabrikam.Choreography.ChoreographyService/Controllers/ChoreographyController.cs b/choreography/src/choreography/Fabrikam.Choreography.ChoreographyService/Controllers/ChoreographyController.cs index cb188442..ef2896c2 100644 --- a/choreography/src/choreography/Fabrikam.Choreography.ChoreographyService/Controllers/ChoreographyController.cs +++ b/choreography/src/choreography/Fabrikam.Choreography.ChoreographyService/Controllers/ChoreographyController.cs @@ -10,8 +10,8 @@ using Fabrikam.Choreography.ChoreographyService.Services; using Fabrikam.Communicator.Service.Operations; using Microsoft.AspNetCore.Mvc; -using Microsoft.Azure.EventGrid; -using Microsoft.Azure.EventGrid.Models; +using Azure.Messaging.EventGrid; +using Azure.Messaging.EventGrid.SystemEvents; using Microsoft.Extensions.Logging; @@ -56,12 +56,15 @@ public async Task Operation([FromBody] EventGridEvent[] events) return BadRequest("No Event for Choreography"); } - if (events[0].EventType is EventTypes.EventGridSubscriptionValidationEvent) + if (events[0].EventType is "Microsoft.EventGrid.SubscriptionValidationEvent") { try { var data = Operations.ConvertDataEventToType(events[0].Data); - var response = new SubscriptionValidationResponse(data.ValidationCode); + object[] parameters = new object[1]; + parameters[0] = data.ValidationCode; + object obj = Activator.CreateInstance(typeof(SubscriptionValidationResponse), parameters); + SubscriptionValidationResponse response = (SubscriptionValidationResponse) obj; return Ok(response); } catch (NullReferenceException ex) diff --git a/choreography/src/choreography/Fabrikam.Choreography.ChoreographyService/Fabrikam.Choreography.ChoreographyService.csproj b/choreography/src/choreography/Fabrikam.Choreography.ChoreographyService/Fabrikam.Choreography.ChoreographyService.csproj index 28aa2738..62387a91 100644 --- a/choreography/src/choreography/Fabrikam.Choreography.ChoreographyService/Fabrikam.Choreography.ChoreographyService.csproj +++ b/choreography/src/choreography/Fabrikam.Choreography.ChoreographyService/Fabrikam.Choreography.ChoreographyService.csproj @@ -7,14 +7,15 @@ + - + diff --git a/choreography/src/choreography/Fabrikam.Choreography.ChoreographyService/Services/EventRepository.cs b/choreography/src/choreography/Fabrikam.Choreography.ChoreographyService/Services/EventRepository.cs index c48bcc04..e646775c 100644 --- a/choreography/src/choreography/Fabrikam.Choreography.ChoreographyService/Services/EventRepository.cs +++ b/choreography/src/choreography/Fabrikam.Choreography.ChoreographyService/Services/EventRepository.cs @@ -3,25 +3,26 @@ using System.Linq; using System.Net.Http; using System.Threading.Tasks; -using Microsoft.Azure.EventGrid; -using Microsoft.Azure.EventGrid.Models; +using Azure; +using Azure.Messaging.EventGrid; +using NUnit.Framework; using Microsoft.Extensions.Logging; namespace Fabrikam.Choreography.ChoreographyService.Services { public class EventRepository : IEventRepository { - private readonly TopicCredentials topicCredentials; - private readonly EventGridClient eventGridClient; + private readonly AzureKeyCredential topicCredentials; + private readonly EventGridPublisherClient eventGridClient; private readonly string eventGridHost; private readonly string[] Topics; private readonly Random random; public EventRepository(string eventGridHost,string eventKey, string Topics) { - topicCredentials = new TopicCredentials(eventKey); - eventGridClient = new EventGridClient(topicCredentials); + topicCredentials = new AzureKeyCredential(eventKey); this.eventGridHost = eventGridHost; + eventGridClient = new EventGridPublisherClient(new Uri(eventGridHost), topicCredentials); this.Topics = Topics.Split(","); random = new Random(); } @@ -36,8 +37,8 @@ public async Task SendEventAsync(List listEvents) try { - var response = await eventGridClient.PublishEventsWithHttpMessagesAsync(eventGridHost, listEvents); - response.Response.EnsureSuccessStatusCode(); + var response = await eventGridClient.SendEventsAsync(listEvents); + Assert.AreEqual(200, response.Status); } catch (Exception ex) when (ex is ArgumentNullException || ex is InvalidOperationException || diff --git a/choreography/src/choreography/Fabrikam.Choreography.ChoreographyService/Services/IEventRepository.cs b/choreography/src/choreography/Fabrikam.Choreography.ChoreographyService/Services/IEventRepository.cs index fe55798c..0a187f70 100644 --- a/choreography/src/choreography/Fabrikam.Choreography.ChoreographyService/Services/IEventRepository.cs +++ b/choreography/src/choreography/Fabrikam.Choreography.ChoreographyService/Services/IEventRepository.cs @@ -1,4 +1,4 @@ -using Microsoft.Azure.EventGrid.Models; +using Azure.Messaging.EventGrid; using System; using System.Collections.Generic; using System.Linq; diff --git a/choreography/src/choreography/Frabrikam.Choreography.ChoreographyService.Tests/ChoreographyControllerFixture.cs b/choreography/src/choreography/Frabrikam.Choreography.ChoreographyService.Tests/ChoreographyControllerFixture.cs index 7532fb81..57a6b046 100644 --- a/choreography/src/choreography/Frabrikam.Choreography.ChoreographyService.Tests/ChoreographyControllerFixture.cs +++ b/choreography/src/choreography/Frabrikam.Choreography.ChoreographyService.Tests/ChoreographyControllerFixture.cs @@ -10,28 +10,32 @@ using Fabrikam.Choreography.ChoreographyService.Models; using Fabrikam.Choreography.ChoreographyService.Services; using Microsoft.AspNetCore.Mvc; -using Microsoft.Azure.EventGrid; -using Microsoft.Azure.EventGrid.Models; +using Azure.Messaging.EventGrid; +using Azure.Messaging.EventGrid.SystemEvents; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging.Internal; using Microsoft.VisualStudio.TestTools.UnitTesting; using Moq; - namespace Fabrikam.Choreography.ChoreographyService.Tests { [TestClass] public class ChoreographyControllerFixture { private static Delivery delivery = new Delivery(); - SubscriptionValidationEventData eventValidationData = new SubscriptionValidationEventData(Guid.NewGuid().ToString(), "http://url"); + public static object obj = Activator.CreateInstance(typeof(SubscriptionValidationEventData)); + SubscriptionValidationEventData eventValidationData = (SubscriptionValidationEventData) obj; [TestMethod] public async Task Post_Returns200_ForSubscriptionValidationData() - { - var eventOp = new EventGridEvent(); - eventOp.EventType = EventTypes.EventGridSubscriptionValidationEvent; - eventOp.Data = eventValidationData; + { + var eventOp = new EventGridEvent( + "EventSubject", + "EventType", + "1.0", + "This is the event data"); + eventOp.EventType = "Microsoft.EventGrid.SubscriptionValidationEvent"; + eventOp.Data = new BinaryData(eventValidationData); var target = new ChoreographyController(new Mock().Object, new Mock().Object, new Mock().Object, @@ -50,8 +54,12 @@ public async Task Post_Returns200_ForSubscriptionValidationData() public async Task Post_Returns400_ForInvalidSubscriptionValidationData() { var loggerMock = new Mock>(); - var eventOp = new EventGridEvent(); - eventOp.EventType = EventTypes.EventGridSubscriptionValidationEvent; + var eventOp = new EventGridEvent( + "EventSubject", + "EventType", + "1.0", + "This is the event data"); + eventOp.EventType = "Microsoft.EventGrid.SubscriptionValidationEvent"; eventOp.Data = null; var target = new ChoreographyController(new Mock().Object, new Mock().Object, @@ -76,9 +84,14 @@ public async Task Post_Returns200_ForValidDeliveryService() deliveryCallerMock.Setup(r => r.ScheduleDeliveryAsync(It.IsAny(), It.IsAny())) .ReturnsAsync(new DeliverySchedule { Id = "deliveryid" }).Verifiable(); - var eventOp = new EventGridEvent(); + var eventOp = new EventGridEvent( + "EventSubject", + "EventType", + "1.0", + "This is the event data"); eventOp.EventType = "GetDrone"; - eventOp.Data = new Delivery(); + Delivery delivery = new Delivery(); + eventOp.Data = new BinaryData(delivery); var target = new ChoreographyController(new Mock().Object, new Mock().Object, deliveryCallerMock.Object, @@ -103,10 +116,15 @@ public async Task Post_Returns200_ForValidPackageService() var eventRepositoryMock = new Mock(); eventRepositoryMock.Setup(e => e.SendEventAsync(It.IsAny>())) .Returns(Task.CompletedTask).Verifiable(); - - var eventOp = new EventGridEvent(); + + var eventOp = new EventGridEvent( + "EventSubject", + "EventType", + "1.0", + "This is the event data"); eventOp.EventType = "ScheduleDelivery"; - eventOp.Data = new Delivery(); + Delivery delivery = new Delivery(); + eventOp.Data = new BinaryData(delivery); var target = new ChoreographyController(packageServiceCallerMock.Object, new Mock().Object, new Mock().Object, @@ -134,9 +152,14 @@ public async Task Post_Returns200_ForValidDroneService() eventRepositoryMock.Setup(e => e.SendEventAsync(It.IsAny>())) .Returns(Task.CompletedTask).Verifiable(); - var eventOp = new EventGridEvent(); + var eventOp = new EventGridEvent( + "EventSubject", + "EventType", + "1.0", + "This is the event data"); eventOp.EventType = "CreatePackage"; - eventOp.Data = new Delivery(); + Delivery delivery = new Delivery(); + eventOp.Data = new BinaryData(delivery); var target = new ChoreographyController(new Mock().Object, droneServiceCallerMock.Object, new Mock().Object, @@ -177,7 +200,11 @@ public async Task Post_Returns400_ForNoEvent_AndIslogged() public async Task Post_Returns400_ForNullDelivery() { var loggerMock = new Mock>(); - var eventOp = new EventGridEvent(); + var eventOp = new EventGridEvent( + "EventSubject", + "EventType", + "1.0", + "This is the event data"); eventOp.EventType = "GetDrone"; eventOp.Data = null; var target = new ChoreographyController(new Mock().Object, @@ -199,9 +226,14 @@ public async Task Post_Returns400_ForNullDelivery() public async Task Post_Returns400_ForInvalidDelivery() { var loggerMock = new Mock>(); - var eventOp = new EventGridEvent(); + var eventOp = new EventGridEvent( + "EventSubject", + "EventType", + "1.0", + "This is the event data"); eventOp.EventType = "GetDrone"; - eventOp.Data = new { invalidId=10, InvalidName="invalid" }; + var content = new { invalidId = 10, InvalidName = "invalid" }; + eventOp.Data = new BinaryData(content); var target = new ChoreographyController(new Mock().Object, new Mock().Object, @@ -231,9 +263,14 @@ public async Task Post_Returns400_WhenPackageServiceFailswithEventException() eventRepositoryMock.Setup(e => e.SendEventAsync(It.IsAny>())) .ThrowsAsync(new EventException()).Verifiable(); - var eventOp = new EventGridEvent(); + var eventOp = new EventGridEvent( + "EventSubject", + "EventType", + "1.0", + "This is the event data"); eventOp.EventType = "ScheduleDelivery"; - eventOp.Data = new Delivery(); + Delivery delivery = new Delivery(); + eventOp.Data = new BinaryData(delivery); var target = new ChoreographyController(packageServiceCallerMock.Object, new Mock().Object, new Mock().Object, @@ -263,9 +300,14 @@ public async Task Post_Returns400_WhenDroneServiceFailsToSendEvent() eventRepositoryMock.Setup(e => e.SendEventAsync(It.IsAny>())) .ThrowsAsync(new EventException()).Verifiable(); - var eventOp = new EventGridEvent(); + var eventOp = new EventGridEvent( + "EventSubject", + "EventType", + "1.0", + "This is the event data"); eventOp.EventType = "CreatePackage"; - eventOp.Data = new Delivery(); + Delivery delivery = new Delivery(); + eventOp.Data = new BinaryData(delivery); var target = new ChoreographyController(new Mock().Object, droneServiceCallerMock.Object, new Mock().Object, diff --git a/choreography/src/choreography/Frabrikam.Choreography.ChoreographyService.Tests/Fabrikam.Choreography.ChoreographyService.Tests.csproj b/choreography/src/choreography/Frabrikam.Choreography.ChoreographyService.Tests/Fabrikam.Choreography.ChoreographyService.Tests.csproj index 232b9172..582d38fc 100644 --- a/choreography/src/choreography/Frabrikam.Choreography.ChoreographyService.Tests/Fabrikam.Choreography.ChoreographyService.Tests.csproj +++ b/choreography/src/choreography/Frabrikam.Choreography.ChoreographyService.Tests/Fabrikam.Choreography.ChoreographyService.Tests.csproj @@ -7,6 +7,7 @@ + From 4f2cb915ed283090c47ac10bd41507d42cbc3906 Mon Sep 17 00:00:00 2001 From: zedy Date: Fri, 18 Jun 2021 17:27:08 +0800 Subject: [PATCH 2/5] update codes --- .../Controllers/ChoreographyController.cs | 16 +- .../Services/EventRepository.cs | 15 +- .../ChoreographyControllerFixture.cs | 173 ++++++++++-------- 3 files changed, 106 insertions(+), 98 deletions(-) diff --git a/choreography/src/choreography/Fabrikam.Choreography.ChoreographyService/Controllers/ChoreographyController.cs b/choreography/src/choreography/Fabrikam.Choreography.ChoreographyService/Controllers/ChoreographyController.cs index ef2896c2..d2060a4c 100644 --- a/choreography/src/choreography/Fabrikam.Choreography.ChoreographyService/Controllers/ChoreographyController.cs +++ b/choreography/src/choreography/Fabrikam.Choreography.ChoreographyService/Controllers/ChoreographyController.cs @@ -28,11 +28,12 @@ public class ChoreographyController : ControllerBase private readonly IDeliveryServiceCaller deliveryServiceCaller; private readonly IEventRepository eventRepository; - public ChoreographyController(IPackageServiceCaller packageServiceCaller, - IDroneSchedulerServiceCaller droneSchedulerServiceCaller, - IDeliveryServiceCaller deliveryServiceCaller, - IEventRepository eventRepository, - ILogger logger) + public ChoreographyController( + IPackageServiceCaller packageServiceCaller, + IDroneSchedulerServiceCaller droneSchedulerServiceCaller, + IDeliveryServiceCaller deliveryServiceCaller, + IEventRepository eventRepository, + ILogger logger) { this.packageServiceCaller = packageServiceCaller; this.droneSchedulerServiceCaller = droneSchedulerServiceCaller; @@ -61,10 +62,7 @@ public async Task Operation([FromBody] EventGridEvent[] events) try { var data = Operations.ConvertDataEventToType(events[0].Data); - object[] parameters = new object[1]; - parameters[0] = data.ValidationCode; - object obj = Activator.CreateInstance(typeof(SubscriptionValidationResponse), parameters); - SubscriptionValidationResponse response = (SubscriptionValidationResponse) obj; + var response = EventGridModelFactory.SubscriptionValidationResponse(data.ValidationCode); return Ok(response); } catch (NullReferenceException ex) diff --git a/choreography/src/choreography/Fabrikam.Choreography.ChoreographyService/Services/EventRepository.cs b/choreography/src/choreography/Fabrikam.Choreography.ChoreographyService/Services/EventRepository.cs index e646775c..62af3039 100644 --- a/choreography/src/choreography/Fabrikam.Choreography.ChoreographyService/Services/EventRepository.cs +++ b/choreography/src/choreography/Fabrikam.Choreography.ChoreographyService/Services/EventRepository.cs @@ -5,7 +5,6 @@ using System.Threading.Tasks; using Azure; using Azure.Messaging.EventGrid; -using NUnit.Framework; using Microsoft.Extensions.Logging; namespace Fabrikam.Choreography.ChoreographyService.Services @@ -14,14 +13,12 @@ public class EventRepository : IEventRepository { private readonly AzureKeyCredential topicCredentials; private readonly EventGridPublisherClient eventGridClient; - private readonly string eventGridHost; private readonly string[] Topics; private readonly Random random; public EventRepository(string eventGridHost,string eventKey, string Topics) { topicCredentials = new AzureKeyCredential(eventKey); - this.eventGridHost = eventGridHost; eventGridClient = new EventGridPublisherClient(new Uri(eventGridHost), topicCredentials); this.Topics = Topics.Split(","); random = new Random(); @@ -36,16 +33,12 @@ public async Task SendEventAsync(List listEvents) { try - { - var response = await eventGridClient.SendEventsAsync(listEvents); - Assert.AreEqual(200, response.Status); + { + await eventGridClient.SendEventsAsync(listEvents); } - catch (Exception ex) when (ex is ArgumentNullException || - ex is InvalidOperationException || - ex is HttpRequestException) + catch (Exception ex) { - throw new EventException("Exception sending event to eventGrid", ex); - + throw new RequestFailedException("Exception sending event to eventGrid", ex); } diff --git a/choreography/src/choreography/Frabrikam.Choreography.ChoreographyService.Tests/ChoreographyControllerFixture.cs b/choreography/src/choreography/Frabrikam.Choreography.ChoreographyService.Tests/ChoreographyControllerFixture.cs index 57a6b046..38faecaa 100644 --- a/choreography/src/choreography/Frabrikam.Choreography.ChoreographyService.Tests/ChoreographyControllerFixture.cs +++ b/choreography/src/choreography/Frabrikam.Choreography.ChoreographyService.Tests/ChoreographyControllerFixture.cs @@ -23,9 +23,8 @@ namespace Fabrikam.Choreography.ChoreographyService.Tests public class ChoreographyControllerFixture { private static Delivery delivery = new Delivery(); - public static object obj = Activator.CreateInstance(typeof(SubscriptionValidationEventData)); - SubscriptionValidationEventData eventValidationData = (SubscriptionValidationEventData) obj; - + SubscriptionValidationEventData eventValidationData = EventGridModelFactory.SubscriptionValidationEventData(Guid.NewGuid().ToString(), "http://url"); + [TestMethod] public async Task Post_Returns200_ForSubscriptionValidationData() { @@ -36,15 +35,16 @@ public async Task Post_Returns200_ForSubscriptionValidationData() "This is the event data"); eventOp.EventType = "Microsoft.EventGrid.SubscriptionValidationEvent"; eventOp.Data = new BinaryData(eventValidationData); - var target = new ChoreographyController(new Mock().Object, - new Mock().Object, - new Mock().Object, - new Mock().Object, - new Mock>().Object); - EventGridEvent[] events = new EventGridEvent[1]; - events[0] = eventOp; + var target = new ChoreographyController( + new Mock().Object, + new Mock().Object, + new Mock().Object, + new Mock().Object, + new Mock>().Object); + EventGridEvent[] events = new EventGridEvent[1]; + events[0] = eventOp; var result = await target.Operation(events) as OkObjectResult; Assert.IsNotNull(result); Assert.AreEqual(200, result.StatusCode); @@ -54,6 +54,7 @@ public async Task Post_Returns200_ForSubscriptionValidationData() public async Task Post_Returns400_ForInvalidSubscriptionValidationData() { var loggerMock = new Mock>(); + var eventOp = new EventGridEvent( "EventSubject", "EventType", @@ -61,14 +62,15 @@ public async Task Post_Returns400_ForInvalidSubscriptionValidationData() "This is the event data"); eventOp.EventType = "Microsoft.EventGrid.SubscriptionValidationEvent"; eventOp.Data = null; - var target = new ChoreographyController(new Mock().Object, - new Mock().Object, - new Mock().Object, - new Mock().Object, - loggerMock.Object); - EventGridEvent[] events = new EventGridEvent[1]; + var target = new ChoreographyController( + new Mock().Object, + new Mock().Object, + new Mock().Object, + new Mock().Object, + loggerMock.Object); + EventGridEvent[] events = new EventGridEvent[1]; events[0] = eventOp; var result = await target.Operation(events) as BadRequestObjectResult; Assert.IsNotNull(result); @@ -79,10 +81,9 @@ public async Task Post_Returns400_ForInvalidSubscriptionValidationData() [TestMethod] public async Task Post_Returns200_ForValidDeliveryService() { - var deliveryCallerMock = new Mock(); deliveryCallerMock.Setup(r => r.ScheduleDeliveryAsync(It.IsAny(), It.IsAny())) - .ReturnsAsync(new DeliverySchedule { Id = "deliveryid" }).Verifiable(); + .ReturnsAsync(new DeliverySchedule { Id = "deliveryid" }).Verifiable(); var eventOp = new EventGridEvent( "EventSubject", @@ -90,13 +91,16 @@ public async Task Post_Returns200_ForValidDeliveryService() "1.0", "This is the event data"); eventOp.EventType = "GetDrone"; + Delivery delivery = new Delivery(); eventOp.Data = new BinaryData(delivery); - var target = new ChoreographyController(new Mock().Object, - new Mock().Object, - deliveryCallerMock.Object, - new Mock().Object, - new Mock>().Object); + + var target = new ChoreographyController( + new Mock().Object, + new Mock().Object, + deliveryCallerMock.Object, + new Mock().Object, + new Mock>().Object); EventGridEvent[] events = new EventGridEvent[1]; events[0] = eventOp; @@ -104,15 +108,14 @@ public async Task Post_Returns200_ForValidDeliveryService() Assert.IsNotNull(result); Assert.AreEqual(200, result.StatusCode); deliveryCallerMock.Verify(); - } [TestMethod] public async Task Post_Returns200_ForValidPackageService() { - var packageServiceCallerMock = new Mock(); packageServiceCallerMock.Setup(r => r.UpsertPackageAsync(It.IsAny())) - .ReturnsAsync(new PackageGen { Id = "someid" }).Verifiable(); + .ReturnsAsync(new PackageGen { Id = "someid" }).Verifiable(); + var eventRepositoryMock = new Mock(); eventRepositoryMock.Setup(e => e.SendEventAsync(It.IsAny>())) .Returns(Task.CompletedTask).Verifiable(); @@ -123,16 +126,18 @@ public async Task Post_Returns200_ForValidPackageService() "1.0", "This is the event data"); eventOp.EventType = "ScheduleDelivery"; + Delivery delivery = new Delivery(); eventOp.Data = new BinaryData(delivery); - var target = new ChoreographyController(packageServiceCallerMock.Object, - new Mock().Object, - new Mock().Object, - eventRepositoryMock.Object, - new Mock>().Object); - EventGridEvent[] events = new EventGridEvent[1]; + var target = new ChoreographyController( + packageServiceCallerMock.Object, + new Mock().Object, + new Mock().Object, + eventRepositoryMock.Object, + new Mock>().Object); + EventGridEvent[] events = new EventGridEvent[1]; events[0] = eventOp; var result = await target.Operation(events) as OkObjectResult; Assert.IsNotNull(result); @@ -144,10 +149,10 @@ public async Task Post_Returns200_ForValidPackageService() [TestMethod] public async Task Post_Returns200_ForValidDroneService() { - var droneServiceCallerMock = new Mock(); droneServiceCallerMock.Setup(r => r.GetDroneIdAsync(It.IsAny())) - .ReturnsAsync("droneId").Verifiable(); + .ReturnsAsync("droneId").Verifiable(); + var eventRepositoryMock = new Mock(); eventRepositoryMock.Setup(e => e.SendEventAsync(It.IsAny>())) .Returns(Task.CompletedTask).Verifiable(); @@ -158,13 +163,16 @@ public async Task Post_Returns200_ForValidDroneService() "1.0", "This is the event data"); eventOp.EventType = "CreatePackage"; + Delivery delivery = new Delivery(); eventOp.Data = new BinaryData(delivery); - var target = new ChoreographyController(new Mock().Object, - droneServiceCallerMock.Object, - new Mock().Object, - eventRepositoryMock.Object, - new Mock>().Object); + + var target = new ChoreographyController( + new Mock().Object, + droneServiceCallerMock.Object, + new Mock().Object, + eventRepositoryMock.Object, + new Mock>().Object); EventGridEvent[] events = new EventGridEvent[1]; events[0] = eventOp; @@ -179,27 +187,26 @@ public async Task Post_Returns200_ForValidDroneService() [TestMethod] public async Task Post_Returns400_ForNoEvent_AndIslogged() { - var loggerMock = new Mock>(); - var target = new ChoreographyController(new Mock().Object, - new Mock().Object, - new Mock().Object, - new Mock().Object, - loggerMock.Object); + var target = new ChoreographyController( + new Mock().Object, + new Mock().Object, + new Mock().Object, + new Mock().Object, + loggerMock.Object); var result = await target.Operation(null) as BadRequestObjectResult; Assert.IsNotNull(result); Assert.AreEqual(400, result.StatusCode); loggerMock.Verify(x => x.Log(LogLevel.Error, It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny>()), Times.Once); - - } [TestMethod] public async Task Post_Returns400_ForNullDelivery() { var loggerMock = new Mock>(); + var eventOp = new EventGridEvent( "EventSubject", "EventType", @@ -207,25 +214,27 @@ public async Task Post_Returns400_ForNullDelivery() "This is the event data"); eventOp.EventType = "GetDrone"; eventOp.Data = null; - var target = new ChoreographyController(new Mock().Object, - new Mock().Object, - new Mock().Object, - new Mock().Object, - loggerMock.Object); + + var target = new ChoreographyController( + new Mock().Object, + new Mock().Object, + new Mock().Object, + new Mock().Object, + loggerMock.Object); + EventGridEvent[] events = new EventGridEvent[1]; events[0] = eventOp; var result = await target.Operation(events) as BadRequestObjectResult; Assert.IsNotNull(result); Assert.AreEqual(400, result.StatusCode); loggerMock.Verify(x => x.Log(LogLevel.Error, It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny>()), Times.Once); - - } [TestMethod] public async Task Post_Returns400_ForInvalidDelivery() { var loggerMock = new Mock>(); + var eventOp = new EventGridEvent( "EventSubject", "EventType", @@ -235,11 +244,12 @@ public async Task Post_Returns400_ForInvalidDelivery() var content = new { invalidId = 10, InvalidName = "invalid" }; eventOp.Data = new BinaryData(content); - var target = new ChoreographyController(new Mock().Object, - new Mock().Object, - new Mock().Object, - new Mock().Object, - loggerMock.Object); + var target = new ChoreographyController( + new Mock().Object, + new Mock().Object, + new Mock().Object, + new Mock().Object, + loggerMock.Object); EventGridEvent[] events = new EventGridEvent[1]; events[0] = eventOp; @@ -247,21 +257,21 @@ public async Task Post_Returns400_ForInvalidDelivery() Assert.IsNotNull(result); Assert.AreEqual(400, result.StatusCode); loggerMock.Verify(x => x.Log(LogLevel.Error, It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny>()), Times.Once); - - } [TestMethod] public async Task Post_Returns400_WhenPackageServiceFailswithEventException() { - var loggerMock = new Mock>(); var packageServiceCallerMock = new Mock(); + packageServiceCallerMock.Setup(r => r.UpsertPackageAsync(It.IsAny())) - .ReturnsAsync(new PackageGen { Id = "someid" }).Verifiable(); + .ReturnsAsync(new PackageGen { Id = "someid" }).Verifiable(); + var eventRepositoryMock = new Mock(); + eventRepositoryMock.Setup(e => e.SendEventAsync(It.IsAny>())) - .ThrowsAsync(new EventException()).Verifiable(); + .ThrowsAsync(new EventException()).Verifiable(); var eventOp = new EventGridEvent( "EventSubject", @@ -269,16 +279,18 @@ public async Task Post_Returns400_WhenPackageServiceFailswithEventException() "1.0", "This is the event data"); eventOp.EventType = "ScheduleDelivery"; + Delivery delivery = new Delivery(); eventOp.Data = new BinaryData(delivery); - var target = new ChoreographyController(packageServiceCallerMock.Object, - new Mock().Object, - new Mock().Object, - eventRepositoryMock.Object, - loggerMock.Object); - EventGridEvent[] events = new EventGridEvent[1]; + var target = new ChoreographyController( + packageServiceCallerMock.Object, + new Mock().Object, + new Mock().Object, + eventRepositoryMock.Object, + loggerMock.Object); + EventGridEvent[] events = new EventGridEvent[1]; events[0] = eventOp; var result = await target.Operation(events) as BadRequestObjectResult; Assert.IsNotNull(result); @@ -286,7 +298,6 @@ public async Task Post_Returns400_WhenPackageServiceFailswithEventException() packageServiceCallerMock.Verify(); eventRepositoryMock.Verify(); loggerMock.Verify(x => x.Log(LogLevel.Error, It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny>()), Times.Once); - } [TestMethod] @@ -294,11 +305,14 @@ public async Task Post_Returns400_WhenDroneServiceFailsToSendEvent() { var loggerMock = new Mock>(); var droneServiceCallerMock = new Mock(); + droneServiceCallerMock.Setup(r => r.GetDroneIdAsync(It.IsAny())) - .ReturnsAsync("droneId").Verifiable(); + .ReturnsAsync("droneId").Verifiable(); + var eventRepositoryMock = new Mock(); + eventRepositoryMock.Setup(e => e.SendEventAsync(It.IsAny>())) - .ThrowsAsync(new EventException()).Verifiable(); + .ThrowsAsync(new EventException()).Verifiable(); var eventOp = new EventGridEvent( "EventSubject", @@ -306,13 +320,16 @@ public async Task Post_Returns400_WhenDroneServiceFailsToSendEvent() "1.0", "This is the event data"); eventOp.EventType = "CreatePackage"; + Delivery delivery = new Delivery(); eventOp.Data = new BinaryData(delivery); - var target = new ChoreographyController(new Mock().Object, - droneServiceCallerMock.Object, - new Mock().Object, - eventRepositoryMock.Object, - loggerMock.Object); + + var target = new ChoreographyController( + new Mock().Object, + droneServiceCallerMock.Object, + new Mock().Object, + eventRepositoryMock.Object, + loggerMock.Object); EventGridEvent[] events = new EventGridEvent[1]; events[0] = eventOp; From 31e12591504776e3d68d9fb8df9fd28ac4dac493 Mon Sep 17 00:00:00 2001 From: zedy Date: Tue, 22 Jun 2021 16:06:26 +0800 Subject: [PATCH 3/5] use constant --- .../Controllers/ChoreographyController.cs | 4 ++-- .../Services/EventRepository.cs | 8 ++++---- .../ChoreographyControllerFixture.cs | 4 ++-- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/choreography/src/choreography/Fabrikam.Choreography.ChoreographyService/Controllers/ChoreographyController.cs b/choreography/src/choreography/Fabrikam.Choreography.ChoreographyService/Controllers/ChoreographyController.cs index d2060a4c..06c3db5e 100644 --- a/choreography/src/choreography/Fabrikam.Choreography.ChoreographyService/Controllers/ChoreographyController.cs +++ b/choreography/src/choreography/Fabrikam.Choreography.ChoreographyService/Controllers/ChoreographyController.cs @@ -53,11 +53,11 @@ public async Task Operation([FromBody] EventGridEvent[] events) if (events == null) { - logger.LogError("event is Null"); + logger.LogError("event is Null"); return BadRequest("No Event for Choreography"); } - if (events[0].EventType is "Microsoft.EventGrid.SubscriptionValidationEvent") + if (events[0].EventType is SystemEventNames.EventGridSubscriptionValidation) { try { diff --git a/choreography/src/choreography/Fabrikam.Choreography.ChoreographyService/Services/EventRepository.cs b/choreography/src/choreography/Fabrikam.Choreography.ChoreographyService/Services/EventRepository.cs index 62af3039..5269487c 100644 --- a/choreography/src/choreography/Fabrikam.Choreography.ChoreographyService/Services/EventRepository.cs +++ b/choreography/src/choreography/Fabrikam.Choreography.ChoreographyService/Services/EventRepository.cs @@ -13,20 +13,20 @@ public class EventRepository : IEventRepository { private readonly AzureKeyCredential topicCredentials; private readonly EventGridPublisherClient eventGridClient; - private readonly string[] Topics; + private readonly string[] topics; private readonly Random random; - public EventRepository(string eventGridHost,string eventKey, string Topics) + public EventRepository(string eventGridHost,string eventKey, string topics) { topicCredentials = new AzureKeyCredential(eventKey); eventGridClient = new EventGridPublisherClient(new Uri(eventGridHost), topicCredentials); - this.Topics = Topics.Split(","); + this.topics = topics.Split(","); random = new Random(); } public string GetTopic() { - return Topics[random.Next(0, Topics.Length)]; + return topics[random.Next(0, topics.Length)]; } public async Task SendEventAsync(List listEvents) diff --git a/choreography/src/choreography/Frabrikam.Choreography.ChoreographyService.Tests/ChoreographyControllerFixture.cs b/choreography/src/choreography/Frabrikam.Choreography.ChoreographyService.Tests/ChoreographyControllerFixture.cs index 38faecaa..971480ac 100644 --- a/choreography/src/choreography/Frabrikam.Choreography.ChoreographyService.Tests/ChoreographyControllerFixture.cs +++ b/choreography/src/choreography/Frabrikam.Choreography.ChoreographyService.Tests/ChoreographyControllerFixture.cs @@ -33,7 +33,7 @@ public async Task Post_Returns200_ForSubscriptionValidationData() "EventType", "1.0", "This is the event data"); - eventOp.EventType = "Microsoft.EventGrid.SubscriptionValidationEvent"; + eventOp.EventType = SystemEventNames.EventGridSubscriptionValidation; eventOp.Data = new BinaryData(eventValidationData); var target = new ChoreographyController( @@ -60,7 +60,7 @@ public async Task Post_Returns400_ForInvalidSubscriptionValidationData() "EventType", "1.0", "This is the event data"); - eventOp.EventType = "Microsoft.EventGrid.SubscriptionValidationEvent"; + eventOp.EventType = SystemEventNames.EventGridSubscriptionValidation; eventOp.Data = null; var target = new ChoreographyController( From 00d9786e55e142905435876dee3dbdc1e0dd8aa7 Mon Sep 17 00:00:00 2001 From: zedy Date: Fri, 25 Jun 2021 16:00:31 +0800 Subject: [PATCH 4/5] some update according to comments --- .../Controllers/ChoreographyController.cs | 14 +++++++++++--- ...abrikam.Choreography.ChoreographyService.csproj | 2 +- .../Services/EventRepository.cs | 4 +++- ...m.Choreography.ChoreographyService.Tests.csproj | 2 +- 4 files changed, 16 insertions(+), 6 deletions(-) diff --git a/choreography/src/choreography/Fabrikam.Choreography.ChoreographyService/Controllers/ChoreographyController.cs b/choreography/src/choreography/Fabrikam.Choreography.ChoreographyService/Controllers/ChoreographyController.cs index 06c3db5e..bc1b293d 100644 --- a/choreography/src/choreography/Fabrikam.Choreography.ChoreographyService/Controllers/ChoreographyController.cs +++ b/choreography/src/choreography/Fabrikam.Choreography.ChoreographyService/Controllers/ChoreographyController.cs @@ -61,9 +61,17 @@ public async Task Operation([FromBody] EventGridEvent[] events) { try { - var data = Operations.ConvertDataEventToType(events[0].Data); - var response = EventGridModelFactory.SubscriptionValidationResponse(data.ValidationCode); - return Ok(response); + events[0].TryGetSystemEventData(out object systemEvent); + switch (systemEvent) + { + case SubscriptionValidationEventData subscriptionValidation: + return new OkObjectResult(new SubscriptionValidationResponse() + { + ValidationResponse = subscriptionValidation.ValidationCode + }); + default: + break; + } } catch (NullReferenceException ex) { diff --git a/choreography/src/choreography/Fabrikam.Choreography.ChoreographyService/Fabrikam.Choreography.ChoreographyService.csproj b/choreography/src/choreography/Fabrikam.Choreography.ChoreographyService/Fabrikam.Choreography.ChoreographyService.csproj index 62387a91..dc9bd378 100644 --- a/choreography/src/choreography/Fabrikam.Choreography.ChoreographyService/Fabrikam.Choreography.ChoreographyService.csproj +++ b/choreography/src/choreography/Fabrikam.Choreography.ChoreographyService/Fabrikam.Choreography.ChoreographyService.csproj @@ -7,7 +7,7 @@ - + diff --git a/choreography/src/choreography/Fabrikam.Choreography.ChoreographyService/Services/EventRepository.cs b/choreography/src/choreography/Fabrikam.Choreography.ChoreographyService/Services/EventRepository.cs index 5269487c..a8df9848 100644 --- a/choreography/src/choreography/Fabrikam.Choreography.ChoreographyService/Services/EventRepository.cs +++ b/choreography/src/choreography/Fabrikam.Choreography.ChoreographyService/Services/EventRepository.cs @@ -36,7 +36,9 @@ public async Task SendEventAsync(List listEvents) { await eventGridClient.SendEventsAsync(listEvents); } - catch (Exception ex) + catch (Exception ex) when (ex is ArgumentNullException || + ex is InvalidOperationException || + ex is HttpRequestException) { throw new RequestFailedException("Exception sending event to eventGrid", ex); } diff --git a/choreography/src/choreography/Frabrikam.Choreography.ChoreographyService.Tests/Fabrikam.Choreography.ChoreographyService.Tests.csproj b/choreography/src/choreography/Frabrikam.Choreography.ChoreographyService.Tests/Fabrikam.Choreography.ChoreographyService.Tests.csproj index 582d38fc..fa98c21f 100644 --- a/choreography/src/choreography/Frabrikam.Choreography.ChoreographyService.Tests/Fabrikam.Choreography.ChoreographyService.Tests.csproj +++ b/choreography/src/choreography/Frabrikam.Choreography.ChoreographyService.Tests/Fabrikam.Choreography.ChoreographyService.Tests.csproj @@ -7,7 +7,7 @@ - + From a661909df995286fe456e232f944680412cd1bbd Mon Sep 17 00:00:00 2001 From: v-yilinhu Date: Tue, 10 Aug 2021 11:01:46 +0800 Subject: [PATCH 5/5] update exception --- .../Controllers/ChoreographyController.cs | 23 +++++++++++++++---- 1 file changed, 18 insertions(+), 5 deletions(-) diff --git a/choreography/src/choreography/Fabrikam.Choreography.ChoreographyService/Controllers/ChoreographyController.cs b/choreography/src/choreography/Fabrikam.Choreography.ChoreographyService/Controllers/ChoreographyController.cs index bc1b293d..608a09aa 100644 --- a/choreography/src/choreography/Fabrikam.Choreography.ChoreographyService/Controllers/ChoreographyController.cs +++ b/choreography/src/choreography/Fabrikam.Choreography.ChoreographyService/Controllers/ChoreographyController.cs @@ -123,13 +123,22 @@ public async Task Operation([FromBody] EventGridEvent[] events) await eventRepository.SendEventAsync(listEvents); return Ok("Created Package Completed"); } - catch (Exception ex) when (ex is BackendServiceCallFailedException || - ex is EventException || ex is Exception) + catch (EventException ex) { logger.LogError(ex.Message, ex); return BadRequest(ex); } + catch (BackendServiceCallFailedException ex) + { + logger.LogError(ex.Message, ex); + return StatusCode(500); + } + catch (Exception ex) + { + logger.LogError(ex.Message, ex); + return BadRequest(ex); + } } case Operations.ChoreographyOperation.CreatePackage: @@ -149,12 +158,16 @@ public async Task Operation([FromBody] EventGridEvent[] events) return Ok("Drone Completed"); } - catch (Exception ex) when (ex is BackendServiceCallFailedException || - ex is EventException) + catch (EventException ex) { logger.LogError(ex.Message, ex); return BadRequest(ex); } + catch (BackendServiceCallFailedException ex) + { + logger.LogError(ex.Message, ex); + return StatusCode(500); + } } case Operations.ChoreographyOperation.GetDrone: { @@ -163,7 +176,7 @@ public async Task Operation([FromBody] EventGridEvent[] events) var deliverySchedule = await deliveryServiceCaller.ScheduleDeliveryAsync(delivery, e.Subject); return Ok("Delivery Completed"); } - catch (Exception ex) when (ex is BackendServiceCallFailedException) + catch (BackendServiceCallFailedException ex) { logger.LogError(ex.Message, ex); return BadRequest(ex);