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); }
public Task Put(NewReservationItem newReservationItem) { return(_service.SaveReservation(newReservationItem)); }
// 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); }
/// <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); }