private OrderViewModel CreateViewModel(DraftOrder order) { var viewModel = this.CreateViewModel(); viewModel.Id = order.OrderId; // TODO check DTO matches view model foreach (var line in order.Lines) { var seat = viewModel.Items.First(s => s.SeatType.Id == line.SeatType); seat.OrderItem = line; seat.AvailableQuantityForOrder = seat.AvailableQuantityForOrder + line.ReservedSeats; seat.MaxSelectionQuantity = Math.Min(seat.AvailableQuantityForOrder, 20); seat.PartiallyFulfilled = line.RequestedSeats > line.ReservedSeats; } return viewModel; }
public void when_specifying_registrant_and_credit_card_payment_details_for_a_valid_registration_then_sends_commands_and_redirects_to_payment_action() { var orderId = Guid.NewGuid(); var command = new AssignRegistrantDetails { OrderId = orderId, Email = "*****@*****.**", FirstName = "First Name", LastName = "Last Name", }; InitiateThirdPartyProcessorPayment paymentCommand = null; // Arrange var seatId = Guid.NewGuid(); var order = new DraftOrder(orderId, conferenceAlias.Id, DraftOrder.States.ReservationCompleted, 10); order.Lines.Add(new DraftOrderItem(seatId, 5) { ReservedSeats = 5 }); Mock.Get<IOrderDao>(this.orderDao) .Setup(d => d.FindDraftOrder(orderId)) .Returns(order); Mock.Get<IOrderDao>(this.orderDao) .Setup(d => d.FindPricedOrder(orderId)) .Returns(new PricedOrder { OrderId = orderId, Total = 100, OrderVersion = 10}); Mock.Get<ICommandBus>(this.bus) .Setup(b => b.Send(It.IsAny<Envelope<ICommand>>())) .Callback<Envelope<ICommand>>( es => { if (es.Body is InitiateThirdPartyProcessorPayment) paymentCommand = (InitiateThirdPartyProcessorPayment)es.Body; }); this.routes.MapRoute("ThankYou", "thankyou", new { controller = "Registration", action = "ThankYou" }); this.routes.MapRoute("SpecifyRegistrantAndPaymentDetails", "checkout", new { controller = "Registration", action = "SpecifyRegistrantAndPaymentDetails" }); // Act var result = (RedirectToRouteResult)this.sut.SpecifyRegistrantAndPaymentDetails(command, RegistrationController.ThirdPartyProcessorPayment, 0).Result; // Assert Mock.Get<ICommandBus>(this.bus) .Verify(b => b.Send(It.Is<Envelope<ICommand>>(es => es.Body == command)), Times.Once()); Assert.NotNull(paymentCommand); Assert.Equal(conferenceAlias.Id, paymentCommand.ConferenceId); Assert.Equal(orderId, paymentCommand.PaymentSourceId); Assert.InRange(paymentCommand.TotalAmount, 99.9m, 100.1m); Assert.Equal("Payment", result.RouteValues["controller"]); Assert.Equal("ThirdPartyProcessorPayment", result.RouteValues["action"]); Assert.Equal(this.conferenceAlias.Code, result.RouteValues["conferenceCode"]); Assert.Equal(paymentCommand.PaymentId, result.RouteValues["paymentId"]); Assert.True(((string)result.RouteValues["paymentAcceptedUrl"]).StartsWith("/thankyou")); Assert.True(((string)result.RouteValues["paymentRejectedUrl"]).StartsWith("/checkout")); }
private static void UpdateViewModel(OrderViewModel viewModel, DraftOrder order) { viewModel.OrderId = order.OrderId; viewModel.OrderVersion = order.OrderVersion; viewModel.ReservationExpirationDate = order.ReservationExpirationDate.ToEpochMilliseconds(); // TODO check DTO matches view model foreach (var line in order.Lines) { var seat = viewModel.Items.First(s => s.SeatType.Id == line.SeatType); seat.OrderItem = line; seat.AvailableQuantityForOrder = seat.AvailableQuantityForOrder + line.ReservedSeats; seat.MaxSelectionQuantity = Math.Min(seat.AvailableQuantityForOrder, 20); seat.PartiallyFulfilled = line.RequestedSeats > line.ReservedSeats; } }
public void ThenTheOrderShouldBeCreatedWithTheFollowingOrderItems(Table table) { draftOrder = RegistrationHelper.GetModel<DraftOrder>(registrationController.ThankYou(registrationViewModel.Order.OrderId)); Assert.NotNull(draftOrder); foreach (var row in table.Rows) { var orderItem = draftOrder.Lines.FirstOrDefault( l => l.SeatType == conferenceInfo.Seats.First(s => s.Description == row["seat type"]).Id); Assert.NotNull(orderItem); Assert.Equal(Int32.Parse(row["quantity"]), orderItem.ReservedSeats); } }
private OrderViewModel CreateViewModel(DraftOrder order) { var viewModel = this.CreateViewModel(); viewModel.Id = order.OrderId; // TODO check DTO matches view model foreach (var line in order.Lines) { var seat = viewModel.Items.First(s => s.SeatType.Id == line.SeatType); seat.OrderItem = line; if (line.RequestedSeats > line.ReservedSeats) { seat.PartiallyFulfilled = true; seat.MaxSeatSelection = line.ReservedSeats; } } return viewModel; }
public void when_specifying_registrant_and_credit_card_payment_details_for_a_valid_registration_then_sends_commands_and_redirects_to_payment_action() { var orderId = Guid.NewGuid(); var command = new AssignRegistrantDetails { OrderId = orderId, Email = "*****@*****.**", FirstName = "First Name", LastName = "Last Name", }; Guid paymentId = Guid.Empty; // Arrange var seatId = Guid.NewGuid(); var order = new DraftOrder(orderId, conferenceAlias.Id, DraftOrder.States.ReservationCompleted); order.Lines.Add(new DraftOrderItem(seatId, 5) { ReservedSeats = 5 }); Mock.Get<IOrderDao>(this.orderDao) .Setup(d => d.FindDraftOrder(orderId)) .Returns(order); Mock.Get<IOrderDao>(this.orderDao) .Setup(d => d.FindPricedOrder(orderId)) .Returns(new PricedOrder { OrderId = orderId, Total = 100 }); Mock.Get<ICommandBus>(this.bus) .Setup(b => b.Send(It.IsAny<IEnumerable<Envelope<ICommand>>>())) .Callback<IEnumerable<Envelope<ICommand>>>( es => { paymentId = (es.Select(e => e.Body).OfType<InitiateThirdPartyProcessorPayment>().First()).PaymentId; }); this.routes.MapRoute("ThankYou", "thankyou", new { controller = "Registration", action = "ThankYou" }); this.routes.MapRoute("SpecifyRegistrantAndPaymentDetails", "checkout", new { controller = "Registration", action = "SpecifyRegistrantAndPaymentDetails" }); // Act var result = (RedirectToRouteResult)this.sut.SpecifyRegistrantAndPaymentDetails(command, RegistrationController.ThirdPartyProcessorPayment, 0); // Assert Mock.Get<ICommandBus>(this.bus) .Verify( b => b.Send( It.Is<IEnumerable<Envelope<ICommand>>>(es => es.Select(e => e.Body).Any(c => c == command) && es.Select(e => e.Body).OfType<InitiateThirdPartyProcessorPayment>() .Any(c => c.ConferenceId == conferenceAlias.Id && c.PaymentSourceId == orderId && Math.Abs(c.TotalAmount - 100) < 0.01m) && es.Select(e => e.Body).Contains(command))), Times.Once()); Assert.Equal("Payment", result.RouteValues["controller"]); Assert.Equal("ThirdPartyProcessorPayment", result.RouteValues["action"]); Assert.Equal(this.conferenceAlias.Code, result.RouteValues["conferenceCode"]); Assert.Equal(paymentId, result.RouteValues["paymentId"]); Assert.True(((string)result.RouteValues["paymentAcceptedUrl"]).StartsWith("/thankyou")); Assert.True(((string)result.RouteValues["paymentRejectedUrl"]).StartsWith("/checkout")); }