public async Task GetAllJobDefinitions_GivenAlreadyInCache_ReturnsFromCache()
        {
            //Arrange
            List <JobDefinition> jobDefinitions = new List <JobDefinition>
            {
                new JobDefinition()
            };

            ICacheProvider cacheProvider = CreateCacheProvider();

            cacheProvider
            .GetAsync <List <JobDefinition> >(Arg.Is(CacheKeys.JobDefinitions))
            .Returns(jobDefinitions);

            IJobDefinitionsRepository jobDefinitionsRepository = CreateJobDefinitionsRepository();

            JobDefinitionsService jobDefinitionsService = CreateJobDefinitionService(jobDefinitionsRepository, cacheProvider: cacheProvider);

            //Act
            IEnumerable <JobDefinition> definitions = await jobDefinitionsService.GetAllJobDefinitions();

            //Assert
            definitions
            .Count()
            .Should()
            .Be(1);

            jobDefinitionsRepository
            .DidNotReceive()
            .GetJobDefinitions();
        }
        public async Task GetJobDefinitions_GivenNotInCacheAndNotInCosmos_ReturnsNullListAndDoesNotSetInCache()
        {
            //Arrange
            List <JobDefinition> jobDefinitions = null;

            ICacheProvider cacheProvider = CreateCacheProvider();

            cacheProvider
            .GetAsync <List <JobDefinition> >(Arg.Is(CacheKeys.JobDefinitions))
            .Returns(jobDefinitions);

            IJobDefinitionsRepository jobDefinitionsRepository = CreateJobDefinitionsRepository();

            jobDefinitionsRepository
            .GetJobDefinitions()
            .Returns(jobDefinitions);

            JobDefinitionsService jobDefinitionsService = CreateJobDefinitionService(jobDefinitionsRepository, resiliencePolicies: GenerateTestPolicies(), cacheProvider: cacheProvider);

            //Act
            IActionResult result = await jobDefinitionsService.GetJobDefinitions();

            //Assert
            result
            .Should()
            .BeOfType <NotFoundObjectResult>()
            .Which
            .Value
            .Should()
            .Be("No job definitions were found");
        }
        public async Task GetAllJobDefinitions_GivenNotInCacheAndNotInCosmos_ReturnsNullListAndDoesNotSetInCache()
        {
            //Arrange
            List <JobDefinition> jobDefinitions = null;

            ICacheProvider cacheProvider = CreateCacheProvider();

            cacheProvider
            .GetAsync <List <JobDefinition> >(Arg.Is(CacheKeys.JobDefinitions))
            .Returns(jobDefinitions);

            IJobDefinitionsRepository jobDefinitionsRepository = CreateJobDefinitionsRepository();

            jobDefinitionsRepository
            .GetJobDefinitions()
            .Returns(jobDefinitions);

            JobDefinitionsService jobDefinitionsService = CreateJobDefinitionService(jobDefinitionsRepository, resiliencePolicies: GenerateTestPolicies(), cacheProvider: cacheProvider);

            //Act
            IEnumerable <JobDefinition> definitions = await jobDefinitionsService.GetAllJobDefinitions();

            //Assert
            definitions
            .Should()
            .BeNull();

            await
            cacheProvider
            .DidNotReceive()
            .SetAsync(Arg.Any <string>(), Arg.Any <List <JobDefinition> >());
        }
 public JobDefinitionsService CreateJobDefinitionService(
     IJobDefinitionsRepository jobDefinitionsRepository = null,
     ILogger logger = null,
     IJobsResiliencePolicies resiliencePolicies = null,
     ICacheProvider cacheProvider = null)
 {
     return(new JobDefinitionsService(
                jobDefinitionsRepository ?? CreateJobDefinitionsRepository(),
                logger ?? CreateLogger(),
                resiliencePolicies ?? JobsResilienceTestHelper.GenerateTestPolicies(),
                cacheProvider ?? CreateCacheProvider()
                ));
 }
        public async Task SaveDefinition_GivenValidJsonButSavingThrowsException_ReturnsInternalServerError()
        {
            //Arrange
            string yaml = JsonConvert.SerializeObject(new JobDefinition());

            byte[]       byteArray = Encoding.UTF8.GetBytes(yaml);
            MemoryStream stream    = new MemoryStream(byteArray);

            IHeaderDictionary headerDictionary = new HeaderDictionary();

            headerDictionary
            .Add("json-file", new StringValues(jsonFile));

            HttpRequest request = Substitute.For <HttpRequest>();

            request
            .Headers
            .Returns(headerDictionary);

            request
            .Body
            .Returns(stream);

            ILogger logger = CreateLogger();

            IJobDefinitionsRepository jobDefinitionsRepository = CreateJobDefinitionsRepository();

            jobDefinitionsRepository
            .When(x => x.SaveJobDefinition(Arg.Any <JobDefinition>()))
            .Do(x => { throw new Exception(); });


            JobDefinitionsService jobDefinitionsService = CreateJobDefinitionService(logger: logger, jobDefinitionsRepository: jobDefinitionsRepository);

            //Act
            IActionResult result = await jobDefinitionsService.SaveDefinition(request);

            //Assert
            result
            .Should()
            .BeOfType <InternalServerErrorResult>()
            .Which
            .Value
            .Should()
            .Be($"Exception occurred writing json file: {jsonFile} to cosmos db");

            logger
            .Received(1)
            .Error(Arg.Any <Exception>(), Arg.Is($"Exception occurred writing json file: {jsonFile} to cosmos db"));
        }
        public async Task SaveDefinition_GivenValidJsonButSavingReturns400_ReturnsStatusCodeResult400()
        {
            //Arrange
            string yaml = JsonConvert.SerializeObject(new JobDefinition());

            byte[]       byteArray = Encoding.UTF8.GetBytes(yaml);
            MemoryStream stream    = new MemoryStream(byteArray);

            IHeaderDictionary headerDictionary = new HeaderDictionary();

            headerDictionary
            .Add("json-file", new StringValues(jsonFile));

            HttpRequest request = Substitute.For <HttpRequest>();

            request
            .Headers
            .Returns(headerDictionary);

            request
            .Body
            .Returns(stream);

            ILogger logger = CreateLogger();

            IJobDefinitionsRepository jobDefinitionsRepository = CreateJobDefinitionsRepository();

            jobDefinitionsRepository
            .SaveJobDefinition(Arg.Any <JobDefinition>())
            .Returns(HttpStatusCode.BadRequest);

            JobDefinitionsService jobDefinitionsService = CreateJobDefinitionService(logger: logger, jobDefinitionsRepository: jobDefinitionsRepository);

            //Act
            IActionResult result = await jobDefinitionsService.SaveDefinition(request);

            //Assert
            result
            .Should()
            .BeOfType <StatusCodeResult>()
            .Which
            .StatusCode
            .Should()
            .Be(400);

            logger
            .Received(1)
            .Error(Arg.Is($"Failed to save json file: {jsonFile} to cosmos db with status 400"));
        }
