private bool IncorrectBooking(CancelBookingRequest request, ref PdrValidationResult result)
        {
            if (!_context.Order.Any(x => x.Id == request.BookingId && x.Status == OrderStatus.Unserved))

            {
                result.PassedValidation = false;
                result.Errors.Add("Selected booking can not be canceled.");
                return(true);
            }

            return(false);
        }
Example #2
0
        private bool DoctorIsAlreadyBooked(AddBookingRequest request, ref PdrValidationResult result)
        {
            if (_context.Doctor.First(x => x.Id == request.DoctorId)
                .Orders.Any(x => x.StartTime >= request.StartTime && x.EndTime <= request.EndTime))
            {
                result.PassedValidation = false;
                result.Errors.Add("Requested Doctor is already booked");
                return(true);
            }

            return(false);
        }
Example #3
0
        public void CancelBooking_ValidatorFails_ThrowsArgumentException()
        {
            //arrange
            var failedValidationResult = new PdrValidationResult(false, _fixture.Create <string>());

            _cancelBookingRequestValidation.Setup(x => x.ValidateRequest(It.IsAny <CancelBookingRequest>())).Returns(failedValidationResult);

            //act
            var exception = Assert.Throws <ArgumentException>(() => _bookingService.CancelBooking(_fixture.Create <CancelBookingRequest>()));

            //assert
            exception.Message.Should().Be(failedValidationResult.Errors.First());
        }
Example #4
0
        private bool SlotIsBooked(AddBookingRequest request, ref PdrValidationResult result)
        {
            if (_context.Order.Any(o => o.DoctorId == request.DoctorId &&
                                   (request.StartTime >= o.StartTime && request.StartTime < o.EndTime ||
                                    request.EndTime > o.StartTime && request.EndTime <= o.EndTime)))
            {
                result.PassedValidation = false;
                result.Errors.Add("This time slot is already booked");
                return(true);
            }

            return(false);
        }
        private bool InvalidEmail(string email, ref PdrValidationResult result)
        {
            var reg = new Regex("^[\\w-+\\.]+@([\\w-]+\\.)+[\\w-]{2,4}$");

            if (!reg.IsMatch(email))
            {
                result.PassedValidation = false;
                result.Errors.Add("Email must be a valid email address");
                return(true);
            }

            return(false);
        }
Example #6
0
        public async Task AddBooking_ValidatorFails_ThrowsArgumentException()
        {
            //arrange
            var failedValidationResult = new PdrValidationResult(false, _fixture.Create <string>());

            _validator.Setup(x => x.ValidateRequest(It.IsAny <AddBookingRequest>())).Returns(failedValidationResult);

            //act
            var exception = Assert.ThrowsAsync <ArgumentException>(() => _bookingService.AddBooking(_fixture.Create <AddBookingRequest>(), CancellationToken.None));

            //assert
            exception.Message.Should().Be(failedValidationResult.Errors.First());
        }
 private bool EmailNotValid(AddPatientRequest request, ref PdrValidationResult result)
 {
     if (!_emailValidator.EmailAddressIsValid(request.Email, out var failureReason))
     {
         result.PassedValidation = false;
         result.Errors.Add(failureReason);
         return(true);
     }
     else
     {
         return(false);
     }
 }
        public void AddOrder_ValidatorFails_ThrowsArgumentException()
        {
            //arrange
            var failedValidationResult = new PdrValidationResult(false, _fixture.Create <string>());

            _validator.Setup(x => x.ValidateRequest(It.IsAny <AddOrderRequest>())).Returns(failedValidationResult);

            //act
            var exception = Assert.Throws <ArgumentException>(() => _orderService.AddOrder(_fixture.Create <AddOrderRequest>()));

            //assert
            exception.Message.Should().Be(failedValidationResult.Errors.First());
        }
