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(); }