Exemplo n.º 7
0
        public JobDefinitionsService(IJobDefinitionsRepository jobDefinitionsRepository,
                                     ILogger logger, IJobsResiliencePolicies resiliencePolicies, ICacheProvider cacheProvider)
        {
            Guard.ArgumentNotNull(jobDefinitionsRepository, nameof(jobDefinitionsRepository));
            Guard.ArgumentNotNull(logger, nameof(logger));
            Guard.ArgumentNotNull(resiliencePolicies, nameof(resiliencePolicies));
            Guard.ArgumentNotNull(cacheProvider, nameof(cacheProvider));

            _jobDefinitionsRepository = jobDefinitionsRepository;
            _logger = logger;
            _jobDefinitionsRepositoryPolicy         = resiliencePolicies.JobDefinitionsRepository;
            _jobDefinitionsRepositoryNonAsyncPolicy = resiliencePolicies.JobRepositoryNonAsync;
            _cacheProvider = cacheProvider;
            _cachePolicy   = resiliencePolicies.CacheProviderPolicy;
        }
        public async Task SaveDefinition_GivenJsonSavesOK_ReturnsNoContentResult()
        {
            //Arrange
            string yaml = JsonConvert.SerializeObject(new JobDefinition());

            byte[]       byteArray = Encoding.UTF8.GetBytes(yaml);
            MemoryStream stream    = new MemoryStream(byteArray);

            IHeaderDictionary headerDictionary = new HeaderDictionary();

            headerDictionary
            .Add("json-file", new StringValues(jsonFile));

            HttpRequest request = Substitute.For <HttpRequest>();

            request
            .Headers
            .Returns(headerDictionary);

            request
            .Body
            .Returns(stream);

            ILogger logger = CreateLogger();

            IJobDefinitionsRepository jobDefinitionsRepository = CreateJobDefinitionsRepository();

            jobDefinitionsRepository
            .SaveJobDefinition(Arg.Any <JobDefinition>())
            .Returns(HttpStatusCode.OK);

            ICacheProvider cacheProvider = CreateCacheProvider();

            JobDefinitionsService jobDefinitionsService = CreateJobDefinitionService(logger: logger, jobDefinitionsRepository: jobDefinitionsRepository, cacheProvider: cacheProvider);

            //Act
            IActionResult result = await jobDefinitionsService.SaveDefinition(request);

            //Assert
            result
            .Should()
            .BeOfType <NoContentResult>();

            await
            cacheProvider
            .Received(1)
            .RemoveAsync <List <JobDefinition> >(Arg.Is(CacheKeys.JobDefinitions));
        }
        public JobDefinitionValidator(IJobDefinitionsRepository jobDefinitions,
                                      IJobsResiliencePolicies resiliencePolicies)
        {
            Guard.ArgumentNotNull(jobDefinitions, nameof(jobDefinitions));
            Guard.ArgumentNotNull(resiliencePolicies?.JobDefinitionsRepository, nameof(resiliencePolicies.JobDefinitionsRepository));

            RuleFor(_ => _)
            .Custom((jobDefinition, ctx) =>
            {
                string jobDefinitionId = jobDefinition.Id;

                if (jobDefinitionId.IsNullOrWhitespace())
                {
                    ctx.AddFailure(nameof(JobDefinition.Id), "You must supply a job definition id");
                }
            });
        }
