public void CreateJobValidator_GivenDefinitionRequiresMessageBodyButNoMessageBodyProvided_ValidIsFalse() { //Arrange CreateJobValidationModel createJobValidationModel = CreateNewCreateJobValidationModel(); createJobValidationModel.JobCreateModel.MessageBody = ""; CreateJobValidator validator = new CreateJobValidator(); //Act ValidationResult result = validator.Validate(createJobValidationModel); //Assert result .IsValid .Should() .BeFalse(); result .Errors .Count .Should() .Be(1); result .Errors .First() .ErrorMessage .Should() .Be("A message body is required when using job definition: 'job-def-1'"); }
public void CreateJobValidator_GivenDefinitionButMissingSessionProperty_ValidIsFalse() { //Arrange CreateJobValidationModel createJobValidationModel = CreateNewCreateJobValidationModel(); createJobValidationModel.JobDefinition.SessionMessageProperty = "prop-3"; CreateJobValidator validator = new CreateJobValidator(); //Act ValidationResult result = validator.Validate(createJobValidationModel); //Assert result .IsValid .Should() .BeFalse(); result .Errors .Count .Should() .Be(1); result .Errors .First() .ErrorMessage .Should() .Be($"Session Message property 'prop-3' is required when using job definition: 'job-def-1'"); }
public void CreateJobValidator_GivenNullJobDefinition_ValidIsFalse() { //Arrange CreateJobValidationModel createJobValidationModel = CreateNewCreateJobValidationModel(); createJobValidationModel.JobDefinition = null; CreateJobValidator validator = new CreateJobValidator(); //Act ValidationResult result = validator.Validate(createJobValidationModel); //Assert result .IsValid .Should() .BeFalse(); result .Errors .Count .Should() .Be(1); result .Errors .First() .ErrorMessage .Should() .Be("Null job definition was provided"); }
public void CreateJobValidator_GivenDefinitionRequiresMessagePropertiesButPropertiesSupplieddoNotMatch_ValidIsFalse() { //Arrange CreateJobValidationModel createJobValidationModel = CreateNewCreateJobValidationModel(); createJobValidationModel.JobCreateModel.Properties = new Dictionary <string, string> { { "prop-1", "property 1" } }; CreateJobValidator validator = new CreateJobValidator(); //Act ValidationResult result = validator.Validate(createJobValidationModel); //Assert result .IsValid .Should() .BeFalse(); result .Errors .Count .Should() .Be(1); result .Errors .First() .ErrorMessage .Should() .Be("Message property 'prop-2' is required when using job definition: 'job-def-1'"); }
public void CreateJobValidator_GivenDefinitionRequiresMessagePropertiesButNoneWereSet_ValidIsFalse() { //Arrange CreateJobValidationModel createJobValidationModel = CreateNewCreateJobValidationModel(); createJobValidationModel.JobCreateModel.Properties = null; CreateJobValidator validator = new CreateJobValidator(); //Act ValidationResult result = validator.Validate(createJobValidationModel); //Assert result .IsValid .Should() .BeFalse(); result .Errors .Count .Should() .Be(1); result .Errors .First() .ErrorMessage .Should() .Be("Message properties are required when using job definition: 'job-def-1'"); }
public void CreateJobValidator_GivenValidModel_ValidIsTrue() { //Arrange CreateJobValidationModel createJobValidationModel = CreateNewCreateJobValidationModel(); CreateJobValidator validator = new CreateJobValidator(); //Act ValidationResult result = validator.Validate(createJobValidationModel); //Assert result .IsValid .Should() .BeTrue(); }
public void CreateJobValidator_GivenValidModelWithSessionConfigured_ValidIsTrue() { //Arrange CreateJobValidationModel createJobValidationModel = CreateNewCreateJobValidationModel(); createJobValidationModel.JobDefinition.SessionMessageProperty = "prop-3"; createJobValidationModel.JobCreateModel.Properties.Add("prop-3", "property 3"); CreateJobValidator validator = new CreateJobValidator(); //Act ValidationResult result = validator.Validate(createJobValidationModel); //Assert result .IsValid .Should() .BeTrue(); }
private async Task <(bool valid, IEnumerable <JobDefinition> jobDefinitions, IActionResult failureResponse)> ValidateCreateJobsRequests(IEnumerable <JobCreateModel> jobs) { Guard.ArgumentNotNull(jobs, nameof(jobs)); if (!jobs.Any()) { string message = "Empty collection of job create models was provided"; _logger.Warning(message); return(false, ArraySegment <JobDefinition> .Empty, new BadRequestObjectResult(message)); } IEnumerable <JobDefinition> jobDefinitions = await _jobDefinitionsService.GetAllJobDefinitions(); if (jobDefinitions.IsNullOrEmpty()) { string message = "Failed to retrieve job definitions"; _logger.Error(message); return(false, ArraySegment <JobDefinition> .Empty, new InternalServerErrorResult(message)); } IList <ValidationResult> validationResults = new List <ValidationResult>(); //ensure all jobs in batch have the correct job definition foreach (JobCreateModel jobCreateModel in jobs) { Guard.IsNullOrWhiteSpace(jobCreateModel.JobDefinitionId, nameof(jobCreateModel.JobDefinitionId)); JobDefinition jobDefinition = jobDefinitions?.FirstOrDefault(m => m.Id == jobCreateModel.JobDefinitionId); if (jobDefinition == null) { string message = $"A job definition could not be found for id: {jobCreateModel.JobDefinitionId}"; _logger.Warning(message); return(false, ArraySegment <JobDefinition> .Empty, new PreconditionFailedResult(message)); } CreateJobValidationModel createJobValidationModel = new CreateJobValidationModel { JobCreateModel = jobCreateModel, JobDefinition = jobDefinition }; ValidationResult validationResult = _createJobValidator.Validate(createJobValidationModel); if (validationResult != null && !validationResult.IsValid) { validationResults.Add(validationResult); } } if (validationResults.Any()) { return(false, ArraySegment <JobDefinition> .Empty, new BadRequestObjectResult(validationResults)); } return(true, jobDefinitions, null); }
public async Task <IActionResult> CreateJobs(IEnumerable <JobCreateModel> jobs, HttpRequest request) { Guard.ArgumentNotNull(jobs, nameof(jobs)); Guard.ArgumentNotNull(request, nameof(request)); if (!jobs.Any()) { string message = "Empty collection of job create models was provided"; _logger.Warning(message); return(new BadRequestObjectResult(message)); } IEnumerable <JobDefinition> jobDefinitions = await _jobDefinitionsService.GetAllJobDefinitions(); if (jobDefinitions.IsNullOrEmpty()) { string message = "Failed to retrieve job definitions"; _logger.Error(message); return(new InternalServerErrorResult(message)); } IList <ValidationResult> validationResults = new List <ValidationResult>(); Reference user = request?.GetUser(); //ensure all jobs in batch have the correct job definition foreach (JobCreateModel jobCreateModel in jobs) { Guard.IsNullOrWhiteSpace(jobCreateModel.JobDefinitionId, nameof(jobCreateModel.JobDefinitionId)); JobDefinition jobDefinition = jobDefinitions?.FirstOrDefault(m => m.Id == jobCreateModel.JobDefinitionId); if (jobDefinition == null) { string message = $"A job definition could not be found for id: {jobCreateModel.JobDefinitionId}"; _logger.Warning(message); return(new PreconditionFailedResult(message)); } if (!jobCreateModel.Properties.ContainsKey("sfa-correlationId")) { jobCreateModel.Properties.Add("sfa-correlationId", request?.GetCorrelationId()); } CreateJobValidationModel createJobValidationModel = new CreateJobValidationModel { JobCreateModel = jobCreateModel, JobDefinition = jobDefinition }; ValidationResult validationResult = _createJobValidator.Validate(createJobValidationModel); if (validationResult != null && !validationResult.IsValid) { validationResults.Add(validationResult); } } if (validationResults.Any()) { return(new BadRequestObjectResult(validationResults)); } IList <Job> createdJobs = new List <Job>(); foreach (JobCreateModel job in jobs) { Job newJobResult = await JobFromJobCreateModel(job, jobDefinitions, user); if (newJobResult == null) { string message = $"Failed to create a job for job definition id: {job.JobDefinitionId}"; _logger.Error(message); return(new InternalServerErrorResult(message)); } createdJobs.Add(newJobResult); } IEnumerable <JobDefinition> jobDefinitionsToSupersede = await SupersedeJobs(createdJobs, jobDefinitions); await QueueNotifications(createdJobs, jobDefinitionsToSupersede); return(new OkObjectResult(createdJobs)); }