public void Post_BookTicket_ShouldRedirectToSearchWhenBusIsAlreadyReserved()
        {
            //Arrange
            this.routeService.Setup(r => r.RouteExists(It.IsAny <int>(), It.IsAny <TimeSpan>()))
            .Returns(true);

            this.ticketService.Setup(t => t.GetAlreadyReservedTickets(It.IsAny <int>(), It.IsAny <DateTime>()))
            .Returns(new List <int>()
            {
                1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20
            });

            this.companyService.Setup(c => c.Exists(It.IsAny <string>()))
            .Returns(true);

            var controller = new RoutesController(null, routeService.Object, ticketService.Object, companyService.Object, null);

            this.PrepareTempData();
            this.SetControllerTempData(controller);

            //Act
            var form   = this.GenerateBookTicketForm();
            var result = controller.BookTicket(form);

            //Assert
            result.Should().BeOfType <RedirectToActionResult>();
            result.As <RedirectToActionResult>().ActionName.Should().Be(nameof(RoutesController.Search), WebConstants.Controller.Routes);
            result.As <RedirectToActionResult>().RouteValues[RouteValueStartTownKey].Should().Be(form.StartTownId);
            result.As <RedirectToActionResult>().RouteValues[RouteValueEndTownKey].Should().Be(form.EndTownId);
            result.As <RedirectToActionResult>().RouteValues[RouteValueDateKey].Should().Be(form.DepartureDateTime.Date);
            result.As <RedirectToActionResult>().RouteValues[RouteValueCompanyIdKey].Should().Be(form.CompanyId);
            this.customMessage.Should().Be(string.Format(WebConstants.Message.RouteSoldOut, form.StartStation, form.EndStation, form.DepartureDateTime.Date.ToYearMonthDayFormat(), form.DepartureDateTime.TimeOfDay));
        }
        public void Post_BookTicket_ShouldRedirectToHomeWithPastData()
        {
            //Arrange
            var departureTime     = new TimeSpan(10, 11, 12);
            var date              = new DateTime(2017, 11, 11);
            var departureDateTime = new DateTime(date.Year, date.Month, date.Day, departureTime.Hours, departureTime.Minutes, departureTime.Seconds);

            routeService.Setup(r => r.RouteExists(It.IsAny <int>(), It.IsAny <TimeSpan>()))
            .Returns(true);

            var controller = new RoutesController(null, routeService.Object, null, null, null);

            this.PrepareTempData();
            this.SetControllerTempData(controller);

            //Act
            var result = controller.BookTicket(new BookTicketFormModel()
            {
                DepartureDateTime = departureDateTime
            });

            //Assert
            result.Should().BeOfType <RedirectToActionResult>();
            result.As <RedirectToActionResult>().ActionName.Should().Be(nameof(HomeController.Index), WebConstants.Controller.Home);
            this.customMessage.Should().Be(WebConstants.Message.InvalidRoute);
        }
        public void Post_BookTicket_ShouldRedirectToHomeAfterSuccessfullReservation()
        {
            //Arrange
            this.routeService.Setup(r => r.RouteExists(It.IsAny <int>(), It.IsAny <TimeSpan>()))
            .Returns(true);

            this.routeService.Setup(r => r.GetRouteTicketBookingInfo(It.IsAny <int>(), It.IsAny <DateTime>()))
            .Returns(new RouteBookTicketInfoServiceModel()
            {
                BusType = BusType.Mini, ReservedTickets = new List <int>()
            });

            this.ticketService.Setup(t => t.GetAlreadyReservedTickets(It.IsAny <int>(), It.IsAny <DateTime>()))
            .Returns(new List <int>()
            {
                1, 2, 3, 4
            });

            this.ticketService.Setup(t => t.Add(It.IsAny <int>(), It.IsAny <DateTime>(), It.IsAny <IEnumerable <int> >(), It.IsAny <string>()))
            .Returns(true);

            this.companyService.Setup(c => c.Exists(It.IsAny <string>()))
            .Returns(true);

            var controller = new RoutesController(null, this.routeService.Object, this.ticketService.Object, this.companyService.Object, this.userManager.Object);

            this.PrepareTempData();
            this.SetControllerTempData(controller);

            //Act
            var form = this.GenerateBookTicketForm();

            form.Seats.FirstOrDefault(s => s.Value == 10).Checked = true;
            form.Seats.FirstOrDefault(s => s.Value == 11).Checked = true;

            var reservedTickets = new List <int>()
            {
                10, 11
            };

            var result = controller.BookTicket(form);

            //Assert
            result.Should().BeOfType <RedirectToActionResult>();
            var model = result.As <RedirectToActionResult>();

            model.ActionName.Should().Be(WebConstants.Action.Index);
            model.ControllerName.Should().Be(WebConstants.Controller.Home);
            this.customMessage.Should().Be(string.Format(WebConstants.Message.SuccessfullyTicketReservation, string.Join(", ", reservedTickets), form.StartStation, form.EndStation, form.DepartureDateTime));
        }
        public void Post_BookTicket_ShouldReturnBusSchemaWhenSomeOfTheSelectedSeatsAreAlreadyReserved()
        {
            //Arrange
            this.routeService.Setup(r => r.RouteExists(It.IsAny <int>(), It.IsAny <TimeSpan>()))
            .Returns(true);

            this.routeService.Setup(r => r.GetRouteTicketBookingInfo(It.IsAny <int>(), It.IsAny <DateTime>()))
            .Returns(new RouteBookTicketInfoServiceModel()
            {
                BusType = BusType.Mini, ReservedTickets = new List <int>()
            });

            this.ticketService.Setup(t => t.GetAlreadyReservedTickets(It.IsAny <int>(), It.IsAny <DateTime>()))
            .Returns(new List <int>()
            {
                1, 2, 3, 4
            });

            this.companyService.Setup(c => c.Exists(It.IsAny <string>()))
            .Returns(true);

            var controller = new RoutesController(null, this.routeService.Object, this.ticketService.Object, this.companyService.Object, this.userManager.Object);

            controller.ModelState.AddModelError(string.Empty, "Error");

            this.PrepareTempData();
            this.SetControllerTempData(controller);

            var matchingSeats = new List <int>()
            {
                1, 2
            };

            //Act
            var form   = this.GenerateBookTicketForm();
            var result = controller.BookTicket(form);

            //Assert
            result.Should().BeOfType <ViewResult>();
            var model = result.As <ViewResult>().Model;

            model.Should().BeOfType <BookTicketFormModel>();
        }
        public void Post_BookTicket_ShouldRedirectToHomeWithNonExistingRoute()
        {
            //Arrange
            this.routeService.Setup(r => r.RouteExists(It.IsAny <int>(), It.IsAny <TimeSpan>()))
            .Returns(false);

            var controller = new RoutesController(null, routeService.Object, null, null, null);

            this.PrepareTempData();
            this.SetControllerTempData(controller);

            //Act
            var result = controller.BookTicket(new BookTicketFormModel());

            //Assert
            result.Should().BeOfType <RedirectToActionResult>();
            result.As <RedirectToActionResult>().ActionName.Should().Be(nameof(HomeController.Index), WebConstants.Controller.Home);
            this.customMessage.Should().Be(WebConstants.Message.InvalidRoute);
        }
        public void Post_BookTicket_ShouldRedirectToHomeWithInvalidData()
        {
            //Arrange
            this.routeService.Setup(r => r.RouteExists(It.IsAny <int>(), It.IsAny <TimeSpan>()))
            .Returns(true);

            this.routeService.Setup(r => r.GetRouteTicketBookingInfo(It.IsAny <int>(), It.IsAny <DateTime>()))
            .Returns(new RouteBookTicketInfoServiceModel()
            {
                BusType = BusType.Mini, ReservedTickets = new List <int>()
            });

            this.ticketService.Setup(t => t.GetAlreadyReservedTickets(It.IsAny <int>(), It.IsAny <DateTime>()))
            .Returns(new List <int>()
            {
                1, 2, 3, 4
            });

            this.ticketService.Setup(t => t.Add(It.IsAny <int>(), It.IsAny <DateTime>(), It.IsAny <IEnumerable <int> >(), It.IsAny <string>()))
            .Returns(false);

            this.companyService.Setup(c => c.Exists(It.IsAny <string>()))
            .Returns(true);

            var controller = new RoutesController(null, this.routeService.Object, this.ticketService.Object, this.companyService.Object, this.userManager.Object);

            this.PrepareTempData();
            this.SetControllerTempData(controller);

            //Act
            var form   = this.GenerateBookTicketForm();
            var result = controller.BookTicket(form);

            //Assert
            result.Should().BeOfType <RedirectToActionResult>();
            var model = result.As <RedirectToActionResult>();

            model.ActionName.Should().Be(WebConstants.Action.Index);
            model.ControllerName.Should().Be(WebConstants.Controller.Home);
            this.customMessage.Should().Be(WebConstants.Message.InvalidRoute);
        }
        public void Get_BookTicket_ShouldReturnBusSchemaWithValidData()
        {
            //Arrange
            var departureTime     = new TimeSpan(23, 10, 10);
            var date              = DateTime.UtcNow.ToLocalTime().Date;
            var departureDateTime = new DateTime(date.Year, date.Month, date.Day, departureTime.Hours, departureTime.Minutes, departureTime.Seconds);

            this.routeService.Setup(r => r.RouteExists(It.IsAny <int>(), It.IsAny <TimeSpan>()))
            .Returns(true);

            this.routeService.Setup(r => r.GetRouteTicketBookingInfo(It.IsAny <int>(), It.IsAny <DateTime>()))
            .Returns(this.GetRouteInfo());

            this.companyService.Setup(c => c.Exists(It.IsAny <string>()))
            .Returns(true);

            var controller = new RoutesController(null, routeService.Object, null, companyService.Object, null);

            //Act
            var result = controller.BookTicket(RouteId, departureTime, date, CompanyId);

            //Assert
            result.Should().BeOfType <ViewResult>();
            var model = result.As <ViewResult>().Model;

            model.Should().BeOfType <BookTicketFormModel>();
            var form = model.As <BookTicketFormModel>();

            form.BusSeats.Should().Be(20);
            form.RouteId.Should().Be(RouteId);
            form.StartStation.Should().Be("Albena");
            form.EndStation.Should().Be("Balchik");
            form.StartTownId.Should().Be(1);
            form.EndTownId.Should().Be(2);
            form.CompanyName.Should().Be("Azimut");
            form.DepartureDateTime.Should().Be(departureDateTime);
            form.Duration.Should().Be(new TimeSpan(23, 10, 10));
            form.CompanyId.Should().Be(CompanyId);
        }
        public void Post_BookTicket_ShouldReturnViewForInvalidModel()
        {
            //Arrange
            var departureTime     = new TimeSpan(23, 10, 10);
            var date              = DateTime.UtcNow.ToLocalTime().Date;
            var departureDateTime = new DateTime(date.Year, date.Month, date.Day, departureTime.Hours, departureTime.Minutes, departureTime.Seconds);

            this.routeService.Setup(r => r.GetRouteTicketBookingInfo(It.IsAny <int>(), It.IsAny <DateTime>()))
            .Returns(this.GetRouteInfo());

            var controller = new RoutesController(null, routeService.Object, null, null, null);

            controller.ModelState.AddModelError(string.Empty, "Error");

            //Act
            var result = controller.BookTicket(new BookTicketFormModel());

            //Assert
            result.Should().BeOfType <ViewResult>();
            var model = result.As <ViewResult>().Model;

            model.Should().BeOfType <BookTicketFormModel>();
        }
        public void Get_BookTicket_ShouldRedirectToHomeWithInvalidDate()
        {
            //Arrange
            var departureTime = new TimeSpan(0, 0, 0);
            var date          = new DateTime(2017, 11, 11);

            this.routeService.Setup(r => r.RouteExists(It.IsAny <int>(), It.IsAny <TimeSpan>()))
            .Returns(true);

            var controller = new RoutesController(null, routeService.Object, null, null, null);

            this.PrepareTempData();

            this.SetControllerTempData(controller);

            //Act
            var result = controller.BookTicket(StartTownId, departureTime, date, CompanyId);

            //Assert
            result.Should().BeOfType <RedirectToActionResult>();
            result.As <RedirectToActionResult>().ActionName.Should().Be(nameof(HomeController.Index));
            result.As <RedirectToActionResult>().ControllerName.Should().Be(WebConstants.Controller.Home);
            this.customMessage.Should().Be(WebConstants.Message.InvalidRoute);
        }