public async Task Given_An_Article_If_Not_Published_To_Queue_IsSuccessful_Should_Be_False() { // Arrange var article = new Article(); _wikiArticle.Details(Arg.Any <int>()).Returns(new ExpandedArticleResultSet { Items = new Dictionary <string, ExpandedArticle> { ["key"] = new ExpandedArticle { Id = 24324, Abstract = "OCG in effect since September 1, 2007." } } }); _wikiArticle.Simple(Arg.Any <long>()).Returns(new ContentResult { Sections = new Section[0] }); _banlistDataQueue.Publish(Arg.Any <ArticleProcessed>()).Returns(new YugiohBanlistCompletion()); // Act var result = await _sut.Process(article); // Assert result.IsSuccessful.Should().BeFalse(); }
public async Task Given_An_Article_Should_Invoke_Process_Once() { // Arrange var article = new Article { Id = 3242423, CorrelationId = Guid.NewGuid() }; _banlistProcessor.Process(Arg.Any <Article>()).Returns(new ArticleProcessed() { Article = article, IsSuccessful = true }); _banlistDataQueue.Publish(Arg.Any <ArticleProcessed>()).Returns(new YugiohBanlistCompletion { Article = article, IsSuccessful = true }); // Act await _sut.ProcessDataFlow(article); // Assert await _banlistProcessor.Received(1).Process(Arg.Any <Article>()); }
public ArticleDataFlow(IBanlistProcessor banlistProcessor, IBanlistDataQueue banlistDataQueue) { _jobs = new ConcurrentDictionary <Guid, TaskCompletionSource <ArticleCompletion> >(); // Data flow options var maxDegreeOfParallelism = Environment.ProcessorCount; var nonGreedy = new ExecutionDataflowBlockOptions { BoundedCapacity = maxDegreeOfParallelism, MaxDegreeOfParallelism = maxDegreeOfParallelism }; // Pipeline members _articleBufferBlock = new BufferBlock <Article>(); var banlistProcessorTransformBlock = new TransformBlock <Article, ArticleProcessed>(article => banlistProcessor.Process(article), nonGreedy); var publishBanlistTransformBlock = new TransformBlock <ArticleProcessed, YugiohBanlistCompletion>(articleProcessed => banlistDataQueue.Publish(articleProcessed), nonGreedy); var publishToQueueActionBlock = new ActionBlock <YugiohBanlistCompletion>(yugiohCardCompletion => FinishedProcessing(yugiohCardCompletion)); // Form the pipeline _articleBufferBlock.LinkTo(banlistProcessorTransformBlock); banlistProcessorTransformBlock.LinkTo(publishBanlistTransformBlock); publishBanlistTransformBlock.LinkTo(publishToQueueActionBlock); }
public async Task <ArticleProcessed> Process(Article article) { var response = new ArticleProcessed { Article = article }; var articleDetailsList = await _wikiArticle.Details((int)article.Id); var(_, expandedArticle) = articleDetailsList.Items.First(); var banlistArticleSummary = BanlistHelpers.ExtractBanlistArticleDetails(expandedArticle.Id, expandedArticle.Abstract); if (banlistArticleSummary != null) { const char beginChar = '「'; const char endChar = '」'; var banlist = new YugiohBanlist { ArticleId = banlistArticleSummary.ArticleId, Title = expandedArticle.Title, BanlistType = banlistArticleSummary.BanlistType, StartDate = banlistArticleSummary.StartDate }; var banlistContentResult = await _wikiArticle.Simple(banlistArticleSummary.ArticleId); _logger.LogInformation($"{banlist.BanlistType.ToString()}, {banlist.Title}, {banlist.StartDate}"); foreach (var section in banlistContentResult.Sections) { // skip references section if (section.Title.ToLower() == "references") { continue; } // new section var ybls = new YugiohBanlistSection { Title = StringHelpers.RemoveBetween(section.Title, beginChar, endChar).Trim(), Content = ContentResultHelpers.GetSectionContentList(section).OrderBy(c => c).ToList() }; // remove invalid characters if (ybls.Content.Any()) { ybls.Content = ybls.Content.Select(c => StringHelpers.RemoveBetween(c, beginChar, endChar)).ToList(); } banlist.Sections.Add(ybls); } response.Banlist = banlist; var publishBanlistResult = await _banlistDataQueue.Publish(new ArticleProcessed { Article = article, Banlist = banlist }); response.IsSuccessful = publishBanlistResult.IsSuccessful; } return(response); }