public void GivenTheSelectedOrderItems(Table table) { conferenceInfo = ScenarioContext.Current.Get <ConferenceInfo>(); registrationController = RegistrationHelper.GetRegistrationController(conferenceInfo.Slug); orderViewModel = RegistrationHelper.GetModel <OrderViewModel>(registrationController.StartRegistration().Result); Assert.NotNull(orderViewModel); registration = new RegisterToConference { ConferenceId = conferenceInfo.Id, OrderId = orderViewModel.OrderId }; foreach (var row in table.Rows) { var orderItemViewModel = orderViewModel.Items.FirstOrDefault(s => s.SeatType.Description == row["seat type"]); Assert.NotNull(orderItemViewModel); int qt; if (!row.ContainsKey("quantity") || !Int32.TryParse(row["quantity"], out qt)) { qt = orderItemViewModel.SeatType.Quantity; } registration.Seats.Add(new SeatQuantity(orderItemViewModel.SeatType.Id, qt)); } // Store for sharing between steps implementations ScenarioContext.Current.Set(registration); ScenarioContext.Current.Set(registrationController.ConferenceAlias); }
public ActionResult StartRegistration(string conferenceCode, OrderViewModel contentModel) { var viewModel = this.UpdateViewModel(conferenceCode, contentModel); var command = new RegisterToConference { OrderId = viewModel.Id, ConferenceId = viewModel.ConferenceId, Seats = viewModel.Items.Select(x => new RegisterToConference.Seat { SeatTypeId = x.SeatTypeId, Quantity = x.Quantity }).ToList() }; this.commandBus.Send(command); var orderDTO = this.WaitUntilUpdated(viewModel.Id); if (orderDTO != null) { if (orderDTO.State == "Booked") { return(RedirectToAction("SpecifyPaymentDetails", new { conferenceCode = conferenceCode, orderId = viewModel.Id })); } else if (orderDTO.State == "Rejected") { return(View("ReservationRejected", viewModel)); } } return(View("ReservationUnknown", viewModel)); }
public void WhenTheRegistrantProceedToMakeTheReservation() { registerToConference = ScenarioContext.Current.Get <RegisterToConference>(); var conferenceAlias = ScenarioContext.Current.Get <ConferenceAlias>(); registerToConference.ConferenceId = conferenceAlias.Id; orderId = registerToConference.OrderId; this.commandBus.Send(registerToConference); }
public void ThenTheEventForReservingTheSelectedSeatsIsEmitted() { registerToConference = registerToConference ?? ScenarioContext.Current.Get <RegisterToConference>(); // Wait and Check for SeatsReserved event was emitted Assert.True(MessageLogHelper.CollectEvents <SeatsReserved>(registerToConference.ConferenceId, 1)); var seatsReserved = MessageLogHelper.GetEvents <SeatsReserved>(registerToConference.ConferenceId).SingleOrDefault(); Assert.NotNull(seatsReserved); Assert.Equal(registerToConference.Seats.Count, seatsReserved.AvailableSeatsChanged.Count()); }
public void WhenTheCommandToRegisterTheSelectedOrderItemsIsLost() { registerToConference = ScenarioContext.Current.Get <RegisterToConference>(); var conferenceAlias = ScenarioContext.Current.Get <ConferenceAlias>(); registerToConference.ConferenceId = conferenceAlias.Id; orderId = registerToConference.OrderId; //Command lost because of a failure //this.commandBus.Send(registerToConference); }
public void WhenTheCommandToRegisterTheSelectedOrderItemsIsSent() { registerToConference = ScenarioContext.Current.Get <RegisterToConference>(); var conferenceAlias = ScenarioContext.Current.Get <ConferenceAlias>(); registerToConference.ConferenceId = conferenceAlias.Id; orderId = registerToConference.OrderId; this.commandBus.Send(registerToConference); // Wait for event processing Thread.Sleep(Constants.WaitTimeout); }
private string CreateAndSendRegisterToConference(Guid conferenceId, IEnumerable <SeatQuantity> seats) { var registration = new RegisterToConference { ConferenceId = conferenceId, OrderId = Guid.NewGuid() }; registration.Seats.AddRange(seats); commandBus.Send(registration); return(registration.OrderId.ToString()); }
public StartRegistrationResult Post(RegisterToConference command) { this.ConferenceCode = command.ConferenceCode; var existingOrder = command.OrderVersion != 0 ? this._orderDao.FindDraftOrder(command.OrderId) : null; var viewModel = this.CreateViewModel(); if (existingOrder != null) { UpdateViewModel(viewModel, existingOrder); } viewModel.OrderId = command.OrderId; bool needsExtraValidation = false; foreach (var seat in command.Seats) { var modelItem = viewModel.Items.FirstOrDefault(x => x.SeatType.Id == seat.SeatType); if (modelItem != null) { if (seat.Quantity > modelItem.MaxSelectionQuantity) { modelItem.PartiallyFulfilled = needsExtraValidation = true; modelItem.OrderItem.ReservedSeats = modelItem.MaxSelectionQuantity; } } else { // seat type no longer exists for conference. needsExtraValidation = true; } } //TODO: doesn't this need some work? if (needsExtraValidation) { return(new StartRegistrationResult { Success = false }); } command.ConferenceId = this.ConferenceAlias.Id; this._commandBus.Send(command); return(new StartRegistrationResult { Success = true, ConferenceCode = this.ConferenceCode, OrderId = command.OrderId, Version = command.OrderVersion }); }
public ActionResult StartRegistration(RegisterToConference command, int orderVersion) { var existingOrder = orderVersion != 0 ? this.orderDao.FindDraftOrder(command.OrderId) : null; var viewModel = this.CreateViewModel(); if (existingOrder != null) { UpdateViewModel(viewModel, existingOrder); } viewModel.OrderId = command.OrderId; if (!ModelState.IsValid) { return(View(viewModel)); } // checks that there are still enough available seats, and the seat type IDs submitted are valid. ModelState.Clear(); bool needsExtraValidation = false; foreach (var seat in command.Seats) { var modelItem = viewModel.Items.FirstOrDefault(x => x.SeatType.SeatTypeId == seat.SeatType); if (modelItem != null) { if (seat.Quantity > modelItem.MaxSelectionQuantity) { modelItem.PartiallyFulfilled = needsExtraValidation = true; modelItem.OrderItem.ReservedSeats = modelItem.MaxSelectionQuantity; } } else { // seat type no longer exists for conference. needsExtraValidation = true; } } if (needsExtraValidation) { return(View(viewModel)); } command.ConferenceId = this.ConferenceAlias.Id; this.commandBus.Send(command); return(RedirectToAction( "SpecifyRegistrantAndPaymentDetails", new { conferenceCode = this.ConferenceCode, orderId = command.OrderId, orderVersion = orderVersion })); }
public ActionResult StartRegistration(string conferenceCode, OrderViewModel contentModel) { var viewModel = this.UpdateViewModel(conferenceCode, contentModel); var command = new RegisterToConference { OrderId = viewModel.Id, ConferenceId = viewModel.ConferenceId, Seats = viewModel.Items.Select(x => new RegisterToConference.Seat { SeatTypeId = x.SeatTypeId, Quantity = x.Quantity }).ToList() }; this.commandBus.Send(command); return(RedirectToAction("SpecifyRegistrantDetails", new { conferenceCode = conferenceCode, orderId = viewModel.Id })); }
public void when_specifying_seats_for_a_valid_registration_then_places_registration_and_redirects_to_action() { var seatTypeId = Guid.NewGuid(); var seats = new[] { new SeatType(seatTypeId, conferenceAlias.Id, "Test Seat", "Description", 10, 50) { AvailableQuantity = 50 } }; // Arrange Mock.Get(this.conferenceDao).Setup(r => r.GetPublishedSeatTypes(conferenceAlias.Id)).Returns(seats); var orderId = Guid.NewGuid(); Mock.Get(this.orderDao).Setup(r => r.FindDraftOrder(orderId)).Returns(new DraftOrder(orderId, conferenceAlias.Id, DraftOrder.States.PendingReservation)); var registration = new RegisterToConference { OrderId = orderId, Seats = { new SeatQuantity(seatTypeId, 10) } }; // Act var result = (RedirectToRouteResult)this.sut.StartRegistration(registration, 0); // Assert Assert.Equal(null, result.RouteValues["controller"]); Assert.Equal("SpecifyRegistrantAndPaymentDetails", result.RouteValues["action"]); Assert.Equal(conferenceAlias.Code, result.RouteValues["conferenceCode"]); Assert.Equal(orderId, result.RouteValues["orderId"]); Mock.Get <ICommandBus>(this.bus) .Verify( b => b.Send(It.Is <Envelope <ICommand> >(e => ((RegisterToConference)e.Body).ConferenceId == conferenceAlias.Id && ((RegisterToConference)e.Body).OrderId == orderId && ((RegisterToConference)e.Body).Seats.Count == 1 && ((RegisterToConference)e.Body).Seats.ElementAt(0).Quantity == 10 && ((RegisterToConference)e.Body).Seats.ElementAt(0).SeatType == seatTypeId)), Times.Once()); }