public void ShouldMapFromFirmStatisticsDto()
        {
            var dto = new FirmStatisticsDto
            {
                ProjectId = 1,
                Firms     = new[]
                {
                    new FirmStatisticsDto.FirmDto
                    {
                        FirmId     = 2,
                        Categories = new[]
                        {
                            new FirmStatisticsDto.FirmDto.CategoryDto
                            {
                                CategoryId = 3,
                                Hits       = 4,
                                Shows      = 5
                            }
                        }
                    }
                }
            };

            var entities = Specs.Map.Bit.FirmCategoryStatistics().Map(dto);

            Assert.That(entities.Count(), Is.EqualTo(1));
            Assert.That(entities.Single().ProjectId, Is.EqualTo(1));
            Assert.That(entities.Single().CategoryId, Is.EqualTo(3));
            Assert.That(entities.Single().FirmId, Is.EqualTo(2));
            Assert.That(entities.Single().Hits, Is.EqualTo(4));
            Assert.That(entities.Single().Shows, Is.EqualTo(5));
        }
        public void ShouldProduceCalculateStatisticsOperationForFirmStatisticsDto()
        {
            // Arrange
            var repositoryFactory = new VerifiableRepositoryFactory();
            var dto = new FirmStatisticsDto
            {
                ProjectId = 1,
                Firms     = new[]
                {
                    new FirmStatisticsDto.FirmDto
                    {
                        FirmId     = 2,
                        Categories = new[]
                        {
                            new FirmStatisticsDto.FirmDto.CategoryDto
                            {
                                CategoryId = 3,
                                Hits       = 4,
                                Shows      = 5
                            }
                        }
                    }
                }
            };

            SourceDb.Has(new Bit::FirmCategoryStatistics {
                ProjectId = 1, FirmId = 7
            },
                         new Bit::FirmCategoryStatistics {
                ProjectId = 2, FirmId = 8
            });

            var importer = CreateProcessor <FirmStatisticsDto, Bit::FirmCategoryStatistics>(repositoryFactory);

            // Act
            var operations = importer.Import(dto).ToArray();

            // Assert
            Assert.That(operations.Count(), Is.EqualTo(1));
            repositoryFactory.Verify <Bit::FirmCategoryStatistics>(
                m => m.Delete(It.Is(Predicate.Match(new Bit::FirmCategoryStatistics {
                ProjectId = 1, FirmId = 7
            }))),
                Times.AtLeastOnce);
            repositoryFactory.Verify <Bit::FirmCategoryStatistics>(
                m => m.Add(It.Is(Predicate.Match(new Bit::FirmCategoryStatistics {
                ProjectId = 1, FirmId = 2, CategoryId = 3, Hits = 4, Shows = 5
            }))),
                Times.AtLeastOnce);
        }
        private bool TryParseFirmPopularity(XElement xml, out IDataTransferObject dto)
        {
            try
            {
                dto = new FirmStatisticsDto
                {
                    ProjectId = (long)xml.Attribute("BranchCode"),
                    Firms     = xml.Descendants("Firm").Select(x =>
                    {
                        var firmDto = new FirmStatisticsDto.FirmDto
                        {
                            FirmId     = (long)x.Attribute("Code"),
                            Categories = x.Descendants("Rubric").Select(y =>
                            {
                                var clickCountAttr      = y.Attribute("ClickCount");
                                var impressionCountAttr = y.Attribute("ImpressionCount");
                                if (clickCountAttr == null || impressionCountAttr == null)
                                {
                                    throw new ArgumentException();
                                }

                                var rubricDto = new FirmStatisticsDto.FirmDto.CategoryDto
                                {
                                    CategoryId = (long)y.Attribute("Code"),
                                    Hits       = (int)clickCountAttr,
                                    Shows      = (int)impressionCountAttr,
                                };

                                return(rubricDto);
                            }).ToArray()
                        };

                        return(firmDto);
                    }).ToArray(),
                };

                return(true);
            }
            catch (ArgumentException)
            {
                _tracer.Warn("Skip FirmPopularity message due to unsupported format");
                dto = null;
                return(false);
            }
        }
        public void ShouldProduceCalculateStatisticsOperationForFirmStatisticsDto()
        {
            // Arrange
            var repositoryFactory = new VerifiableRepositoryFactory();
            var dto = new FirmStatisticsDto
            {
                ProjectId = 1,
                Firms     = new[]
                {
                    new FirmStatisticsDto.FirmDto
                    {
                        FirmId     = 2,
                        Categories = new[]
                        {
                            new FirmStatisticsDto.FirmDto.CategoryDto
                            {
                                CategoryId = 3,
                                Hits       = 4,
                                Shows      = 5
                            }
                        }
                    }
                }
            };

            SourceDb.Has(new Bit::FirmCategoryStatistics {
                ProjectId = 1, FirmId = 7
            },
                         new Bit::FirmCategoryStatistics {
                ProjectId = 2, FirmId = 8
            });

            var metadataSource = new ImportStatisticsMetadataSource();
            IMetadataElement importStatisticsMetadata;

            if (!metadataSource.Metadata.Values.TryGetElementById(new Uri(typeof(FirmStatisticsDto).Name, UriKind.Relative), out importStatisticsMetadata))
            {
                throw new NotSupportedException($"The aggregate of type '{typeof(FirmStatisticsDto).Name}' is not supported.");
            }

            var importer = new StatisticsFactImporter <Bit::FirmCategoryStatistics, FirmStatisticsDto>(
                (ImportStatisticsMetadata <Bit::FirmCategoryStatistics, FirmStatisticsDto>)importStatisticsMetadata,
                Query,
                repositoryFactory.Create <Bit::FirmCategoryStatistics>());

            // Act
            var operations = importer.Import(dto).ToArray();

            // Assert
            Assert.That(operations.Count(), Is.EqualTo(1));
            repositoryFactory.Verify <Bit::FirmCategoryStatistics>(
                m => m.Delete(It.Is(Predicate.Match(new Bit::FirmCategoryStatistics {
                ProjectId = 1, FirmId = 7
            }))),
                Times.AtLeastOnce);
            repositoryFactory.Verify <Bit::FirmCategoryStatistics>(
                m => m.Add(It.Is(Predicate.Match(new Bit::FirmCategoryStatistics {
                ProjectId = 1, FirmId = 2, CategoryId = 3, Hits = 4, Shows = 5
            }))),
                Times.AtLeastOnce);
        }