Example #9
0
        public void GetPatientNextAppointment_ValidatorFails_ThrowsObjectNotFoundException()
        {
            //arrange
            var failedValidationResult = new PdrValidationResult(false, _fixture.Create <string>());

            _getPatientNextAppointmentRequestValidator.Setup(x => x.ValidateRequest(It.IsAny <GetPatientNextAppointmentRequest>())).Returns(failedValidationResult);

            //act
            var exception = Assert.Throws <ObjectNotFoundException>(() => _bookingService.GetPatientNextAppointment(_fixture.Create <GetPatientNextAppointmentRequest>()));

            //assert
            exception.Message.Should().Be(failedValidationResult.Errors.First());
        }
Example #10
0
        public bool EmailAddressInvalid(AddPatientRequest request, ref PdrValidationResult result)
        {
            var emailAddressAttribute = new System.ComponentModel.DataAnnotations.EmailAddressAttribute();

            if (!emailAddressAttribute.IsValid(request.Email))
            {
                result.PassedValidation = false;
                result.Errors.Add("Email must be a valid email address");
                return(false);
            }

            return(true);
        }
        private bool DoctorIsAlreadyScheduled(AddOrderRequest request, ref PdrValidationResult result)
        {
            if (_context.Order.Any(x => x.DoctorId == request.DoctorId &&
                                   !x.IsCancelled &&
                                   !((request.StartTime < x.StartTime && request.EndTime < x.StartTime) ||
                                     (request.StartTime > x.EndTime && request.EndTime > x.EndTime))))
            {
                result.PassedValidation = false;
                result.Errors.Add("A doctor is already scheduled for this time");
                return(true);
            }

            return(false);
        }
 private bool ValidateEmailAddress(AddPatientRequest request, ref PdrValidationResult result)
 {
     try
     {
         MailAddress m = new MailAddress(request.Email);
         return(true);
     }
     catch (FormatException)
     {
         result.PassedValidation = false;
         result.Errors.Add("Email must be a valid email address");
         return(false);
     }
 }
        private bool EmailAddressInvalid(AddDoctorRequest request, ref PdrValidationResult result)
        {
            if (!Regex.IsMatch(request.Email,
                               @"^(?("")("".+?(?<!\\)""@)|(([0-9a-z]((\.(?!\.))|[-!#\$%&'\*\+/=\?\^`\{\}\|~\w])*)(?<=[0-9a-z])@))" +
                               @"(?(\[)(\[(\d{1,3}\.){3}\d{1,3}\])|(([0-9a-z][-0-9a-z]*[0-9a-z]*\.)+[a-z0-9][\-a-z0-9]{0,22}[a-z0-9]))$",
                               RegexOptions.IgnoreCase, System.TimeSpan.FromMilliseconds(250)))
            {
                result.PassedValidation = false;
                result.Errors.Add("Email must be a valid email address");
                return(true);
            }

            return(false);
        }
