Example #1
0
        /// <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);
        }
Example #2
0
        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);
        }
Example #3
0
        // 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);
        }
Example #4
0
        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());
        }
Example #5
0
        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());
        }
Example #6
0
        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());
        }
Example #7
0
        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)));
        }