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