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);
        }
コード例 #9
0
        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));
        }