public async Task <SubscriptionViewModel> AskAsync(SubscriptionViewModelCriterion criterion)
        {
            var allProductsCriterion = new AllProductsCriterion();
            var products             = await _queryBuilder.For <List <Product> >().WithAsync(allProductsCriterion);

            var productsSumInSubscriptionCriterion = new CalculateProductsSumInSubscriptionCriterion();
            var sum = await _queryBuilder.For <double>().WithAsync(productsSumInSubscriptionCriterion);

            var deliveryIntervalForSubscriptionCriterion = new DeliveryIntervalWithTemplateForSubscriptionCriterion();
            var deliveryInterval = await _queryBuilder.For <DeliveryInterval>().WithAsync(deliveryIntervalForSubscriptionCriterion);

            var subscriptionDatesCriterion = new SubscriptionDatesForSubscriptionCriterion();
            var subscriptionDates          = await _queryBuilder.For <List <SubscriptionDate> >().WithAsync(subscriptionDatesCriterion);

            var calculateSpentAmountCriterion = new CalculateSpentAmountCriterion(criterion.PointedTodayDate, sum);
            var spentAmount = await _queryBuilder.For <double>().WithAsync(calculateSpentAmountCriterion);

            var deliveryDatesCriterion = new DeliveryDatesCriterion(criterion.PointedTodayDate, criterion.PointedTodayDate.AddMonths(3));
            var deliveryDates          = await _queryBuilder.For <List <DateTime> >().WithAsync(deliveryDatesCriterion);

            var viewModel = new SubscriptionViewModel
            {
                Today             = criterion.PointedTodayDate,
                Products          = products,
                DeliveryInterval  = deliveryInterval,
                SubscriptionDates = subscriptionDates,
                ProductsPricesSum = sum,
                SpentAmount       = spentAmount,
                DeliveryDates     = deliveryDates
            };

            return(viewModel);
        }
        public async Task ShouldReturn0_WhenProductsInSubcriptionNoExists()
        {
            SetupMocks(_subscription);
            var criterion = new CalculateProductsSumInSubscriptionCriterion();
            var query     = new CalculateProductsSumInSubscriptionQuery(_queryBuilderMock.Object);


            var queryResult = await query.AskAsync(criterion);


            Assert.AreEqual(queryResult, 0);
        }
        public async Task ShouldCalculateTotalPrice_WhenProductsInSubcriptionExists(int productsCount)
        {
            var random = new Randomizer();

            for (int i = 0; i < productsCount; i++)
            {
                _subscription.Products.Add(new Product()
                {
                    Price = random.NextDouble()
                });
            }
            SetupMocks(_subscription);
            var criterion = new CalculateProductsSumInSubscriptionCriterion();
            var query     = new CalculateProductsSumInSubscriptionQuery(_queryBuilderMock.Object);


            var queryResult = await query.AskAsync(criterion);


            Assert.AreEqual(queryResult, _subscription.Products.Sum(x => x.Price));
        }