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); }
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); }
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()); }
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); }
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>(); }
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 }); }
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); }
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); }
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 }); }
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); }