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"));
        }
Exemplo n.º 3
0
        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"));
        }