Example #14
0
        private bool ValidateBookingDateTimeAvailability(AddBookingRequest request, ref PdrValidationResult result)
        {
            var now = _systemClock.UtcNow;

            if (request.EndTime <= request.StartTime)
            {
                result.Errors.Add(ValidationErrorMessages.BookingEndDateShouldBeGreaterThenStartDate);
            }
            if (request.StartTime <= now)
            {
                result.Errors.Add(ValidationErrorMessages.BookingIsNotAllowedAtPast);
            }
            //add custom time to let doctor prepare for an appointment/complete booking
            if (request.StartTime <= now.AddMinutes(DomainConstants.MinutesForDoctorPreparation))
            {
                result.Errors.Add(ValidationErrorMessages.DoctorRequiresAdditionalTime);
            }

            if (result.Errors.Any())
            {
                result.PassedValidation = false;
                return(true);
            }

            var patientOverlappingAppointments = _context.Order.Where(o => !o.IsCancelled &&
                                                                      o.PatientId == request.PatientId &&
                                                                      request.StartTime < o.EndTime &&
                                                                      o.StartTime < request.EndTime);

            if (patientOverlappingAppointments.Any())
            {
                result.PassedValidation = false;
                result.Errors.Add(ValidationErrorMessages.IsAlreadyBooked(nameof(Patient)));
                return(true);
            }

            var doctorOverLappingAppointments = _context.Order.Where(o => !o.IsCancelled &&
                                                                     o.DoctorId == request.DoctorId &&
                                                                     request.StartTime < o.EndTime &&
                                                                     o.StartTime < request.EndTime);

            if (doctorOverLappingAppointments.Any())
            {
                result.PassedValidation = false;
                result.Errors.Add(ValidationErrorMessages.IsAlreadyBooked(nameof(Doctor)));
                return(true);
            }

            return(false);
        }
        /// <summary>
        /// A helper method to test an email is valid.
        /// </summary>
        /// <see cref="https://docs.microsoft.com/en-us/dotnet/standard/base-types/how-to-verify-that-strings-are-in-valid-email-format"/>>
        /// <param name="email">An email as a unit of check.</param>
        /// <param name="result">A validation result.</param>
        /// <returns></returns>
        public static void CheckEmailIsValid(string email, ref PdrValidationResult result)
        {
            if (string.IsNullOrWhiteSpace(email))
            {
                EnrichFailedResult(ref result);
                return;
            }

            try
            {
                // Normalize the domain
                email = Regex.Replace(email !, @"(@)(.+)$", DomainMapper,
                                      RegexOptions.None, TimeSpan.FromMilliseconds(200));

                // Examines the domain part of the email and normalizes it.
                string DomainMapper(Match match)
                {
                    // Use IdnMapping class to convert Unicode domain names.
                    var idn = new IdnMapping();

                    // Pull out and process domain name (throws ArgumentException on invalid)
                    string domainName = idn.GetAscii(match.Groups[2].Value);

                    return(match.Groups[1].Value + domainName);
                }
            }
            catch (RegexMatchTimeoutException)
            {
                EnrichFailedResult(ref result);
            }
            catch (ArgumentException)
            {
                EnrichFailedResult(ref result);
            }

            try
            {
                if (!Regex.IsMatch(email !,
                                   @"^[^@\s]+@[^@\s]+\.[^@\s]+$",
                                   RegexOptions.IgnoreCase, TimeSpan.FromMilliseconds(250)))
                {
                    EnrichFailedResult(ref result);
                }
            }
            catch (RegexMatchTimeoutException)
            {
                EnrichFailedResult(ref result);
            }
        }
        private bool DoctorIsBusy(AddBookingRequest request, ref PdrValidationResult result)
        {
            if (_context.Order.Any(o =>
                                   o.DoctorId == request.DoctorId &&
                                   (request.StartTime > o.StartTime && request.StartTime < o.EndTime ||
                                    request.EndTime > o.StartTime && request.EndTime < o.EndTime ||
                                    request.StartTime <= o.StartTime && request.EndTime >= o.EndTime)))
            {
                result.PassedValidation = false;
                result.Errors.Add("The doctor is busy");
                return(true);
            }

            return(false);
        }
        public PdrValidationResult ValidateRequest(AddBookingRequest request)
        {
            var result = new PdrValidationResult(true);

            if (PastDate(request, ref result))
            {
                return(result);
            }

            if (BusyDate(request, ref result))
            {
                return(result);
            }

            return(result);
        }
Example #18
0
        public PdrValidationResult ValidateRequest(NewBookingRequest request)
        {
            var result = new PdrValidationResult(true);

            if (BookingTimeInvalid(request, ref result))
            {
                return(result);
            }

            if (DoctorIsNotAvailable(request, ref result))
            {
                return(result);
            }

            return(result);
        }
