public async Task BookingController_Confirm_WhenTripCompleted_ShouldReturnTripAlreadyCompletedStatusCode()
        {
            // Arrange
            var tripReference    = StringHelper.RandomString(8);
            var bookingReference = StringHelper.RandomString(6);

            _mockTripRepository
            .Setup(m => m.GetByTripReferenceAsync(It.IsAny <string>()))
            .ReturnsAsync(TestDataHelper.GetTripCollection(tripReference, TripStatus.Completed).FirstOrDefault())
            .Verifiable();
            _mockBookingRepository
            .Setup(m => m.GetByBookingReferenceAsync(It.IsAny <string>()))
            .ReturnsAsync(TestDataHelper.GetBookingCollection(bookingReference, tripReference, BookingStatus.Initiated).FirstOrDefault())
            .Verifiable();
            _mockBookingRepository
            .Setup(m => m.ConfirmAsync(It.IsAny <Booking>()))
            .Returns(Task.FromResult <object>(null))
            .Verifiable();

            // Act
            var bookingController = new BookingController(_mockTripRepository.Object, _mockBookingRepository.Object, _mockLogger.Object);
            var result            = await bookingController.Confirm(bookingReference);

            var statusCodeResult = result as ObjectResult;

            // Assert
            Assert.IsNotNull(statusCodeResult);
            Assert.AreEqual(ErrorCodes.TRIP_ALREADY_COMPLETED, statusCodeResult.StatusCode.Value);
            _mockBookingRepository.Verify(m => m.GetByBookingReferenceAsync(It.IsAny <string>()), Times.Once);
            _mockTripRepository.Verify(m => m.GetByTripReferenceAsync(It.IsAny <string>()), Times.Once);
            _mockBookingRepository.Verify(m => m.ConfirmAsync(It.IsAny <Booking>()), Times.Never);
        }
        public async Task BookingController_Confirm_WhenTripDoesNotExist_ShouldReturnNotFound()
        {
            // Arrange
            var tripReference    = StringHelper.RandomString(8);
            var bookingReference = StringHelper.RandomString(6);

            _mockTripRepository
            .Setup(m => m.GetByTripReferenceAsync(It.IsAny <string>()))
            .ReturnsAsync(default(Trip))
            .Verifiable();
            _mockBookingRepository
            .Setup(m => m.GetByBookingReferenceAsync(It.IsAny <string>()))
            .ReturnsAsync(TestDataHelper.GetBookingCollection(bookingReference, tripReference, BookingStatus.Initiated).FirstOrDefault())
            .Verifiable();
            _mockBookingRepository
            .Setup(m => m.ConfirmAsync(It.IsAny <Booking>()))
            .Returns(Task.FromResult <object>(null))
            .Verifiable();

            // Act
            var bookingController = new BookingController(_mockTripRepository.Object, _mockBookingRepository.Object, _mockLogger.Object);
            var result            = await bookingController.Confirm(bookingReference);

            // Assert
            Assert.IsNotNull(result as NotFoundObjectResult);
            _mockBookingRepository.Verify(m => m.GetByBookingReferenceAsync(It.IsAny <string>()), Times.Once);
            _mockTripRepository.Verify(m => m.GetByTripReferenceAsync(It.IsAny <string>()), Times.Once);
            _mockBookingRepository.Verify(m => m.ConfirmAsync(It.IsAny <Booking>()), Times.Never);
        }
        public void Works()
        {
            var contextProvider = ObjectFactory.GetInstance <IContextProvider>();
            var viewModel       = new ReviewViewModel();

            viewModel.BusId                      = new Guid("6a9857a6-d0b0-4e1a-84cb-ee9ade159560");
            viewModel.PickUp                     = new DateTime(2090, 1, 2);
            viewModel.DropOff                    = new DateTime(2090, 1, 6);
            viewModel.Forename                   = "Percy";
            viewModel.Surname                    = "Purple";
            viewModel.AddressLine1               = "5 Green Lane";
            viewModel.Town                       = "Blackville";
            viewModel.County                     = "Blueshire";
            viewModel.PostCode                   = "M1 1AA";
            viewModel.Email                      = "*****@*****.**";
            viewModel.TelephoneNumber            = "*****@*****.**";
            viewModel.IsMainDriver               = false;
            viewModel.DrivingLicenceNumber       = "ABC1234";
            viewModel.DriverForename             = "Betty";
            viewModel.DriverSurname              = "Beige";
            viewModel.NumberOfAdults             = 2;
            viewModel.NumberOfChildren           = 1;
            viewModel.VoucherCode                = null;
            viewModel.RestrictionsAccepted       = true;
            viewModel.TermsAndConditionsAccepted = true;

            using (contextProvider)
            {
                _bookingController.Confirm(viewModel);
                contextProvider.SaveChanges();
            }

            using (contextProvider)
            {
                var bookingRepository = ObjectFactory.GetInstance <IBookingRepository>();
                var booking           = bookingRepository.GetAll().Single(x => x.Id.Value != new Guid("eaa01eab-f3bd-4e24-8368-d3501a227a8b"));
                Assert.That(booking.PickUp, Is.EqualTo(viewModel.PickUp));
                Assert.That(booking.DropOff, Is.EqualTo(viewModel.DropOff));
                Assert.That(booking.Bus.Id.Value, Is.EqualTo(viewModel.BusId));
                Assert.That(booking.Customer.Forename, Is.EqualTo(viewModel.Forename));
                Assert.That(booking.Customer.Surname, Is.EqualTo(viewModel.Surname));
                Assert.That(booking.Customer.AddressLine1, Is.EqualTo(viewModel.AddressLine1));
                Assert.That(booking.Customer.Town, Is.EqualTo(viewModel.Town));
                Assert.That(booking.Customer.County, Is.EqualTo(viewModel.County));
                Assert.That(booking.Customer.PostCode, Is.EqualTo(viewModel.PostCode));
                Assert.That(booking.Customer.TelephoneNumber, Is.EqualTo(viewModel.TelephoneNumber));
                Assert.That(booking.IsMainDriver, Is.EqualTo(viewModel.IsMainDriver));
                Assert.That(booking.DriverForename, Is.EqualTo(viewModel.DriverForename));
                Assert.That(booking.DriverSurname, Is.EqualTo(viewModel.DriverSurname));
                Assert.That(booking.NumberOfAdults, Is.EqualTo(viewModel.NumberOfAdults));
                Assert.That(booking.NumberOfChildren, Is.EqualTo(viewModel.NumberOfChildren));
                Assert.That(booking.TotalCost, Is.EqualTo(600));
                Assert.That(booking.CreatedBy.Id.Value, Is.EqualTo(new Guid("c8238876-47fc-42af-8a32-926061097f1c")));
                Assert.That(booking.CreatedBy.Username, Is.EqualTo("Application"));
            }
        }
        public void TestIfBookingControllerConfirmActionReturnsTaskIActionResult()
        {
            var options = new DbContextOptionsBuilder <ApplicationDbContext>()
                          .UseInMemoryDatabase("TestDb")
                          .Options;

            var mockHotelService     = new Mock <IHotelService>();
            var applicationDbcontext = new ApplicationDbContext(options);
            var mockRoomService      = new Mock <IRoomService>();

            var store = new Mock <IUserStore <ApplicationUser> >();
            var mgr   = new Mock <UserManager <ApplicationUser> >(store.Object, null, null, null, null, null, null, null, null);

            mgr.Object.UserValidators.Add(new UserValidator <ApplicationUser>());
            mgr.Object.PasswordValidators.Add(new PasswordValidator <ApplicationUser>());

            var testController = new BookingController(applicationDbcontext, mockHotelService.Object, mockRoomService.Object, mgr.Object);

            var result = testController.Confirm(null, "test", "test", 1, 1, "test");

            Assert.IsAssignableFrom <Task <IActionResult> >(result);
        }
        public async Task BookingController_Confirm_WhenBookingInitiated_ShouldReturnOk()
        {
            // Arrange
            var tripReference    = StringHelper.RandomString(8);
            var bookingReference = StringHelper.RandomString(6);

            _mockTripRepository
            .Setup(m => m.GetByTripReferenceAsync(It.IsAny <string>()))
            .ReturnsAsync(TestDataHelper.GetTripCollection(tripReference).FirstOrDefault())
            .Verifiable();
            _mockBookingRepository
            .Setup(m => m.GetByBookingReferenceAsync(It.IsAny <string>()))
            .ReturnsAsync(TestDataHelper.GetBookingCollection(bookingReference, tripReference, BookingStatus.Initiated).FirstOrDefault())
            .Verifiable();
            _mockBookingRepository
            .Setup(m => m.ConfirmAsync(It.IsAny <Booking>()))
            .Returns(Task.FromResult <object>(null))
            .Verifiable();

            // Act
            var bookingController = new BookingController(_mockTripRepository.Object, _mockBookingRepository.Object, _mockLogger.Object);
            var result            = await bookingController.Confirm(bookingReference);

            var objResult = result as OkObjectResult;

            // Assert
            Assert.IsNotNull(objResult);
            var bookingResponse = objResult.Value as BookingResponseModel;

            Assert.IsNotNull(bookingResponse);
            Assert.AreEqual(bookingReference, bookingResponse.BookingReference);
            Assert.AreEqual(BookingStatus.Completed, bookingResponse.BookingStatus.ToEnum <BookingStatus>());
            _mockBookingRepository.Verify(m => m.GetByBookingReferenceAsync(It.IsAny <string>()), Times.Once);
            _mockTripRepository.Verify(m => m.GetByTripReferenceAsync(It.IsAny <string>()), Times.Once);
            _mockBookingRepository.Verify(m => m.ConfirmAsync(It.IsAny <Booking>()), Times.Once);
        }