Beispiel #1
0
        public void When_Full_DCC_Payment_Made_Results_In_An_Order_With_Payments()
        {
            var _orderCreated = new ESInv.Messages.OrderCreated(
                Guid.NewGuid(),
                Guid.NewGuid(),
                10001,
                new ESInv.Messages.Money("EUR", 100M),
                new[]
            {
                new ESInv.Messages.PaymentOffer(1M, new ESInv.Messages.Money("EUR", 100M)),
                new ESInv.Messages.PaymentOffer(1.27M, new ESInv.Messages.Money("USD", 127M))
            },
                DateTimeOffset.Now);
            var _orderPaymentMade = new ESInv.Messages.OrderPaymentMade(
                Guid.NewGuid(),
                new ESInv.Messages.Money("USD", 127M),
                DateTimeOffset.Now);

            var _SUT = new ESInv.Domain.OrderState(new[] { _orderCreated });

            _SUT.Mutate(_orderPaymentMade);

            Assert.IsTrue(_SUT.PaymentsHaveBeenMade);
            Assert.AreEqual(_orderPaymentMade.Value.Currency, _SUT.NetPaymentsValue.Currency);
            Assert.AreEqual(_orderPaymentMade.Value.Amount, _SUT.NetPaymentsValue.Amount);
            Assert.AreEqual(1, _SUT.Entries.Count());
            Assert.AreEqual(2, _SUT.Version);
        }
Beispiel #2
0
        public void When_A_Partial_Refund_Made_After_Payment_Results_In_An_Order_With_A_Net_Payment()
        {
            var _orderCreated = new ESInv.Messages.OrderCreated(
                Guid.NewGuid(),
                Guid.NewGuid(),
                10001,
                new ESInv.Messages.Money("EUR", 100M),
                new[]
                    {
                        new ESInv.Messages.PaymentOffer(1M, new ESInv.Messages.Money("EUR", 100M)),
                        new ESInv.Messages.PaymentOffer(1.27M, new ESInv.Messages.Money("USD", 127M))
                    },
                DateTimeOffset.Now);
            var _orderPaymentMade = new ESInv.Messages.OrderPaymentMade(
                Guid.NewGuid(),
                new ESInv.Messages.Money("USD", 107M),
                DateTimeOffset.Now);
            var _SUT = new ESInv.Domain.OrderState(new ESInv.Messaging.IEvent[] { _orderCreated, _orderPaymentMade });

            var _orderRefundMade = new ESInv.Messages.OrderRefundMade(
                Guid.NewGuid(),
                new ESInv.Messages.Money("USD", 100M),
                DateTimeOffset.Now);

            _SUT.Mutate(_orderRefundMade);

            Assert.IsTrue(_SUT.PaymentsHaveBeenMade);
            Assert.AreEqual("USD", _SUT.NetPaymentsValue.Currency);
            Assert.AreEqual(7M, _SUT.NetPaymentsValue.Amount);
            Assert.AreEqual(2, _SUT.Entries.Count());
            Assert.AreEqual(3, _SUT.Version);
        }
Beispiel #3
0
        public void When_A_Full_Refund_Made_After_Payment_Results_In_An_Order_With_A_Net_Payment_Of_Zero()
        {
            var _orderCreated = new ESInv.Messages.OrderCreated(
                Guid.NewGuid(),
                Guid.NewGuid(),
                10001,
                new ESInv.Messages.Money("EUR", 100M),
                new[]
            {
                new ESInv.Messages.PaymentOffer(1M, new ESInv.Messages.Money("EUR", 100M)),
                new ESInv.Messages.PaymentOffer(1.27M, new ESInv.Messages.Money("USD", 127M))
            },
                DateTimeOffset.Now);
            var _orderPaymentMade = new ESInv.Messages.OrderPaymentMade(
                Guid.NewGuid(),
                new ESInv.Messages.Money("USD", 107M),
                DateTimeOffset.Now);
            var _SUT = new ESInv.Domain.OrderState(new ESInv.Messaging.IEvent[] { _orderCreated, _orderPaymentMade });

            var _orderRefundMade = new ESInv.Messages.OrderRefundMade(
                Guid.NewGuid(),
                new ESInv.Messages.Money("USD", 107M),
                DateTimeOffset.Now);

            _SUT.Mutate(_orderRefundMade);

            Assert.IsTrue(_SUT.PaymentsHaveBeenMade);
            Assert.AreEqual("USD", _SUT.NetPaymentsValue.Currency);
            Assert.AreEqual(0M, _SUT.NetPaymentsValue.Amount);
            Assert.AreEqual(2, _SUT.Entries.Count());
        }
