/// <summary> /// /// </summary> /// <param name="model"></param> /// <returns></returns> private IActionResult ValidateRequest(ShiftRequestModel model) { if (model == null) { return(BadRequest("All values must be informed.")); } IActionResult response = null; if (model.StartDate.DayOfWeek == DayOfWeek.Saturday || model.StartDate.DayOfWeek == DayOfWeek.Sunday) { response = BadRequest("Weekends are not valid working days."); } else if (model.StartDate == DateTime.MinValue) { response = BadRequest("Date value cannot be empty."); } else if (model.StartDate < DateTime.Now.Date) { response = BadRequest("It is not possible to schedule backward."); } else if (model.Count == 0) { response = BadRequest("The number of support engineers is required."); } else if (model.EndDate > DateTime.MinValue) { if (model.EndDate <= model.StartDate) { response = BadRequest("The final date must be greater than the initial date."); } } return(response); }
public IActionResult ScheduleEngineersShiftRange([FromBody] ShiftRequestModel schedule) { IActionResult response = ValidateRequest(schedule); if (response != null) { return(response); } else { try { var scheduledEngineers = _shiftService.ScheduleEngineerShiftRange(schedule).Select(x => x.Engineer).ToList(); if (scheduledEngineers.Any()) { response = Ok(Mapper.Map <List <EngineerModel> >(scheduledEngineers)); } } catch (Exception ex) { response = BadRequest(ex.Message); } } return(response); }
// TODO: add better exception handler public List <EngineerShiftModel> ScheduleEngineerShiftRange(ShiftRequestModel shiftRequest) { List <EngineerShiftModel> shifts = new List <EngineerShiftModel>(); for (DateTime date = shiftRequest.StartDate.Date; date <= shiftRequest.EndDate.Date; date = date.NextBusinessDay()) { shifts.AddRange(this.ScheduleEngineerShift(new ShiftRequestModel { StartDate = date, Count = shiftRequest.Count })); } return(shifts); }
public void ScheduleEngineersShiftRange_Success() { Mapper.Initialize(cfg => { cfg.AddProfile <BAUMappingProfile>(); }); var date = DateTime.Now.NextDayOfWeek(DayOfWeek.Thursday); Mock <IShiftService> mockService = new Mock <IShiftService>(MockBehavior.Strict); mockService.Setup(s => s.ScheduleEngineerShiftRange(It.IsAny <ShiftRequestModel>())) .Returns( new List <EngineerShiftModel> { new EngineerShiftModel { Date = date, Duration = 4, Engineer = new EngineerModel { Id = 1, Name = "Engineer 1" } }, new EngineerShiftModel { Date = date.NextDayOfWeek(DayOfWeek.Tuesday), Duration = 4, Engineer = new EngineerModel { Id = 2, Name = "Engineer 2" } }, }); ShiftController controller = new ShiftController(mockService.Object); var model = new ShiftRequestModel { Count = 2, StartDate = date, EndDate = date.NextDayOfWeek(DayOfWeek.Tuesday) }; var result = controller.ScheduleEngineersShiftRange(model); Assert.NotNull(result); Assert.True(result.GetType() == typeof(OkObjectResult)); var expected = new List <EngineerModel> { new EngineerModel { Id = 1, Name = "Engineer 1" }, new EngineerModel { Id = 2, Name = "Engineer 2" }, }; Assert.Equal(expected, (result as OkObjectResult).Value); mockService.Verify(m => m.ScheduleEngineerShiftRange(model), Times.Once()); }
public void ScheduleEngineersShiftRange_Exception() { Mock <IShiftService> mockService = new Mock <IShiftService>(MockBehavior.Strict); mockService.Setup(s => s.ScheduleEngineerShiftRange(It.IsAny <ShiftRequestModel>())).Throws(new InvalidOperationException("Testing controller exception handler")); ShiftController controller = new ShiftController(mockService.Object); var date = DateTime.Now.NextDayOfWeek(DayOfWeek.Thursday); var model = new ShiftRequestModel { Count = 2, StartDate = date, EndDate = date.NextDayOfWeek(DayOfWeek.Tuesday) }; var result = controller.ScheduleEngineersShiftRange(model); Assert.NotNull(result); Assert.True(result.GetType() == typeof(BadRequestObjectResult)); Assert.Equal("Testing controller exception handler", (result as BadRequestObjectResult).Value); mockService.Verify(m => m.ScheduleEngineerShiftRange(It.IsAny <ShiftRequestModel>()), Times.Once()); }
public void ScheduleEngineersShiftRange_EndDate_Error() { Mock <IShiftService> mockService = new Mock <IShiftService>(MockBehavior.Strict); mockService.Setup(s => s.ScheduleEngineerShiftRange(It.IsAny <ShiftRequestModel>()));//.Returns(new List<EngineerShiftModel>()); ShiftController controller = new ShiftController(mockService.Object); var date = DateTime.Now.NextDayOfWeek(DayOfWeek.Thursday); var model = new ShiftRequestModel { Count = 2, StartDate = date.NextDayOfWeek(DayOfWeek.Tuesday), EndDate = date }; var result = controller.ScheduleEngineersShiftRange(model); Assert.NotNull(result); Assert.True(result.GetType() == typeof(BadRequestObjectResult)); Assert.Equal("The final date must be greater than the initial date.", (result as BadRequestObjectResult).Value); mockService.Verify(m => m.ScheduleEngineerShiftRange(It.IsAny <ShiftRequestModel>()), Times.Never()); }
public List <EngineerShiftModel> ScheduleEngineerShift(ShiftRequestModel shiftRequest) { List <Engineer> engineers = _repository.FindEngineersAvailableOn(shiftRequest.StartDate); if (engineers.Count < shiftRequest.Count) { throw new InvalidOperationException ($"You requested {shiftRequest.Count} engineer{(shiftRequest.Count > 1 ? "s" : "")} but only {engineers.Count} {(engineers.Count > 1 ? "are" : "is")} available"); } ValidateEngineers(engineers, shiftRequest.StartDate); var randomEngineers = engineers.OrderBy(x => new Random().Next()).Take(shiftRequest.Count).ToList(); List <EngineerShift> shifts = randomEngineers.Select(e => new EngineerShift { Date = shiftRequest.StartDate, EngineerId = e.Id, Duration = 4 } ).ToList(); return(Mapper.Map <List <EngineerShiftModel> >(_repository.ScheduleEngineerShift(shifts))); }