Exemplo n.º 10
0
        public JobDefinitionsService(IJobDefinitionsRepository jobDefinitionsRepository,
                                     ILogger logger,
                                     IJobsResiliencePolicies resiliencePolicies,
                                     ICacheProvider cacheProvider,
                                     IValidator <JobDefinition> validator)
        {
            Guard.ArgumentNotNull(jobDefinitionsRepository, nameof(jobDefinitionsRepository));
            Guard.ArgumentNotNull(logger, nameof(logger));
            Guard.ArgumentNotNull(resiliencePolicies, nameof(resiliencePolicies));
            Guard.ArgumentNotNull(cacheProvider, nameof(cacheProvider));
            Guard.ArgumentNotNull(resiliencePolicies?.JobDefinitionsRepository, nameof(resiliencePolicies.JobDefinitionsRepository));
            Guard.ArgumentNotNull(resiliencePolicies?.CacheProviderPolicy, nameof(resiliencePolicies.CacheProviderPolicy));
            Guard.ArgumentNotNull(validator, nameof(validator));

            _jobDefinitionsRepository = jobDefinitionsRepository;
            _logger = logger;
            _jobDefinitionsRepositoryPolicy = resiliencePolicies.JobDefinitionsRepository;
            _cacheProvider = cacheProvider;
            _validator     = validator;
            _cachePolicy   = resiliencePolicies.CacheProviderPolicy;
        }
        public async Task GetAllJobDefinitions_GivenNotInCacheButFoundInCosmoshe_ReturnsAndSetsInCache()
        {
            //Arrange
            List <JobDefinition> jobDefinitions = new List <JobDefinition>
            {
                new JobDefinition()
            };

            ICacheProvider cacheProvider = CreateCacheProvider();

            cacheProvider
            .GetAsync <List <JobDefinition> >(Arg.Is(CacheKeys.JobDefinitions))
            .Returns((List <JobDefinition>)null);

            IJobDefinitionsRepository jobDefinitionsRepository = CreateJobDefinitionsRepository();

            jobDefinitionsRepository
            .GetJobDefinitions()
            .Returns(jobDefinitions);

            JobDefinitionsService jobDefinitionsService = CreateJobDefinitionService(jobDefinitionsRepository, resiliencePolicies: GenerateTestPolicies(), cacheProvider: cacheProvider);

            //Act
            IEnumerable <JobDefinition> definitions = await jobDefinitionsService.GetAllJobDefinitions();

            //Assert
            definitions
            .Count()
            .Should()
            .Be(1);

            await
            cacheProvider
            .Received(1)
            .SetAsync(Arg.Is(CacheKeys.JobDefinitions), Arg.Any <List <JobDefinition> >());
        }