public async Task BookingController_Cancel_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.CancelAsync(It.IsAny <Booking>()))
            .Returns(Task.FromResult <object>(null))
            .Verifiable();

            // Act
            var bookingController = new BookingController(_mockTripRepository.Object, _mockBookingRepository.Object, _mockLogger.Object);
            var result            = await bookingController.Cancel(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.CancelAsync(It.IsAny <Booking>()), Times.Never);
            _mockTripRepository.Verify(m => m.UpdateAsync(It.IsAny <Trip>()), Times.Never);
        }
        public async Task BookingController_Cancel_WhenTripCancelled_ShouldReturnOk()
        {
            // Arrange
            var tripReference    = StringHelper.RandomString(8);
            var bookingReference = StringHelper.RandomString(6);

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

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

            // Assert
            Assert.IsNotNull(result as OkResult);
            _mockBookingRepository.Verify(m => m.GetByBookingReferenceAsync(It.IsAny <string>()), Times.Once);
            _mockTripRepository.Verify(m => m.GetByTripReferenceAsync(It.IsAny <string>()), Times.Once);
            _mockBookingRepository.Verify(m => m.CancelAsync(It.IsAny <Booking>()), Times.Once);
            _mockTripRepository.Verify(m => m.UpdateAsync(It.IsAny <Trip>()), Times.Never);
        }