async public Task SaveFundingStream_GivenValidJsonAndSaveWasSuccesful_ReturnsOK() { //Arrange ILogger logger = CreateLogger(); HttpStatusCode statusCode = HttpStatusCode.Created; IPolicyRepository policyRepository = CreatePolicyRepository(); policyRepository .SaveFundingStream(Arg.Any <FundingStream>()) .Returns(statusCode); FundingStreamService fundingStreamsService = CreateFundingStreamService(logger: logger, policyRepository: policyRepository); //Act IActionResult result = await fundingStreamsService.SaveFundingStream(CreateFundingStreamSaveModel()); //Assert result .Should() .BeOfType <OkResult>(); logger .Received(1) .Information(Arg.Is($"Successfully saved file to cosmos db")); }
public async Task GetAllFundingStreams_GivenNullOrEmptyFundingStreamsReturned_LogsAndReturnsOKWithEmptyList() { ILogger logger = CreateLogger(); IEnumerable <FundingStream> fundingStreams = null; IPolicyRepository policyRepository = CreatePolicyRepository(); policyRepository .GetFundingStreams() .Returns(fundingStreams); FundingStreamService fundingStreamService = CreateFundingStreamService(logger: logger, policyRepository: policyRepository); IEnumerable <FundingStream> result = await fundingStreamService.GetAllFundingStreams(); result .Should() .BeOfType <FundingStream[]>() .Which .Should() .AllBeEquivalentTo(fundingStreams); logger .Received(1) .Error(Arg.Is("No funding streams were returned")); }
public async Task GetFundingStreams_GivenNullOrEmptyFundingStreamsReturned_LogsAndReturnsOKWithEmptyList() { // Arrange ILogger logger = CreateLogger(); IEnumerable <FundingStream> fundingStreams = null; IPolicyRepository policyRepository = CreatePolicyRepository(); policyRepository .GetFundingStreams() .Returns(fundingStreams); FundingStreamService fundingStreamsService = CreateFundingStreamService(logger: logger, policyRepository: policyRepository); // Act IActionResult result = await fundingStreamsService.GetFundingStreams(); // Assert result .Should() .BeOfType <OkObjectResult>(); OkObjectResult objectResult = result as OkObjectResult; IEnumerable <FundingStream> values = objectResult.Value as IEnumerable <FundingStream>; values .Should() .NotBeNull(); logger .Received(1) .Error(Arg.Is("No funding streams were returned")); }
async public Task SaveFundingStream_GivenValidJsonButSavingToDatabaseThrowsException_ReturnsInternalServerError() { //Arrange ILogger logger = CreateLogger(); IPolicyRepository policyRepository = CreatePolicyRepository(); policyRepository .When(x => x.SaveFundingStream(Arg.Any <FundingStream>())) .Do(x => { throw new Exception(); }); FundingStreamService fundingStreamsService = CreateFundingStreamService(logger: logger, policyRepository: policyRepository); string expectedErrorMessage = $"Exception occurred writing to json file to cosmos db"; //Act IActionResult result = await fundingStreamsService.SaveFundingStream(CreateFundingStreamSaveModel()); //Assert result .Should() .BeOfType <InternalServerErrorResult>() .Which .Value .Should() .Be(expectedErrorMessage); logger .Received(1) .Error(Arg.Any <Exception>(), Arg.Is(expectedErrorMessage)); }
public async Task GetFundingStreamById_GivenFundingStreamnWasNotFound_ReturnsNotFound() { // Arrange const string fundingStreamId = "fs-1"; ILogger logger = CreateLogger(); IPolicyRepository policyRepository = CreatePolicyRepository(); policyRepository .GetFundingStreamById(Arg.Is(fundingStreamId)) .Returns((FundingStream)null); FundingStreamService fundingStreamsService = CreateFundingStreamService(logger: logger, policyRepository: policyRepository); // Act IActionResult result = await fundingStreamsService.GetFundingStreamById(fundingStreamId); // Assert result .Should() .BeOfType <NotFoundResult>(); logger .Received(1) .Error(Arg.Is($"No funding stream was found for funding stream id : {fundingStreamId}")); }
async public Task SaveFundingStream_GivenValidJsonButFailedToSaveToDatabase_ReturnsStatusCode() { //Arrange ILogger logger = CreateLogger(); HttpStatusCode failedCode = HttpStatusCode.BadGateway; IPolicyRepository policyRepository = CreatePolicyRepository(); policyRepository .SaveFundingStream(Arg.Any <FundingStream>()) .Returns(failedCode); FundingStreamService fundingStreamsService = CreateFundingStreamService(logger: logger, policyRepository: policyRepository); //Act IActionResult result = await fundingStreamsService.SaveFundingStream(CreateFundingStreamSaveModel()); //Assert result .Should() .BeOfType <StatusCodeResult>(); StatusCodeResult statusCodeResult = (StatusCodeResult)result; statusCodeResult .StatusCode .Should() .Be(502); logger .Received(1) .Error(Arg.Is($"Failed to save to cosmos db with status 502")); }
public async Task GetFundingStreamById__GivenFundingStreamWasFound_ReturnsSuccess() { // Arrange const string fundingStreamId = "fs-1"; FundingStream fundingStream = new FundingStream { Id = fundingStreamId, Name = "Funding Stream Name", ShortName = "FSN", }; IPolicyRepository policyRepository = CreatePolicyRepository(); policyRepository .GetFundingStreamById(Arg.Is(fundingStreamId)) .Returns(fundingStream); FundingStreamService fundingStreamsService = CreateFundingStreamService(policyRepository: policyRepository); // Act IActionResult result = await fundingStreamsService.GetFundingStreamById(fundingStreamId); // Assert result .Should() .BeOfType <OkObjectResult>() .Which .Value .Should() .Be(fundingStream); }
public void Initialize() { _fundingStreamId = NewRandomString(); _fundingStreamName = NewRandomString(); _fundingPeriodId = NewRandomString(); _fundingPeriodName = NewRandomString(); _fundingPeriodDefaultTemplateVersion = NewRandomString(); _majorVersion = NewRandomInteger(); _minorVersion = NewRandomInteger(); _policiesApiClient = Substitute.For <IPoliciesApiClient>(); _mapper = new MapperConfiguration(_ => { _.AddProfile <ExternalServiceMappingProfile>(); }).CreateMapper(); _fundingStreamService = new FundingStreamService( _policiesApiClient, new ExternalApiResiliencePolicies { PoliciesApiClientPolicy = Polly.Policy.NoOpAsync() }, _mapper ); }
public async Task GetFundingStream_WhenFundingStreamFound_ShouldReturnOkResult() { // Arrange string fundingStreamId = "PSG"; Models.Specs.FundingStream fundingStream = new Models.Specs.FundingStream { Id = fundingStreamId, Name = "PE and Sport Grant", RequireFinancialEnvelopes = true }; Mapper.Reset(); MapperConfigurationExpression mappings = new MapperConfigurationExpression(); mappings.AddProfile <ExternalApiMappingProfile>(); Mapper.Initialize(mappings); IMapper mapper = Mapper.Instance; IFundingService mockFundingService = Substitute.For <IFundingService>(); mockFundingService .GetFundingStreamById(Arg.Is(fundingStreamId)) .Returns(new OkObjectResult(fundingStream)); FundingStreamService fundingStreamService = new FundingStreamService(mockFundingService, mapper); // Act IActionResult result = await fundingStreamService.GetFundingStream(fundingStreamId); // Assert OkObjectResult okResult = result .Should() .BeOfType <OkObjectResult>() .Subject; FundingStream actualFundingStream = okResult.Value .Should() .BeOfType <FundingStream>() .Subject; actualFundingStream.Id.Should().Be(fundingStreamId); actualFundingStream.Name.Should().Be(fundingStream.Name); actualFundingStream.RequireFinancialEnvelopes.Should().Be(fundingStream.RequireFinancialEnvelopes); }
async public Task SaveFundingStream_GivenNoJsonWasProvidedButFileNameWas_ReturnsBadRequest() { //Arrange ILogger logger = CreateLogger(); FundingStreamService fundingStreamsService = CreateFundingStreamService(logger: logger); //Act IActionResult result = await fundingStreamsService.SaveFundingStream(null); //Assert result .Should() .BeOfType <BadRequestObjectResult>(); logger .Received(1) .Error(Arg.Is($"Null or empty json provided for file")); }
public async Task GetFundingStreams_GivenFundingStreamsAlreadyInCache_ReturnsOKWithResultsFromCachel() { // Arrange ILogger logger = CreateLogger(); IEnumerable <FundingStream> fundingStreams = new[] { new FundingStream(), new FundingStream() }; ICacheProvider cacheProvider = CreateCacheProvider(); cacheProvider .GetAsync <FundingStream[]>(Arg.Is(CacheKeys.AllFundingStreams)) .Returns(fundingStreams.ToArray()); IPolicyRepository policyRepository = CreatePolicyRepository(); FundingStreamService fundingStreamsService = CreateFundingStreamService(logger, cacheProvider, policyRepository); // Act IActionResult result = await fundingStreamsService.GetFundingStreams(); // Assert result .Should() .BeOfType <OkObjectResult>(); OkObjectResult objectResult = result as OkObjectResult; IEnumerable <FundingStream> values = objectResult.Value as IEnumerable <FundingStream>; values .Should() .HaveCount(2); await policyRepository .DidNotReceive() .GetFundingStreams(); }
public async Task GetFundingStreams_GivenFundingStreamsReturned_ReturnsOKWithResults() { // Arrange ILogger logger = CreateLogger(); IEnumerable <FundingStream> fundingStreams = new[] { new FundingStream(), new FundingStream() }; IPolicyRepository policyRepository = CreatePolicyRepository(); policyRepository .GetFundingStreams() .Returns(fundingStreams); ICacheProvider cacheProvider = CreateCacheProvider(); FundingStreamService fundingStreamsService = CreateFundingStreamService(logger, cacheProvider, policyRepository); // Act IActionResult result = await fundingStreamsService.GetFundingStreams(); // Assert result .Should() .BeOfType <OkObjectResult>(); OkObjectResult objectResult = result as OkObjectResult; IEnumerable <FundingStream> values = objectResult.Value as IEnumerable <FundingStream>; values .Should() .HaveCount(2); await cacheProvider .Received(1) .SetAsync <FundingStream[]>(Arg.Is(CacheKeys.AllFundingStreams), Arg.Is <FundingStream[]>(m => m.SequenceEqual(fundingStreams))); }
public async Task GetFundingStreams_WhenfundingStreamIsEmpty_ShouldReturnInternalServerErrorMessage() { // Arrange IMapper mapper = Substitute.For <IMapper>(); OkObjectResult specServiceOkObjectResult = new OkObjectResult(new List <Models.Specs.FundingStream>()); IFundingService mockFundingService = Substitute.For <IFundingService>(); mockFundingService.GetFundingStreams().Returns(specServiceOkObjectResult); FundingStreamService fundingStreamService = new FundingStreamService(mockFundingService, mapper); // Act IActionResult result = await fundingStreamService.GetFundingStreams(); // Assert result .Should().BeOfType <OkResult>(); }
public async Task GetFundingStreamById_GivenFundingStreamIdDoesNotExist_ReturnsBadRequest(string fundingStreamId) { // Arrange ILogger logger = CreateLogger(); FundingStreamService fundingStreamsService = CreateFundingStreamService(logger: logger); // Act IActionResult result = await fundingStreamsService.GetFundingStreamById(fundingStreamId); // Assert result .Should() .BeOfType <BadRequestObjectResult>() .Which .Value .Should() .Be("Null or empty funding stream Id provided"); logger .Received(1) .Error(Arg.Is("No funding stream Id was provided to GetFundingStreamById")); }
public async Task GetFundingStream_WhenFundingStreamNotFound_ShouldReturnNotFoundResult() { // Arrange string fundingStreamId = "unknown"; IMapper mapper = Substitute.For <IMapper>(); IFundingService mockFundingService = Substitute.For <IFundingService>(); mockFundingService .GetFundingStreamById(Arg.Is(fundingStreamId)) .Returns(new NotFoundResult()); FundingStreamService fundingStreamService = new FundingStreamService(mockFundingService, mapper); // Act IActionResult result = await fundingStreamService.GetFundingStream(fundingStreamId); // Assert result .Should() .BeOfType <NotFoundResult>(); }
public async Task GetFundingStreams_WhenServiceReturnsOkResult_ShouldReturnOkResultWithFundingStreams() { Models.Specs.FundingStream fundingStream = new Models.Specs.FundingStream() { AllocationLines = new List <Models.Specs.AllocationLine>() { new Models.Specs.AllocationLine() { Id = "id", Name = "name", ShortName = "short-name", FundingRoute = Models.Specs.FundingRoute.LA, IsContractRequired = true } }, Name = "name", Id = "id", ShortName = "short-name", RequireFinancialEnvelopes = true, PeriodType = new Models.Specs.PeriodType { Id = "p1", Name = "period 1", StartDay = 1, EndDay = 31, StartMonth = 8, EndMonth = 7 } }; Mapper.Reset(); MapperConfigurationExpression mappings = new MapperConfigurationExpression(); mappings.AddProfile <ExternalApiMappingProfile>(); Mapper.Initialize(mappings); IMapper mapper = Mapper.Instance; OkObjectResult specServiceOkObjectResult = new OkObjectResult(new[] { fundingStream }); IFundingService mockFundingService = Substitute.For <IFundingService>(); mockFundingService.GetFundingStreams().Returns(specServiceOkObjectResult); FundingStreamService fundingStreamService = new FundingStreamService(mockFundingService, mapper); // Act IActionResult result = await fundingStreamService.GetFundingStreams(); // Assert result .Should().NotBeNull() .And .Subject.Should().BeOfType <OkObjectResult>(); OkObjectResult okObjectResult = result as OkObjectResult; IEnumerable <FundingStream> fundingStreamResults = okObjectResult.Value as IEnumerable <FundingStream>; fundingStreamResults.Count().Should().Be(1); fundingStreamResults.First().Name.Should().Be("name"); fundingStreamResults.First().Id.Should().Be("id"); fundingStreamResults.First().ShortName.Should().Be("short-name"); fundingStreamResults.First().RequireFinancialEnvelopes.Should().BeTrue(); fundingStreamResults.First().PeriodType.Id.Should().Be("p1"); fundingStreamResults.First().PeriodType.Name.Should().Be("period 1"); fundingStreamResults.First().PeriodType.StartDay.Should().Be(1); fundingStreamResults.First().PeriodType.StartMonth.Should().Be(8); fundingStreamResults.First().PeriodType.EndDay.Should().Be(31); fundingStreamResults.First().PeriodType.EndMonth.Should().Be(7); fundingStreamResults.First().AllocationLines.First().Id.Should().Be("id"); fundingStreamResults.First().AllocationLines.First().Name.Should().Be("name"); fundingStreamResults.First().AllocationLines.First().ShortName.Should().Be("short-name"); fundingStreamResults.First().AllocationLines.First().FundingRoute.Should().Be("LA"); fundingStreamResults.First().AllocationLines.First().ContractRequired.Should().Be("Y"); }