public void When_AddReservationRunsAndItIsNotInConflictWithAnyButIsBorderline_Then_ItIsAdded()
        {
            // Arrange
            var service = CreateReservationsService(false);

            var newReservation = new NewReservationItem
            {
                From = new DateTime(2015, 1, 2, 10, 0, 0),
                To   = new DateTime(2015, 1, 2, 11, 0, 0),
                LectureHallNumber = 202,
                LecturerId        = 8
            };

            // Act
            var result = service.Add(newReservation);

            // Assert
            ((result & ValidationResult.Conflicting) == ValidationResult.Conflicting).Should().BeFalse();
            ((result & ValidationResult.Ok) == ValidationResult.Ok).Should().BeTrue();
            service.All().Count().Should().Be(4);
            service.GetById(4).LectureHallNumber.Should().Be(202);
        }
        /// <summary>
        /// Tries to add given reservation to db, after validating it
        /// </summary>
        public ValidationResult Add(NewReservationItem newReservation)
        {
            if (newReservation == null)
            {
                throw new ArgumentNullException("newReservation");
            }

            var result = ValidateNewReservation(newReservation);

            if ((result & ValidationResult.Ok) == ValidationResult.Ok)
            {
                var reservation = new Reservation
                {
                    From     = newReservation.From,
                    To       = newReservation.To,
                    Lecturer = _queryAllLecturers.Execute().Single(p => p.Id == newReservation.LecturerId),
                    Hall     = _queryAllLectureHalls.Execute().Single(p => p.Number == newReservation.LectureHallNumber),
                };

                _queryAdd.Execute(reservation);
            }

            return(result);
        }
Example #3
0
 public Task Put(NewReservationItem newReservationItem)
 {
     return(_service.SaveReservation(newReservationItem));
 }
Example #4
0
 // POST: api/Reservations
 // Reservation item must be specified in request body
 public ValidationResult Post([FromBody] NewReservationItem item)
 {
     return(_service.Add(item));
 }
        /// <summary>
        /// Checks whether given reservation can be added.
        /// Performs logical and business validation.
        /// </summary>
        public ValidationResult ValidateNewReservation(NewReservationItem newReservation)
        {
            if (newReservation == null)
            {
                throw new ArgumentNullException("newReservation");
            }

            var result = ValidationResult.Default;

            if (newReservation.From.DayOfWeek != newReservation.To.DayOfWeek)
            {
                result |= ValidationResult.MoreThanOneDay;
            }

            if (newReservation.From > newReservation.To)
            {
                result |= ValidationResult.ToBeforeFrom;
            }

            if ((newReservation.From.Hour < 8) || (newReservation.From.Hour > 18) || (newReservation.From.Hour == 18 && newReservation.From.Minute != 0) ||
                (newReservation.To.Hour < 8) || (newReservation.To.Hour > 18) || (newReservation.To.Hour == 18 && newReservation.To.Minute != 0))
            {
                result |= ValidationResult.OutsideWorkingHours;
            }

            var secondsBetweenToAndFrom = (newReservation.To - newReservation.From).TotalSeconds;

            if (secondsBetweenToAndFrom > 10800) //10800 is 3 hours in seconds
            {
                result |= ValidationResult.TooLong;
            }

            var existingReservations = _queryAll.Execute();
            var listOfPossibleOverlappingReservations = existingReservations.Select(x => x).Where(x => x.Hall.Number == newReservation.LectureHallNumber);

            foreach (Reservation res in listOfPossibleOverlappingReservations.ToList())
            {
                if (res.From > newReservation.From && res.To <= newReservation.To)
                {
                    result |= ValidationResult.Conflicting;
                    break;
                }
                if (res.From < newReservation.From && res.To >= newReservation.To)
                {
                    result |= ValidationResult.Conflicting;
                    break;
                }
                if (res.From == newReservation.From && res.To == newReservation.To)
                {
                    result |= ValidationResult.Conflicting;
                    break;
                }
                if (res.From >= newReservation.From && res.To < newReservation.To)
                {
                    result |= ValidationResult.Conflicting;
                    break;
                }
                if (res.From <= newReservation.From && res.To > newReservation.To)
                {
                    result |= ValidationResult.Conflicting;
                    break;
                }
            }

            var lectureHalls = _queryAllLectureHalls.Execute();

            if (!lectureHalls.Any(x => x.Number == newReservation.LectureHallNumber))
            {
                result |= ValidationResult.HallDoesNotExist;
            }

            var lecturers = _queryAllLecturers.Execute();

            if (!lecturers.Any(x => x.Id == newReservation.LecturerId))
            {
                result |= ValidationResult.LecturerDoesNotExist;
            }

            // TODO
            // Note that for reservation dates, we take into account only date and an hour, minutes and seconds don't matter.

            return(result);
        }
