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);
        }
예제 #3
0
        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;
                }
            }
        }
예제 #9
0
 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);
        }