public GroupedDomoData Group(List <Dictionary <string, string> > data, Report report, GenerationSettings settings) { var groupedData = new Dictionary <string, List <Dictionary <string, string> > >(); if (!string.IsNullOrEmpty(settings.MasterGroup)) { foreach (var row in data) { if (!groupedData.ContainsKey(row[settings.MasterGroup])) { groupedData[row[settings.MasterGroup]] = new List <Dictionary <string, string> >(); } groupedData[row[settings.MasterGroup]].Add(row); } } else { groupedData["default"] = data; } var contentData = new GroupedDomoData(); foreach (var group in groupedData) { var groupedContentData = new ChildGroupedDomoData(); foreach (var row in group.Value) { var hash = string.Join("-", settings.ChildGroups.Select(childGroup => row[childGroup])) .GetHashCode() .ToString(); if (!groupedContentData.ContainsKey(hash)) { groupedContentData[hash] = Tuple.Create(report.HeaderColumns.ToDictionary( column => column, column => row[column]), new List <Dictionary <string, string> >()); } groupedContentData[hash].Item2.Add(report.ContentColumns.ToDictionary( column => column, column => row[column])); } contentData[group.Key] = groupedContentData; } return(contentData); }
public async Task ReportController_SampleAsync_CallsServicesAsync() { var reportGenerationService = new Mock <IReportGenerationService>(); var mongoReportRepository = new Mock <IMongoReportRepository>(); var domoService = new Mock <IDomoService>(); reportGenerationService.Setup(m => m.ConvertToData(It.IsAny <Dictionary <string, Tuple < Dictionary <string, string>, List <Dictionary <string, string> > > > >())) .Returns(new Newtonsoft.Json.Linq.JArray()); mongoReportRepository.Setup(m => m.GetAsync(It.IsAny <string>())) .ReturnsAsync((string slug) => new Report() { TemplateName = "invoice.docx", DataSet = "invoice_data", Slug = slug }); var data = new GroupedDomoData(); data.Add("default", new ChildGroupedDomoData()); domoService.Setup(m => m.GetDataAsync(It.IsAny <Report>(), It.IsAny <GenerationSettings>())) .ReturnsAsync(data); var controller = new ReportController(mongoReportRepository.Object, reportGenerationService.Object, domoService.Object); var result = await controller.SampleAsync("voya-invoices", new GenerationSettings() { MasterGroup = "master-group" }); mongoReportRepository.Verify(m => m.GetAsync(It.Is <string>(s => s == "voya-invoices"))); reportGenerationService.Verify(m => m.ConvertToData(It.IsAny <Dictionary <string, Tuple < Dictionary <string, string>, List <Dictionary <string, string> > > > >())); domoService.Verify(m => m.GetDataAsync(It.Is <Report>(r => r.Slug == "voya-invoices"), It.IsAny <GenerationSettings>())); }