public async Task <Guid> Handle(BuySubscriptionRenewalCommand command, CancellationToken cancellationToken)
        {
            var priceList = await PriceListProvider.GetPriceList(_sqlConnectionFactory.GetOpenConnection());

            var subscriptionId = new SubscriptionId(command.SubscriptionId);

            var subscription = await _aggregateStore.Load(new SubscriptionId(command.SubscriptionId));

            if (subscription == null)
            {
                throw new InvalidCommandException(new List <string> {
                    "Subscription for renewal must exist."
                });
            }

            var subscriptionRenewalPayment = SubscriptionRenewalPayment.Buy(
                _payerContext.PayerId,
                subscriptionId,
                SubscriptionPeriod.Of(command.SubscriptionTypeCode),
                command.CountryCode,
                MoneyValue.Of(command.Value, command.Currency),
                priceList);

            _aggregateStore.AppendChanges(subscriptionRenewalPayment);

            return(subscriptionRenewalPayment.Id);
        }
        public void BuySubscriptionRenewal_WhenPriceDoesNotExist_IsNotPossible()
        {
            // Arrange
            var subscriptionRenewalPaymentTestData = CreateSubscriptionRenewalPaymentTestData();

            // Act & Assert
            AssertBrokenRule <PriceOfferMustMatchPriceInPriceListRule>(() =>
            {
                SubscriptionRenewalPayment.Buy(
                    subscriptionRenewalPaymentTestData.PayerId,
                    subscriptionRenewalPaymentTestData.SubscriptionId,
                    SubscriptionPeriod.Month,
                    "PL",
                    MoneyValue.Of(50, "PLN"),
                    subscriptionRenewalPaymentTestData.PriceList);
            });
        }
        public void BuySubscriptionRenewal_IsSuccessful()
        {
            // Arrange
            var subscriptionRenewalPaymentTestData = CreateSubscriptionRenewalPaymentTestData();

            // Act
            var subscriptionRenewalPayment = SubscriptionRenewalPayment.Buy(
                subscriptionRenewalPaymentTestData.PayerId,
                subscriptionRenewalPaymentTestData.SubscriptionId,
                SubscriptionPeriod.Month,
                "PL",
                MoneyValue.Of(60, "PLN"),
                subscriptionRenewalPaymentTestData.PriceList);

            // Assert
            AssertPublishedDomainEvent <SubscriptionRenewalPaymentCreatedDomainEvent>(subscriptionRenewalPayment);
        }