public ScheduledJobResult Schedule(JobRequest request)
 {
     using (var context = new SharedDbContext())
     {
         var scheduledJob = context.ScheduledJob.Create();
         var maximumNumberOfJobsAlreadyScheduled = (from job in context.ScheduledJob
                                                    where job.ScheduledOn.Equals(request.RequestedByDate)
                                                    select job).Count() > 3;
         if(maximumNumberOfJobsAlreadyScheduled)
         {
             var date = GetNextAvailableDate(context, request.RequestedByDate);
             scheduledJob.ScheduledOn = date;
             context.ScheduledJob.Add(scheduledJob);
             context.SaveChanges();
             return new ScheduledJobResult
                 {
                     ScheduledToStart = date, Errors = new List<IJobSchedulingError>{new RequestedDateFullError()}
                 };
         }
         scheduledJob.ScheduledOn = request.RequestedByDate;
         context.ScheduledJob.Add(scheduledJob);
         context.SaveChanges();
     }
     return new ScheduledJobResult{ScheduledToStart = request.RequestedByDate};
 }
 public void Should_Schedule_Job_For_Requested_Date_If_Less_Than_4_Jobs_Scheduled_That_Date()
 {
     var request = new JobRequest
         {IsEmergency = false, RequestedByDate = DateTime.Now.AddDays(10), RequestedTask = GetKnownTaskId()};
     var sut = new JobScheduler();
     var result = sut.Schedule(request);
     result.ScheduledToStart.ShouldEqual(request.RequestedByDate);
 }
 public void Should_Accept_all_other_Requests()
 {
     var request = new JobRequest
         {IsEmergency = true, RequestedByDate = DateTime.Now.AddDays(1), RequestedTask = GetKnownTaskId()};
     var sut = new EmergencyRequestValidator();
     var result = sut.Validate(request);
     result.IsValid.ShouldBeTrue();
 }
 public void Should_Reject_Request_For_Unknown_Task()
 {
     var request = new JobRequest
         {IsEmergency = true, RequestedByDate = DateTime.Now.AddDays(1), RequestedTask = 12345674};
     var sut = new EmergencyRequestValidator();
     var result = sut.Validate(request);
     result.Errors.Any(x => x.GetType() == typeof(UnknownJobValidationError)).ShouldBeTrue();
 }
 public void Should_Schedule_Request_for_Requested_Date()
 {
     var request = new JobRequest
         {IsEmergency = true, RequestedByDate = DateTime.Now.AddDays(1), RequestedTask = GetKnownTaskId()};
     var sut = new EmergencyJobScheduler(new FakeMessageSender());
     var result = sut.Schedule(request);
     result.ScheduledToStart.ShouldEqual(request.RequestedByDate);
 }
 public void Should_Schedule_Job_For_Next_Available_Date_If_4_Jobs_Scheduled_On_Requested_Date()
 {
     var request = new JobRequest
         {IsEmergency = false, RequestedByDate = _dateWithTooManyScheduledJobs, RequestedTask = GetKnownTaskId()};
     var sut = new JobScheduler();
     var result = sut.Schedule(request);
     result.ScheduledToStart.ShouldEqual(request.RequestedByDate.AddDays(1));
     result.Errors.Any(x => x.GetType() == typeof (RequestedDateFullError)).ShouldBeTrue();
 }
 public void Should_Accept_And_Schedule_A_Valid_Request()
 {
     var sender = new FakeMessageSender();
     var regularRequestForFullDate = new JobRequest
         {IsEmergency = false, RequestedByDate = _dateWithTooManyScheduledJobs, RequestedTask = GetKnownTaskId()};
     var sut = new JobRequestController(new EmergencyRequestValidator(), new RegularRequestValidator(), new EmergencyJobScheduler(sender), new JobScheduler());
     var result = sut.Handle(regularRequestForFullDate);
     result.Accepted.ShouldBeTrue();
     result.ScheduledToStart.ShouldEqual(regularRequestForFullDate.RequestedByDate.AddDays(1));
 }
 public void Should_Accept_And_Schedule_A_Valid_Emergency_Request()
 {
     var sender = new FakeMessageSender();
     var emergencyRequest = new JobRequest
         {IsEmergency = true, RequestedByDate = DateTime.Now.AddDays(1), RequestedTask = GetKnownTaskId()};
     var sut = new JobRequestController(new EmergencyRequestValidator(), new RegularRequestValidator(), new EmergencyJobScheduler(sender), new JobScheduler());
     var result = sut.Handle(emergencyRequest);
     result.Accepted.ShouldBeTrue();
     result.ScheduledToStart.ShouldEqual(emergencyRequest.RequestedByDate);
 }
 public void Should_Send_Message_Including_Scheduled_Date()
 {
     var sender = new FakeMessageSender();
     var request = new JobRequest
         {IsEmergency = true, RequestedByDate = DateTime.Now.AddDays(1), RequestedTask = GetKnownTaskId()};
     var sut = new EmergencyJobScheduler(sender);
     sut.Schedule(request);
     var message = sender.SentMessage as EmergencyJobScheduled;
     message.ScheduledOn.ShouldEqual(request.RequestedByDate);
 }
 public void Should_Reject_Request_For_Date_In_The_Past()
 {
     var request = new JobRequest
         {
             IsEmergency = true,
             RequestedByDate = DateTime.Now.Subtract(TimeSpan.FromDays(1)),
             RequestedTask = GetKnownTaskId()
         };
     var sut = new EmergencyRequestValidator();
     var result = sut.Validate(request);
     result.Errors.Any(x => x.GetType() == typeof (DateInThePastValidationError)).ShouldBeTrue();
 }
 public ScheduledJobResult Schedule(JobRequest request)
 {
     using (var ctx = new SharedDbContext())
     {
         var scheduledJob = ctx.ScheduledJob.Create();
         scheduledJob.ScheduledOn = request.RequestedByDate;
         ctx.ScheduledJob.Add(scheduledJob);
         ctx.SaveChanges();
     }
     _messenger.Send(new EmergencyJobScheduled{ScheduledOn = request.RequestedByDate});
     return new ScheduledJobResult{ScheduledToStart = request.RequestedByDate, Errors = new List<IJobSchedulingError>()};
 }
 public JobRequestValidationResult Validate(JobRequest request)
 {
     if (DateTime.Now.CompareTo(request.RequestedByDate) > 0)
          return new JobRequestValidationResult
              {Errors = new List<IValidationError> {new DateInThePastValidationError()}};
      using (var context = new SharedDbContext())
      {
          var matchingKnownJob = context.Job.Find(request.RequestedTask);
          if (matchingKnownJob == null)
              return new JobRequestValidationResult
                  {Errors = new List<IValidationError> {new UnknownJobValidationError()}};
      }
      return new JobRequestValidationResult{IsValid = true};
 }
 public JobRequestValidationResult Validate(JobRequest request)
 {
     //Date cannot be in the past
     if (request.RequestedByDate.CompareTo(DateTime.Now) < 0)
         return new JobRequestValidationResult
             {Errors = new List<IValidationError> {new DateInThePastValidationError()}};
     //Date cannot be earlier than 4 days from now
     if (request.RequestedByDate.CompareTo(DateTime.Now.AddDays(3)) <= 0)
         return new JobRequestValidationResult
             {Errors = new List<IValidationError> {new DateTooSoonForNonEmergencyError()}};
     using (var context = new SharedDbContext())
     {
         var matchingKnownJob = context.Job.Find(request.RequestedTask);
         //must be known task
         if (matchingKnownJob == null)
             return new JobRequestValidationResult
                 {Errors = new List<IValidationError> {new UnknownJobValidationError()}};
     }
     return new JobRequestValidationResult{IsValid = true, Errors = new List<IValidationError>()};
 }
 public JobRequestResult Handle(JobRequest request)
 {
     var validationResult = request.IsEmergency
                                ? _emergencyRequestValidator.Validate(request)
                                : _requestValidator.Validate(request);
     if(!validationResult.IsValid)
     {
         var errors = new List<IJobRequestError>();
         if (validationResult.Errors != null && validationResult.Errors.Any()) errors = new List<IJobRequestError>(validationResult.Errors);
         return new JobRequestResult {Errors = errors};
     }
     var schedulingResult = request.IsEmergency
                                ? _emergencyJobScheduler.Schedule(request)
                                : _jobScheduler.Schedule(request);
     return new JobRequestResult
         {
             Accepted = true,
             ScheduledToStart = schedulingResult.ScheduledToStart,
             Errors = new List<IJobRequestError>(schedulingResult.Errors)
         };
 }
 public void Should_Reject_An_Invalid_Request()
 {
     var sender = new FakeMessageSender();
     var unkownTaskRequst = new JobRequest
         {IsEmergency = false, RequestedByDate = DateTime.Now.AddDays(5), RequestedTask = 12345678};
     var sut = new JobRequestController(new EmergencyRequestValidator(), new RegularRequestValidator(), new EmergencyJobScheduler(sender), new JobScheduler());
     var result = sut.Handle(unkownTaskRequst);
     result.Accepted.ShouldBeFalse();
     result.Errors.Any(x => x.GetType() == typeof (UnknownJobValidationError)).ShouldBeTrue();
 }