Beispiel #4
0
        public void When_Order_Created_Results_In_An_Order_With_Order_Attributes()
        {
            var _orderCreated = new ESInv.Messages.OrderCreated(
                Guid.NewGuid(),
                Guid.NewGuid(),
                10001,
                new ESInv.Messages.Money("EUR", 100M),
                new[]
            {
                new ESInv.Messages.PaymentOffer(1M, new ESInv.Messages.Money("EUR", 100M)),
                new ESInv.Messages.PaymentOffer(1.27M, new ESInv.Messages.Money("USD", 127M))
            },
                DateTimeOffset.Now);

            var _SUT = new ESInv.Domain.OrderState(new[] { _orderCreated });

            Assert.AreEqual(_orderCreated.OrderId, _SUT.Id);
            Assert.AreEqual(_orderCreated.MerchantId, _SUT.MerchantId);
            Assert.AreEqual(_orderCreated.SaleValue.Currency, _SUT.SaleValue.Currency);
            Assert.AreEqual(_orderCreated.SaleValue.Amount, _SUT.SaleValue.Amount);
            Assert.AreEqual(_orderCreated.Offers.Count(), _SUT.Offers.Count());
            for (int _index = 0; _index < _orderCreated.Offers.Count(); _index++)
            {
                var _expected = _orderCreated.Offers.Skip(_index).First();
                var _actual   = _SUT.Offers.Skip(_index).First();

                Assert.AreEqual(_expected.ExchangeRateIncludingMargin, _actual.ExchangeRateIncludingMargin);
                Assert.AreEqual(_expected.PaymentValue.Currency, _actual.PaymentValue.Currency);
                Assert.AreEqual(_expected.PaymentValue.Amount, _actual.PaymentValue.Amount);
            }
            Assert.AreEqual(_orderCreated.Timestamp, _SUT.CreationTimestamp);
            Assert.AreEqual(1, _SUT.Version);
        }
Beispiel #5
0
		private void When(
			ESInv.Messages.OrderCreated @event)
		{
			ESInv.DBC.Ensure.That(this.Id == Guid.Empty, "Order has already been created");

			this.Id = @event.OrderId;
			this.MerchantId = @event.MerchantId;
			this.SaleValue = @event.SaleValue.FromMessage();
			this.Offers = @event.Offers.Select(offer => offer.FromMessage());
			this.CreationTimestamp = @event.Timestamp;

			this.c_entries = new List<OrderEntry>();
		}
Beispiel #6
0
        public void When_Order_Created_Twice_Results_In_An_Exception()
        {
            var _orderCreated = new ESInv.Messages.OrderCreated(
                Guid.NewGuid(),
                Guid.NewGuid(),
                1001,
                new ESInv.Messages.Money("EUR", 100M),
                new[]
            {
                new ESInv.Messages.PaymentOffer(1M, new ESInv.Messages.Money("EUR", 100M)),
                new ESInv.Messages.PaymentOffer(1.27M, new ESInv.Messages.Money("USD", 127M))
            },
                DateTimeOffset.Now);

            var _SUT = new ESInv.Domain.OrderState(new[] { _orderCreated, _orderCreated });
        }
Beispiel #7
0
        public void Create(
            Merchant merchant,
            ulong cardNumber,
            Money saleValue,
            ICardNumberResolutionService cardNumberResolutionService,
            IRateService rateService)
        {
            ESInv.DBC.Ensure.That(base.State.Id == Guid.Empty, "Order has already been created");

            // Request data is already good at this stage ? i.e. At the stage where Billy and Noel said a lookup was going to get created
            // Merchant has already been resolved at the domain service layer command handler
            // Probably best to re-use Billy and Noel's context - that is a good place to start these aggregate methods

            // Offers
            var _nonDCCOffer = new PaymentOffer(1M, saleValue);
            var _offers      = new[] { _nonDCCOffer };

            var _cardCurrency = cardNumberResolutionService.Resolve(cardNumber);

            if (_cardCurrency != saleValue.Currency)
            {
                var _DCCOfferExchangeRateIncludingMargin = rateService.GetRate(saleValue.Currency, _cardCurrency);
                var _DCCOfferAmount = saleValue.Amount * _DCCOfferExchangeRateIncludingMargin;
                var _DCCOffer       = new PaymentOffer(_DCCOfferExchangeRateIncludingMargin, new Money(_cardCurrency, _DCCOfferAmount));

                _offers = new[] { _nonDCCOffer, _DCCOffer };
            }

            var _createdEvent = new ESInv.Messages.OrderCreated(
                Guid.NewGuid(),
                Guid.NewGuid(),
                merchant.Id,
                saleValue.ToMessage(),
                _offers.Select(offer => offer.ToMessage()),
                DateTimeOffset.Now);

            base.Apply(_createdEvent);
        }