Example #19
0
        public PdrValidationResult ValidateRequest(AddDoctorRequest request)
        {
            var result = new PdrValidationResult(true);

            if (ValidateGeneralFields(request, ref result))
            {
                return(result);
            }

            if (DoctorAlreadyInDb(request, ref result))
            {
                return(result);
            }

            return(result);
        }
        public PdrValidationResult ValidateRequest(BookingRequest request)
        {
            var result = new PdrValidationResult(true);

            if (IsAnAppointmentInPast(request, ref result))
            {
                return(result);
            }

            if (IsSlotAlreadyBooked(request, ref result))
            {
                return(result);
            }

            return(result);
        }
        public PdrValidationResult ValidateRequest(UpdateBookingRequest request)
        {
            var result = new PdrValidationResult(true);

            if (MissingRequiredFields(request, ref result))
            {
                return(result);
            }

            if (OrderDoesNotExist(request, ref result))
            {
                return(result);
            }

            return(result);
        }
        public PdrValidationResult ValidateRequest(AddClinicRequest request)
        {
            var result = new PdrValidationResult(true);

            if (MissingRequiredFields(request, ref result))
            {
                return(result);
            }

            if (ClinicAlreadyInDb(request, ref result))
            {
                return(result);
            }

            return(result);
        }
        private bool IsAnAppointmentInPast(BookingRequest request, ref PdrValidationResult result)
        {
            if (!_context.Order.Any())
            {
                return(false);
            }

            if (request.StartTime <= DateTime.UtcNow.AddHours(1))
            {
                result.PassedValidation = false;
                result.Errors.Add("Appointment cannot be scheduled earlier than than current time plus 1 hour");
                return(true);
            }

            return(false);
        }
Example #24
0
        private bool DoctorAlreadyBooked(AddBookingRequest request, ref PdrValidationResult result)
        {
            if (_context.Order.Any(x =>
                                   x.Cancelled != true &&
                                   x.DoctorId == request.DoctorId &&
                                   x.StartTime < request.EndTime &&
                                   request.StartTime < x.EndTime)
                )
            {
                result.PassedValidation = false;
                result.Errors.Add("A booking with this doctor already exists during this time");
                return(true);
            }

            return(false);
        }
        public PdrValidationResult ValidateRequest(Guid bookingId)
        {
            var result = new PdrValidationResult(true);

            if (BookingNotFound(bookingId, ref result))
            {
                return(result);
            }

            if (BookingAlreadyCancelled(bookingId, ref result))
            {
                return(result);
            }

            return(result);
        }
        public PdrValidationResult ValidateRequest(NewBookingRequest request)
        {
            var result = new PdrValidationResult(true);

            if (BookingInThePast(request, ref result))
            {
                return(result);
            }

            if (DoctorAlreadyBooked(request, ref result))
            {
                return(result);
            }

            return(result);
        }
Example #27
0
        public bool DoctorIsNotAvailable(NewBookingRequest request, ref PdrValidationResult result)
        {
            var doctorsBookings = _context.Order.Where(o => o.DoctorId == request.DoctorId);

            if (doctorsBookings.Any())
            {
                var bookedTime = doctorsBookings.Where(b => !(b.StartTime >= request.EndTime || request.StartTime >= b.EndTime));

                if (bookedTime.Any())
                {
                    result.PassedValidation = false;
                    result.Errors.Add("The Doctor is already booked in this time slot");
                    return(true);
                }
            }

            return(false);
        }
        private bool MissingRequiredFields(UpdateBookingRequest request, ref PdrValidationResult result)
        {
            var errors = new List <string>();

            if (request.Id == Guid.Empty)
            {
                errors.Add("Must be a valid Id");
            }

            if (errors.Any())
            {
                result.PassedValidation = false;
                result.Errors.AddRange(errors);
                return(true);
            }

            return(false);
        }
        public bool MissingRequiredFields(AddClinicRequest request, ref PdrValidationResult result)
        {
            var errors = new List <string>();

            if (string.IsNullOrEmpty(request.Name))
            {
                errors.Add("Name must be populated");
            }

            if (errors.Any())
            {
                result.PassedValidation = false;
                result.Errors.AddRange(errors);
                return(true);
            }

            return(false);
        }
        private bool BookingInThePast(NewBookingRequest request, ref PdrValidationResult result)
        {
            var errors = new List <string>();

            if (request.StartTime < DateTime.Now)
            {
                errors.Add("Bookings can not be in the past");
            }

            if (errors.Any())
            {
                result.PassedValidation = false;
                result.Errors.AddRange(errors);
                return(true);
            }

            return(false);
        }