public void MessagesProcessor_DoubledItemMessageWithSameItemIdAndSaleIdNotNull_ProcessedOnlyOneMessage() { ResetCalls(); var saleId1 = new Guid("3832896B-3CF1-4B78-BAF8-22DBEA26B633"); var itemId1 = new Guid("D0E8C5CB-E787-4B83-97FC-67C5A9AF6880"); var countryId = "AS"; var productKey1 = $"{itemId1}_{saleId1}_{countryId}"; var encoding = new UTF8Encoding(); var adminEventId1 = Guid.NewGuid(); var adminEventId2 = Guid.NewGuid(); var message1 = new Message { ItemId = itemId1, EventAction = "Change", IntegrationMessageId = adminEventId1 }; var eventData1 = new EventData(encoding.GetBytes(JsonConvert.SerializeObject(message1).ToLower())); eventData1.Properties.Add("Type", message1.EventAction); var message2 = new Message { ItemId = itemId1, SaleId = saleId1, EventAction = "Change", IntegrationMessageId = adminEventId2 }; var eventData2 = new EventData(encoding.GetBytes(JsonConvert.SerializeObject(message2).ToLower())); eventData2.Properties.Add("Type", message2.EventAction); var sender1Events = new List <IEvent>(); ProductService.Setup(x => x.GetProductInCountries(itemId1, null, It.IsAny <string>())) .Returns(Task.FromResult <IEnumerable <ProductInCountry> >(new List <ProductInCountry> { new ProductInCountry { Id = productKey1, CountryId = countryId } })); ProductEventSender1.Setup(x => x.SendEvents(It.IsAny <IEnumerable <IEvent> >())) .Callback((IEnumerable <IEvent> productEvents) => { sender1Events.AddRange(productEvents); }); ProductEventSender1.Setup(x => x.CanSend(It.IsAny <IEvent>())).Returns(true); var senders = new List <IProductEventSender> { ProductEventSender1.Object, ProductEventSender2.Object }; var consumers = new List <ProductChangeConsumer> { new ProductChangeConsumer(ProductService.Object) }; var service = new MessagesProcessor <ProductChangeConsumer, IProductEventSender>(consumers, senders); service.ProcessEventsAsync(new PartitionContext(), new List <EventData> { eventData1, eventData2 }).ConfigureAwait(true); Assert.AreEqual(sender1Events.Count, 1); Assert.IsTrue(sender1Events.FirstOrDefault().Id == productKey1); Assert.IsTrue(sender1Events.FirstOrDefault().AdminEventIds.Contains(adminEventId1)); Assert.IsTrue(sender1Events.FirstOrDefault().AdminEventIds.Contains(adminEventId2)); ProductService.Verify(x => x.GetProductInCountries(It.IsAny <Guid>(), It.IsAny <Guid?>(), It.IsAny <string>()), Times.Once); ProductEventSender1.Verify(x => x.SendEvents(It.IsAny <IEnumerable <IEvent> >()), Times.Once); }
public void MessagesProcessor_OneMessageFailed_OtherShouldSend() { ResetCalls(); var saleId1 = new Guid("3832896B-3CF1-4B78-BAF8-22DBEA26B633"); var itemId1 = new Guid("D0E8C5CB-E787-4B83-97FC-67C5A9AF6880"); var saleId2 = new Guid("4832896B-3CF1-4B78-BAF8-22DBEA26B633"); var itemId2 = new Guid("50E8C5CB-E787-4B83-97FC-67C5A9AF6880"); var countryId = "AS"; var productKey1 = $"{itemId1}_{saleId1}_{countryId}"; var productKey2 = $"{itemId2}_{saleId2}_{countryId}"; var encoding = new UTF8Encoding(); var message1 = new Message { ItemId = itemId1, EventAction = "Create", IntegrationMessageId = Guid.NewGuid() }; var eventData1 = new EventData(encoding.GetBytes(JsonConvert.SerializeObject(message1).ToLower())); eventData1.Properties.Add("Type", message1.EventAction); var message2 = new Message { ItemId = itemId2, EventAction = "Create", IntegrationMessageId = Guid.NewGuid() }; var eventData2 = new EventData(encoding.GetBytes(JsonConvert.SerializeObject(message2).ToLower())); eventData2.Properties.Add("Type", message2.EventAction); var exceptionMessage = "It`s custom error message"; var innerExceptionMessage = "It`s custom inner exception message"; ProductService.Setup(x => x.GetProductInCountries(itemId1, null, null)).Throws(new Exception(exceptionMessage, new Exception(innerExceptionMessage))); ProductService.Setup(x => x.GetProductInCountries(itemId2, null, null)).Returns(Task.FromResult <IEnumerable <ProductInCountry> >(new List <ProductInCountry> { new ProductInCountry { Id = productKey2, CountryId = countryId } })); ProductEventSender1.Setup(x => x.SendEvents(It.IsAny <IEnumerable <IEvent> >())); ProductEventSender1.Setup(x => x.CanSend(It.IsAny <IEvent>())).Returns(true); var senders = new List <IProductEventSender> { ProductEventSender1.Object }; var consumers = new List <ProductCreateConsumer> { new ProductCreateConsumer(ProductService.Object) }; var service = new MessagesProcessor <ProductCreateConsumer, IProductEventSender>(consumers, senders); service.ProcessEventsAsync(new PartitionContext(), new List <EventData> { eventData1, eventData2 }).ConfigureAwait(true); ProductService.Verify(x => x.GetProductInCountries(It.IsAny <Guid>(), It.IsAny <Guid?>(), It.IsAny <string>()), Times.AtLeast(2)); ProductEventSender1.Verify(x => x.SendEvents(It.IsAny <IEnumerable <IEvent> >()), Times.Once); }
public void Init() { var participantsService = new ParticipantsService( new InMemoryGameMapper(), new InMemoryParticipantMapper()); var chatsService = new ChatsService( new InMemoryChatMapper(), new InMemoryUserMapper() ); target = new MessagesProcessor(participantsService, chatsService); }
//Processes SMSs private void ProcessSMS() { //Processes Textspeak abbreviations and saves to ProcessedMessages.json var MessageHeaderText = MessageHeaderTextBox.ToString(); var MessageBodyText = MessageBodyTextBox.ToString(); MessageBodyText = GetAbbreviations(MessageBodyText); MessagesProcessor msgProcessor = new MessagesProcessor() { msgType = MessageHeaderText, msgBody = MessageBodyText }; File.AppendAllText("C:/VS Database/ProcessedMessages.json", JsonConvert.SerializeObject(msgProcessor)); MessageBox.Show("Message Processed Successfully:" + Environment.NewLine + "Message Type - " + MessageHeaderText + Environment.NewLine + "Message Body - " + MessageBodyText); }
//Processes Emails private void ProcessStandardEmail() { //Validates URL's and replaces them with <URL Quarantined> and saves to Quarantine.csv var MessageHeaderText = MessageHeaderTextBox.ToString(); var MessageBodyText = MessageBodyTextBox.ToString(); string[] splitMessageBodyText = MessageBodyTextBox.ToString().Split(' '); for (int i = 4; i < splitMessageBodyText.Length; i++) { Uri result; bool isUri = Uri.TryCreate(splitMessageBodyText[i], UriKind.Absolute, out result) && (result.Scheme == Uri.UriSchemeHttp || result.Scheme == Uri.UriSchemeHttps); if (isUri == true) { Quarantine quarantine = new Quarantine() { link = splitMessageBodyText[i] }; Database.Quarantine_Database.SaveToQuarantine save1 = new Database.Quarantine_Database.SaveToQuarantine(); if (!save1.ToCsv(quarantine)) { MessageBox.Show("Error while saving\n" + save1.ErrorCode); } else { save1 = null; } MessageBodyText = MessageBodyText.Replace(splitMessageBodyText[i], "<URL Quarantined>"); } } MessagesProcessor msgProcessor = new MessagesProcessor() { msgType = MessageHeaderText, msgBody = MessageBodyText }; File.AppendAllText("C:/VS Database/ProcessedMessages.json", JsonConvert.SerializeObject(msgProcessor)); MessageBox.Show("Message Processed Successfully:" + Environment.NewLine + "Message Type - " + MessageHeaderText + Environment.NewLine + "Message Body - " + MessageBodyText); }
public void MessagesProcessor_NoEventTypeProperty_Ignore() { ResetCalls(); var saleId = new Guid("3832896B-3CF1-4B78-BAF8-22DBEA26B633"); var itemId = new Guid("D0E8C5CB-E787-4B83-97FC-67C5A9AF6880"); var countryId = "AS"; var encoding = new UTF8Encoding(); var message = new Message { ItemId = itemId, EventAction = "Create" }; var eventData = new EventData(encoding.GetBytes(JsonConvert.SerializeObject(message).ToLower())); var productEvent = new ProductEvent { CountryId = countryId }; ProductEventConsumer.Setup(x => x.Consume(message)).Returns(Task.FromResult <IEnumerable <IEvent> >(new List <ProductEvent> { productEvent })); ProductEventSender1.Setup(x => x.SendEvent(It.IsAny <IEvent>())); ProductEventSender1.Setup(x => x.SendEvents(It.IsAny <IEnumerable <IEvent> >())); var senders = new List <IProductEventSender> { ProductEventSender1.Object }; var consumers = new List <ProductCreateConsumer> { new ProductCreateConsumer(ProductService.Object) }; var service = new MessagesProcessor <ProductCreateConsumer, IProductEventSender>(consumers, senders); var items = service.ProcessEventsAsync(new PartitionContext(), new List <EventData> { eventData }); ProductEventConsumer.Verify(x => x.Consume(message), Times.Never); ProductEventSender1.Verify(x => x.SendEvent(It.IsAny <IEvent>()), Times.Never); ProductEventSender1.Verify(x => x.SendEvents(It.IsAny <IEnumerable <IEvent> >()), Times.Never); }
//Processes Tweets private void ProcessTweet() { //Processes textspeak abbreviations and saves to ProcessedMessages.json Database.Textspeak_Abbreviations_Database.LoadTextspeakAbbreviations load = new Database.Textspeak_Abbreviations_Database.LoadTextspeakAbbreviations(); var MessageHeaderText = MessageHeaderTextBox.ToString(); var MessageBodyText = MessageBodyTextBox.ToString(); string[] splitMessageBodyText = MessageBodyTextBox.ToString().Split(' '); MessageBodyText = GetAbbreviations(MessageBodyText); MessagesProcessor msgProcessor = new MessagesProcessor() { msgType = MessageHeaderText, msgBody = MessageBodyText }; File.AppendAllText("C:/VS Database/ProcessedMessages.json", JsonConvert.SerializeObject(msgProcessor)); MessageBox.Show("Message Processed Successfully:" + Environment.NewLine + "Message Type - " + MessageHeaderText + Environment.NewLine + "Message Body - " + MessageBodyText); //Processes Mentions and saves to Mentions.csv Database.Mentions_Database.LoadMentionsFromFile load2 = new Database.Mentions_Database.LoadMentionsFromFile(); Database.Mentions_Database.SaveMentionsToFile save2 = new Database.Mentions_Database.SaveMentionsToFile(); if (!load2.FromCSV()) { MentionsList = new ObservableCollection <Mentions>(); } else { MentionsList = new ObservableCollection <Mentions>(load2.MentionsList); var NofMentions = 0; for (int i = 2; i < splitMessageBodyText.Length; i++) { var @char = splitMessageBodyText[i]; if (@char[0] == '@') { foreach (var Mentions in MentionsList) { if (Mentions.Users == splitMessageBodyText[i]) { NofMentions = Mentions.NofUsers + 1; } else { NofMentions = 1; } } Mentions mentions = new Mentions() { Users = splitMessageBodyText[i], NofUsers = NofMentions }; if (!save2.ToCsv(mentions)) { MessageBox.Show("Error while saving to mentions\n" + save2.ErrorCode); } else { save2 = null; } } } } //Processes Trending hashtags and adds it to Trending.csv Database.Trending_Database.LoadTrendingFromFile load3 = new Database.Trending_Database.LoadTrendingFromFile(); Database.Trending_Database.SaveTrendingToFile save3 = new Database.Trending_Database.SaveTrendingToFile(); if (!load3.FromCSV()) { TrendingList = new ObservableCollection <Trending>(); } else { TrendingList = new ObservableCollection <Trending>(load3.TrendingList); var NofTrending = 0; for (int i = 2; i < splitMessageBodyText.Length; i++) { var @char = splitMessageBodyText[i]; if (@char[0] == '#') { foreach (var Trending in TrendingList) { if (Trending.Hashtags == splitMessageBodyText[i]) { NofTrending = Trending.NofHashtags + 1; } else { NofTrending = 1; } } Trending trending = new Trending() { Hashtags = splitMessageBodyText[i], NofHashtags = NofTrending }; if (!save3.ToCsv(trending)) { MessageBox.Show("Error while saving to Trending\n" + save3.ErrorCode); } else { save2 = null; } } } } }
private void ProcessSIREmail() { //Validates URL's and replaces them with <URL Quarantined> and saves to Quarantine.csv var MessageHeaderText = MessageHeaderTextBox.ToString(); var MessageBodyText = MessageBodyTextBox.ToString(); string[] splitMessageBodyText = MessageBodyTextBox.ToString().Split(' '); for (int i = 4; i < splitMessageBodyText.Length; i++) { Uri result; bool isUri = Uri.TryCreate(splitMessageBodyText[i], UriKind.Absolute, out result) && (result.Scheme == Uri.UriSchemeHttp || result.Scheme == Uri.UriSchemeHttps); if (isUri == true) { Quarantine quarantine = new Quarantine() { link = splitMessageBodyText[i] }; Database.Quarantine_Database.SaveToQuarantine save1 = new Database.Quarantine_Database.SaveToQuarantine(); if (!save1.ToCsv(quarantine)) { MessageBox.Show("Error while saving\n" + save1.ErrorCode); } else { save1 = null; } MessageBodyText = MessageBodyText.Replace(splitMessageBodyText[i], "<URL Quarantined>"); } } MessagesProcessor msgProcessor = new MessagesProcessor() { msgType = MessageHeaderText, msgBody = MessageBodyText }; File.AppendAllText("C:/VS Database/ProcessedMessages.json", JsonConvert.SerializeObject(msgProcessor)); MessageBox.Show("Message Processed Successfully:" + Environment.NewLine + "Message Type - " + MessageHeaderText + Environment.NewLine + "Message Body - " + MessageBodyText); //Saves SI to SIReportsDB.csv Database.SIReports_Database.SaveSIReportsToFile save4 = new Database.SIReports_Database.SaveSIReportsToFile(); string[] NOIArray1w = { "Raid", "Terrorism" }; var noi1w = splitMessageBodyText[12]; var noifound1w = Array.Exists(NOIArray1w, s => s.Equals(noi1w)); string[] NOIArray2w = { "Staff Attack", "Device Damage", "Customer Attack", "Staff Abuse", "Bomb Threat", "Suspicious Incident", "Sport Injury" }; var noi2w = splitMessageBodyText[12] + " " + splitMessageBodyText[13]; var noifound2w = Array.Exists(NOIArray2w, s => s.Equals(noi2w)); string[] NOIArray3w = { "Theft of Properties", "Personal Info Leak" }; var noi3w = splitMessageBodyText[12] + " " + splitMessageBodyText[13] + " " + splitMessageBodyText[14]; var noifound3w = Array.Exists(NOIArray3w, s => s.Equals(noi3w)); if (noifound1w == true) { SIReports siReports = new SIReports() { SportCentreCode = splitMessageBodyText[8], NatureOfIncident = splitMessageBodyText[12] }; if (!save4.ToCsv(siReports)) { MessageBox.Show("Error while saving\n" + save4.ErrorCode); } else { save4 = null; } } if (noifound2w == true) { SIReports siReports = new SIReports() { SportCentreCode = splitMessageBodyText[8], NatureOfIncident = splitMessageBodyText[12] + " " + splitMessageBodyText[13] }; if (!save4.ToCsv(siReports)) { MessageBox.Show("Error while saving\n" + save4.ErrorCode); } else { save4 = null; } } if (noifound3w == true) { SIReports siReports = new SIReports() { SportCentreCode = splitMessageBodyText[8], NatureOfIncident = splitMessageBodyText[12] + " " + splitMessageBodyText[13] + " " + splitMessageBodyText[14] }; if (!save4.ToCsv(siReports)) { MessageBox.Show("Error while saving\n" + save4.ErrorCode); } else { save4 = null; } } }
public void Init() { _target = new MessagesProcessor(new FictiveStorage <List <Event> >()); }
public void MessagesProcessor_ItemMessageWithDifferentItemId_ProcessedBothMessage() { ResetCalls(); var saleId1 = new Guid("3832896B-3CF1-4B78-BAF8-22DBEA26B633"); var saleId2 = new Guid("B590900F-EF71-45BD-89E4-BF80D17DC397"); var itemId1 = new Guid("D0E8C5CB-E787-4B83-97FC-67C5A9AF6880"); var itemId2 = new Guid("A960D459-F52A-4BE0-9651-AFECC7CCF3DA"); var countryId = "AS"; var productKey1 = $"{itemId1}_{saleId1}_{countryId}"; var productKey2 = $"{itemId2}_{saleId2}_{countryId}"; var encoding = new UTF8Encoding(); var adminEventId1 = Guid.NewGuid(); var adminEventId2 = Guid.NewGuid(); var message1 = new Message { ItemId = itemId1, SaleId = saleId1, EventAction = "Change", IntegrationMessageId = adminEventId1 }; var eventData1 = new EventData(encoding.GetBytes(JsonConvert.SerializeObject(message1).ToLower())); eventData1.Properties.Add("Type", message1.EventAction); var message2 = new Message { ItemId = itemId2, EventAction = "Change", IntegrationMessageId = adminEventId2 }; var eventData2 = new EventData(encoding.GetBytes(JsonConvert.SerializeObject(message2).ToLower())); eventData2.Properties.Add("Type", message2.EventAction); var sender1Events = new List <IEvent>(); ProductService.Setup(x => x.GetProductInCountries(itemId1, It.IsAny <Guid?>(), It.IsAny <string>())) .Returns(Task.FromResult <IEnumerable <ProductInCountry> >(new List <ProductInCountry> { new ProductInCountry { Id = productKey1, CountryId = countryId } })); ProductService.Setup(x => x.GetProductInCountries(itemId2, It.IsAny <Guid?>(), It.IsAny <string>())) .Returns(Task.FromResult <IEnumerable <ProductInCountry> >(new List <ProductInCountry> { new ProductInCountry { Id = productKey2, CountryId = countryId } })); ProductEventSender1.Setup(x => x.SendEvents(It.IsAny <IEnumerable <IEvent> >())) .Callback((IEnumerable <IEvent> productEvents) => { sender1Events.AddRange(productEvents); }); ProductEventSender1.Setup(x => x.CanSend(It.IsAny <IEvent>())).Returns(true); var senders = new List <IProductEventSender> { ProductEventSender1.Object, ProductEventSender2.Object }; var consumers = new List <ProductChangeConsumer> { new ProductChangeConsumer(ProductService.Object) }; var service = new MessagesProcessor <ProductChangeConsumer, IProductEventSender>(consumers, senders); service.ProcessEventsAsync(new PartitionContext(), new List <EventData> { eventData1, eventData2 }).ConfigureAwait(true); Assert.AreEqual(sender1Events.Count, 2); Assert.IsTrue(sender1Events.Any(t => t.Id == productKey1)); Assert.IsTrue(sender1Events.Any(t => t.Id == productKey2)); Assert.IsTrue(sender1Events.Any(t => t.AdminEventIds.Contains(adminEventId1))); Assert.IsTrue(sender1Events.Any(t => t.AdminEventIds.Contains(adminEventId2))); ProductService.Verify(x => x.GetProductInCountries(It.IsAny <Guid>(), It.IsAny <Guid?>(), It.IsAny <string>()), Times.Exactly(2)); ProductEventSender1.Verify(x => x.SendEvents(It.IsAny <IEnumerable <IEvent> >()), Times.Exactly(1)); }
public void MessagesProcessor_ProductsInThreeCountriesSenderOnlyTwoCountries_ProcessedTwoMessageSendOneBatch() { ResetCalls(); var saleId1 = new Guid("3832896B-3CF1-4B78-BAF8-22DBEA26B633"); var itemId1 = new Guid("D0E8C5CB-E787-4B83-97FC-67C5A9AF6880"); var countryId1 = "AS"; var countryId2 = "TA"; var countryId3 = "OO"; var productKey1 = $"{itemId1}_{saleId1}_{countryId1}"; var productKey2 = $"{itemId1}_{saleId1}_{countryId2}"; var productKey3 = $"{itemId1}_{saleId1}_{countryId3}"; var encoding = new UTF8Encoding(); var message1 = new Message { ItemId = itemId1, EventAction = "Create", IntegrationMessageId = Guid.NewGuid() }; var eventData1 = new EventData(encoding.GetBytes(JsonConvert.SerializeObject(message1).ToLower())); eventData1.Properties.Add("Type", message1.EventAction); var senderEvents = new List <IEvent>(); ProductService.Setup(x => x.GetProductInCountries(itemId1, null, null)) .Returns(Task.FromResult <IEnumerable <ProductInCountry> >(new List <ProductInCountry> { new ProductInCountry { Id = productKey1, CountryId = countryId1 }, new ProductInCountry { Id = productKey2, CountryId = countryId2 }, new ProductInCountry { Id = productKey3, CountryId = countryId3 } })); ProductEventSender1.Setup(x => x.SendEvents(It.IsAny <IEnumerable <IEvent> >())) .Callback((IEnumerable <IEvent> productEvents) => { senderEvents.AddRange(productEvents); }); ProductEventSender1.Setup(x => x.CanSend(It.IsAny <IEvent>())).Returns <IEvent>((IEvent evt) => (evt.CountryId == countryId1 || evt.CountryId == countryId3) ? true : false); var senders = new List <IProductEventSender> { ProductEventSender1.Object, ProductEventSender2.Object }; var consumers = new List <ProductCreateConsumer> { new ProductCreateConsumer(ProductService.Object) }; var service = new MessagesProcessor <ProductCreateConsumer, IProductEventSender>(consumers, senders); service.ProcessEventsAsync(new PartitionContext(), new List <EventData> { eventData1 }).ConfigureAwait(true); Assert.AreEqual(senderEvents.Count, 2); Assert.IsTrue(senderEvents.Any(t => t.Id == productKey1)); Assert.IsTrue(senderEvents.Any(t => t.Id == productKey3)); Assert.IsTrue(senderEvents.FirstOrDefault().EventType == EventType.Product); ProductService.Verify(x => x.GetProductInCountries(It.IsAny <Guid>(), It.IsAny <Guid?>(), It.IsAny <string>()), Times.Once); ProductEventSender1.Verify(x => x.SendEvents(It.IsAny <IEnumerable <IEvent> >()), Times.Once); ProductEventSender1.Verify(x => x.SendEvent(It.IsAny <IEvent>()), Times.Never); }
public void MessagesProcessor_TwoSendersOnlyOneCanSend_ProcessedAllToBothSenders() { ResetCalls(); var saleId1 = new Guid("3832896B-3CF1-4B78-BAF8-22DBEA26B633"); var itemId1 = new Guid("D0E8C5CB-E787-4B83-97FC-67C5A9AF6880"); var saleId2 = new Guid("4832896B-3CF1-4B78-BAF8-22DBEA26B633"); var itemId2 = new Guid("50E8C5CB-E787-4B83-97FC-67C5A9AF6880"); var countryId = "AS"; var productKey1 = $"{itemId1}_{saleId1}_{countryId}"; var productKey2 = $"{itemId2}_{saleId2}_{countryId}"; var encoding = new UTF8Encoding(); var message1 = new Message { ItemId = itemId1, EventAction = "Create", IntegrationMessageId = Guid.NewGuid() }; var eventData1 = new EventData(encoding.GetBytes(JsonConvert.SerializeObject(message1).ToLower())); eventData1.Properties.Add("Type", message1.EventAction); var message2 = new Message { ItemId = itemId2, EventAction = "Create", IntegrationMessageId = Guid.NewGuid() }; var eventData2 = new EventData(encoding.GetBytes(JsonConvert.SerializeObject(message2).ToLower())); eventData2.Properties.Add("Type", message2.EventAction); var sender1Events = new List <IEvent>(); var sender2Events = new List <IEvent>(); ProductService.Setup(x => x.GetProductInCountries(itemId1, null, null)) .Returns(Task.FromResult <IEnumerable <ProductInCountry> >(new List <ProductInCountry> { new ProductInCountry { Id = productKey1, CountryId = countryId } })); ProductService.Setup(x => x.GetProductInCountries(itemId2, null, null)) .Returns(Task.FromResult <IEnumerable <ProductInCountry> >(new List <ProductInCountry> { new ProductInCountry { Id = productKey2, CountryId = countryId } })); ProductEventSender1.Setup(x => x.SendEvents(It.IsAny <IEnumerable <IEvent> >())) .Callback((IEnumerable <IEvent> productEvents) => { sender1Events.AddRange(productEvents); }); ProductEventSender1.Setup(x => x.CanSend(It.IsAny <IEvent>())).Returns(false); ProductEventSender2.Setup(x => x.SendEvents(It.IsAny <IEnumerable <IEvent> >())) .Callback((IEnumerable <IEvent> productEvents) => { sender2Events.AddRange(productEvents); }); ProductEventSender2.Setup(x => x.CanSend(It.IsAny <IEvent>())).Returns(true); var senders = new List <IProductEventSender> { ProductEventSender1.Object, ProductEventSender2.Object }; var consumers = new List <ProductCreateConsumer> { new ProductCreateConsumer(ProductService.Object) }; var service = new MessagesProcessor <ProductCreateConsumer, IProductEventSender>(consumers, senders); service.ProcessEventsAsync(new PartitionContext(), new List <EventData> { eventData1, eventData2 }).ConfigureAwait(true); Assert.AreEqual(sender1Events.Count, 0); Assert.AreEqual(sender2Events.Count, 2); Assert.IsTrue(sender2Events.Any(t => t.Id == productKey1)); Assert.IsTrue(sender2Events.Any(t => t.Id == productKey2)); ProductService.Verify(x => x.GetProductInCountries(It.IsAny <Guid>(), It.IsAny <Guid?>(), It.IsAny <string>()), Times.Exactly(2)); ProductEventSender1.Verify(x => x.SendEvents(It.IsAny <IEnumerable <IEvent> >()), Times.Never); ProductEventSender1.Verify(x => x.SendEvent(It.IsAny <IEvent>()), Times.Never); ProductEventSender2.Verify(x => x.SendEvents(It.IsAny <IEnumerable <IEvent> >()), Times.Once); ProductEventSender2.Verify(x => x.SendEvent(It.IsAny <IEvent>()), Times.Never); }