Beispiel #8
0
        public void When_Full_DCC_Payment_Made_Results_In_An_Order_With_Payments()
        {
            var _orderCreated = new ESInv.Messages.OrderCreated(
                Guid.NewGuid(),
                Guid.NewGuid(),
                10001,
                new ESInv.Messages.Money("EUR", 100M),
                new[]
                    {
                        new ESInv.Messages.PaymentOffer(1M, new ESInv.Messages.Money("EUR", 100M)),
                        new ESInv.Messages.PaymentOffer(1.27M, new ESInv.Messages.Money("USD", 127M))
                    },
                DateTimeOffset.Now);
            var _orderPaymentMade = new ESInv.Messages.OrderPaymentMade(
                Guid.NewGuid(),
                new ESInv.Messages.Money("USD", 127M),
                DateTimeOffset.Now);

            var _SUT = new ESInv.Domain.OrderState(new[] { _orderCreated });

            _SUT.Mutate(_orderPaymentMade);

            Assert.IsTrue(_SUT.PaymentsHaveBeenMade);
            Assert.AreEqual(_orderPaymentMade.Value.Currency, _SUT.NetPaymentsValue.Currency);
            Assert.AreEqual(_orderPaymentMade.Value.Amount, _SUT.NetPaymentsValue.Amount);
            Assert.AreEqual(1, _SUT.Entries.Count());
            Assert.AreEqual(2, _SUT.Version);
        }
Beispiel #9
0
        public void When_Order_Created_Twice_Results_In_An_Exception()
        {
            var _orderCreated = new ESInv.Messages.OrderCreated(
                Guid.NewGuid(),
                Guid.NewGuid(),
                1001,
                new ESInv.Messages.Money("EUR", 100M),
                new[]
                    {
                        new ESInv.Messages.PaymentOffer(1M, new ESInv.Messages.Money("EUR", 100M)),
                        new ESInv.Messages.PaymentOffer(1.27M, new ESInv.Messages.Money("USD", 127M))
                    },
                DateTimeOffset.Now);

            var _SUT = new ESInv.Domain.OrderState(new[] { _orderCreated, _orderCreated });
        }
Beispiel #10
0
        public void When_Order_Created_Results_In_An_Order_With_Order_Attributes()
        {
            var _orderCreated = new ESInv.Messages.OrderCreated(
                Guid.NewGuid(),
                Guid.NewGuid(),
                10001,
                new ESInv.Messages.Money("EUR", 100M),
                new[]
                    {
                        new ESInv.Messages.PaymentOffer(1M, new ESInv.Messages.Money("EUR", 100M)),
                        new ESInv.Messages.PaymentOffer(1.27M, new ESInv.Messages.Money("USD", 127M))
                    },
                DateTimeOffset.Now);

            var _SUT = new ESInv.Domain.OrderState(new[] { _orderCreated });

            Assert.AreEqual(_orderCreated.OrderId, _SUT.Id);
            Assert.AreEqual(_orderCreated.MerchantId, _SUT.MerchantId);
            Assert.AreEqual(_orderCreated.SaleValue.Currency, _SUT.SaleValue.Currency);
            Assert.AreEqual(_orderCreated.SaleValue.Amount, _SUT.SaleValue.Amount);
            Assert.AreEqual(_orderCreated.Offers.Count(), _SUT.Offers.Count());
            for (int _index = 0; _index < _orderCreated.Offers.Count(); _index++)
            {
                var _expected = _orderCreated.Offers.Skip(_index).First();
                var _actual = _SUT.Offers.Skip(_index).First();

                Assert.AreEqual(_expected.ExchangeRateIncludingMargin, _actual.ExchangeRateIncludingMargin);
                Assert.AreEqual(_expected.PaymentValue.Currency, _actual.PaymentValue.Currency);
                Assert.AreEqual(_expected.PaymentValue.Amount, _actual.PaymentValue.Amount);
            }
            Assert.AreEqual(_orderCreated.Timestamp, _SUT.CreationTimestamp);
            Assert.AreEqual(1, _SUT.Version);
        }