public void CancelValidBookingExpectSuccess()
            {
                // Arrange
                const int  BOOKING_ID = 1;
                const long BUSINESS_ID = 11111111111;

                var requestcancelBooking = new RequestCancelBooking() { BookingId = BOOKING_ID, BusinessId = BUSINESS_ID };
                var requestcancelBookingDto = new RequestCancelBookingDto() { BookingId = BOOKING_ID, BusinessId = BUSINESS_ID }; 
                var existingBooking = new Booking{Id = BOOKING_ID,BusinessId = BUSINESS_ID,};
                var bookingManager = MockRepository.GenerateMock<IBookingManager>();
                
                bookingManager.Stub(b => b.GetByKey(BOOKING_ID)).Return(existingBooking);
                bookingManager.Expect(r => r.RequestCancelBooking(Arg<RequestCancelBooking>.Matches(
                    rcbook => 
                        rcbook.CancellationRequestReason == requestcancelBooking.CancellationRequestReason &&
                        rcbook.CancellationRequestAction == requestcancelBooking.CancellationRequestAction &&
                        rcbook.BookingId == requestcancelBooking.BookingId &&
                        rcbook.BusinessId == requestcancelBooking.BusinessId &&
                        rcbook.BusinessContactedGuest == requestcancelBooking.BusinessContactedGuest &&
                        rcbook.Notes == requestcancelBooking.Notes), Arg<Booking>.Is.Equal(existingBooking))).Return(true);
                PropertyManagementSystemService.BookingManager = bookingManager;

                // Stub the BusinessCache to be used by our service method
                CacheHelper.StubBusinessCacheSingleBusiness(BUSINESS_ID);

                // invalidate the cache so we make sure our business is loaded into the cache
                Cache.Business.Invalidate();

                // Act
                bool requestResult = PropertyManagementSystemService.RequestCancelBooking(requestcancelBookingDto);

                // Assert
                Assert.IsTrue(requestResult, "Booking is not cancelled successfully.");
                bookingManager.VerifyAllExpectations();

                // Reassign the Dao on the cache to discard the stub assigned on the StubBusinessCacheSingleBusiness method
                CacheHelper.ReAssignBusinessDaoToBusinessCache();
            }
        public bool RequestCancelBooking(RequestCancelBookingDto requestCancelBookingDto)
        {
            // Make sure the current user has access to this business
            CheckAccessRights(requestCancelBookingDto.BusinessId);

            // Validate if business exists
            if (BusinessCache.TryGetValue(requestCancelBookingDto.BusinessId) == null)
            {
                throw new ValidationException(ErrorFactory.CreateAndLogError(Errors.SRVEX30001,
                                                                                "PropertyManagementSystemService.RequestCancelBooking",
                                                                                additionalDescriptionParameters:
                                                                                    (new object[] { requestCancelBookingDto.BusinessId })));
            }

            // Retrieve latest booking information
            Booking internalBooking = bookingManager.GetByKey(requestCancelBookingDto.BookingId);

            // Throw validation exception if booking could not be found in the system
            if (internalBooking == null)
            {
                throw new ValidationException(ErrorFactory.CreateAndLogError(Errors.SRVEX30010,
                                                                             "PropertyManagementSystemService.RequestCancelBooking",
                                                                             descriptionParameters:
                                                                                 (new object[] { requestCancelBookingDto.BookingId, requestCancelBookingDto.BookingId }),
                                                                             additionalDescriptionParameters:
                                                                                 (new object[] { requestCancelBookingDto.BookingId, requestCancelBookingDto.BusinessId }),
                                                                             arguments:
                                                                                 new object[] { requestCancelBookingDto.BookingId, requestCancelBookingDto.BusinessId }));

            }
            // Convert to requestCancelBooking Model
            RequestCancelBooking requestCancelBooking = DataTransferObjectsConverter.ConvertRequestCancelBookingDtoToRequestCancelBooking(requestCancelBookingDto);
            
            // Request cancellation
            return bookingManager.RequestCancelBooking(requestCancelBooking, internalBooking);
        }
            public void RequestCancelNonExistingBookingExpectExceptionThrown()
            {
                // Arrange
                var requestcancelBookingDto = new RequestCancelBookingDto() { BookingId = -1, BusinessId = 11111111111 };

                var bookingManager = MockRepository.GenerateStub<IBookingManager>();
                bookingManager.Stub(b => b.GetByKey(BOOKING_ID)).Return(null);
                PropertyManagementSystemService.BookingManager = bookingManager;

                // Stub the BusinessCache to be used by our service method
                CacheHelper.StubBusinessCacheSingleBusiness(BUSINESS_ID);

                // invalidate the cache so we make sure our business is loaded into the cache
                Cache.Business.Invalidate();

                try
                {
                    // Act
                    PropertyManagementSystemService.RequestCancelBooking(requestcancelBookingDto);

                    // Assert
                    Assert.Fail("An exception SRVEX30010 of type ValidationException should have been thrown");
                }
                catch (ValidationException ex)
                {
                    // Assert
                    Assert.AreEqual("SRVEX30010", ex.Code,
                                    "The Validation exception is not returning the right error code");
                }
                
              // Reassign the Dao on the cache to discard the stub assigned on the StubBusinessCacheSingleBusiness method
                CacheHelper.ReAssignBusinessDaoToBusinessCache();
            }
 /// <summary>
 /// Convert RequestCancelBookingDto to RequestCancelBooking model
 /// </summary>
 /// <param name="requestCancelBookingDto">RequestCancelBookingDto</param>
 /// <returns>RequestCancelBooking</returns>
 public static RequestCancelBooking ConvertRequestCancelBookingDtoToRequestCancelBooking(RequestCancelBookingDto requestCancelBookingDto)
 {
     return new RequestCancelBooking
                {
                    BookingId = requestCancelBookingDto.BookingId,
                    BusinessId = requestCancelBookingDto.BusinessId,
                    BusinessContactedGuest = requestCancelBookingDto.BusinessContactedGuest,
                    CancellationRequestAction = (CancellationRequestAction)requestCancelBookingDto.CancellationRequestAction,
                    CancellationRequestReason = (CancellationReasonEnum)requestCancelBookingDto.CancellationReason,
                    Notes = requestCancelBookingDto.Notes  
                };
 }