Example #6
0
        /// <summary>
        /// Checks whether given reservation can be added.
        /// Performs logical and business validation.
        /// </summary>
        public ValidationResult ValidateNewReservation(NewReservationItem newReservation)
        {
            if (newReservation == null)
            {
                throw new ArgumentNullException("newReservation");
            }

            var result = ValidationResult.Default;

            // TODO
            // Implement following validation rules:
            // (idea is to check all and give customer full information, not to stop after first fail - therefore enum with [Flags] Attribute is returned)

            // - newReservation.From must be the same day as newReservation.To. If it isn't, set result |= ValidationResult.MoreThanOneDay
            if (newReservation.From.Day != newReservation.To.Day)
            {
                result |= ValidationResult.MoreThanOneDay;
            }

            // - newReservation.From obviously can't be >= newReservation.To. If it is, set result |= ValidationResult.ToBeforeFrom
            if (DateTime.Compare(newReservation.From, newReservation.To) >= 0)
            {
                result |= ValidationResult.ToBeforeFrom;
            }

            // - whole newReservation must be included inside working hours: 8-18 (it can't start before 8 and must finish at 18 at the very latest).
            //   If it's not met, set result |= ValidationResult.OutsideWorkingHours
            if (newReservation.From.TimeOfDay.Hours < 8 ||
                newReservation.To.TimeOfDay.Hours > 18)
            {
                result |= ValidationResult.OutsideWorkingHours;
            }

            // - newReservation must last 3 hours at most. If it's not, set result |= ValidationResult.TooLong
            if ((newReservation.To.TimeOfDay.Hours - newReservation.From.TimeOfDay.Hours) > 3)
            {
                result |= ValidationResult.TooLong;
            }

            // - newReservation obviously cannot be in conflict (same hallNumber and overlapping hours) with any existing reservation.
            //   If it is, set result |= ValidationResult.Conflicting. Use _queryAll to get all extisting reservations
            var reservationToCheck = _queryAll.Execute()
                                     .Where(r => r.Hall.Number == newReservation.LectureHallNumber &&
                                            (r.From.TimeOfDay >= newReservation.From.TimeOfDay &&
                                             r.To.TimeOfDay <= newReservation.To.TimeOfDay))
                                     .FirstOrDefault();

            if (reservationToCheck != null)
            {
                result |= ValidationResult.Conflicting;
            }

            // - check if newReservation.LectureHallNumber points at existing lecture hall. If it's not,
            //   set result |= ValidationResult.HallDoesNotExist. Use _queryAllLectureHalls to get all extisting lecture halls
            var lectureHallsToCheck = _queryAllLectureHalls.Execute()
                                      .Where(h => h.Number == newReservation.LectureHallNumber)
                                      .FirstOrDefault();

            if (lectureHallsToCheck == null)
            {
                result |= ValidationResult.HallDoesNotExist;
            }

            // - check if newReservation.LecturerId points at existing lecturer. If it's not,
            //   set result |= ValidationResult.LecturerDoesNotExist. Use _queryAllLecturers to get all extisting lecturers
            var lecturersTocheck = _queryAllLecturers.Execute()
                                   .Where(l => l.Id == newReservation.LecturerId)
                                   .FirstOrDefault();

            if (lecturersTocheck == null)
            {
                result |= ValidationResult.LecturerDoesNotExist;
            }

            // Remember ! Check ALL validation rules and set result with appropriate enum flag described above.
            // Note that for reservation dates, we take into account only date and an hour, minutes and seconds don't matter.

            if (result == ValidationResult.Default)
            {
                return(ValidationResult.Ok);
            }

            return(result);
        }
        /// <summary>
        /// Checks whether given reservation can be added.
        /// Performs logical and business validation.
        /// </summary>
        public ValidationResult ValidateNewReservation(NewReservationItem newReservation)
        {
            if (newReservation == null)
            {
                throw new ArgumentNullException("newReservation");
            }

            var result = ValidationResult.Default;


            // TODO
            // Implement following validation rules:
            // (idea is to check all and give customer full information, not to stop after first fail - therefore enum with [Flags] Attribute is returned)
            // - newReservation.From must be the same day as newReservation.To. If it isn't, set result |= ValidationResult.MoreThanOneDay
            // - newReservation.From obviously can't be >= newReservation.To. If it is, set result |= ValidationResult.ToBeforeFrom
            // - whole newReservation must be included inside working hours: 8-18 (it can't start before 8 and must finish at 18 at the very latest).
            //   If it's not met, set result |= ValidationResult.OutsideWorkingHours
            // - newReservation must last 3 hours at most. If it's not, set result |= ValidationResult.TooLong
            // - newReservation obviously cannot be in conflict (same hallNumber and overlapping hours) with any existing reservation.
            //   If it is, set result |= ValidationResult.Conflicting. Use _queryAll to get all extisting reservations
            // - check if newReservation.LectureHallNumber points at existing lecture hall. If it's not,
            //   set result |= ValidationResult.HallDoesNotExist. Use _queryAllLectureHalls to get all extisting lecture halls
            // - check if newReservation.LecturerId points at existing lecturer. If it's not,
            //   set result |= ValidationResult.LecturerDoesNotExist. Use _queryAllLecturers to get all extisting lecturers

            // Remember ! Check ALL validation rules and set result with appropriate enum flag described above.
            // Note that for reservation dates, we take into account only date and an hour, minutes and seconds don't matter.
            if (!newReservation.From.Equals(newReservation.To))
            {
                result = ValidationResult.MoreThanOneDay;
            }

            /*if (newReservation.From >= newReservation.To)
             * {
             *  result = ValidationResult.ToBeforeFrom;
             * }
             *
             * if (newReservation.From.Hour < 8 && newReservation.To.Hour > 18)
             * {
             *  result = ValidationResult.OutsideWorkingHours;
             * }
             *
             * if (newReservation.To.Hour - newReservation.From.Hour > 3)
             * {
             *  result = ValidationResult.TooLong;
             * }
             *
             * IEnumerable<Reservation> existings = _queryAll.Execute().ToList();
             * foreach (var item in existings)
             * {
             *  if (item.Hall.Number == newReservation.LectureHallNumber
             *      && item.From.Hour.Equals(newReservation.From.Hour) && item.To.Hour.Equals(newReservation.To.Hour))
             *  {
             *      result = ValidationResult.Conflicting;
             *      break;
             *  }
             * }
             *
             * IEnumerable<LectureHall> lectureHalls = _queryAllLectureHalls.Execute().ToList();
             * foreach (var item in lectureHalls)
             * {
             *  if (item.Number != newReservation.LectureHallNumber)
             *  {
             *      result = ValidationResult.HallDoesNotExist;
             *      break;
             *  }
             * }
             *
             * IEnumerable<Lecturer> lectures = _queryAllLecturers.Execute().ToList();
             * foreach (var item in lectures)
             * {
             *  if (item.Id != newReservation.LecturerId)
             *  {
             *      result = ValidationResult.LecturerDoesNotExist;
             *      break;
             *  }
             * }*/


            if (result == ValidationResult.Default)
            {
                result = ValidationResult.Ok;
            }

            return(result);
        }