public void Validate_GivenProviderVersionIdDoesntExist_ValidIsFalse()
        {
            //Arrange
            SpecificationEditModel model = CreateModel();

            model.SpecificationId = "specId";

            IProvidersApiClient providersApiClient = CreateProviderApiClient(HttpStatusCode.NotFound);

            SpecificationEditModelValidator validator = CreateValidator(providersApiClient: providersApiClient);

            //Act
            ValidationResult result = validator.Validate(model);

            //Assert
            result
            .IsValid
            .Should()
            .BeFalse();

            result
            .Errors.Select(x => x.PropertyName == "ProviderVersionId" && x.ErrorMessage == "Provider version id selected does not exist")
            .Count()
            .Should()
            .Be(1);
        }
        public void Validate_GivenEmptyDescription_ValidIsTrue()
        {
            //Arrange
            SpecificationEditModel model = CreateModel();

            model.Description     = string.Empty;
            model.SpecificationId = "specId";

            SpecificationEditModelValidator validator = CreateValidator();

            //Act
            ValidationResult result = validator.Validate(model);

            //Assert
            result
            .IsValid
            .Should()
            .BeTrue();

            result
            .Errors
            .Count
            .Should()
            .Be(0);
        }
        public void Validate_GivenCoreProviderVersionUpdatesUseLatestForNonFDZProviderSource_ValidIsFalse()
        {
            //Arrange
            SpecificationEditModel model = CreateModel();

            model.SpecificationId            = "specId";
            model.CoreProviderVersionUpdates = CoreProviderVersionUpdates.UseLatest;

            ISpecificationsRepository repository        = CreateSpecificationsRepository();
            IPoliciesApiClient        policiesApiClient = CreatePoliciesApiClient(providerSource: ProviderSource.CFS);

            SpecificationEditModelValidator validator = CreateValidator(repository, policiesApiClient: policiesApiClient);

            //Act
            ValidationResult result = validator.Validate(model);

            //Assert
            result
            .IsValid
            .Should()
            .BeFalse();

            result
            .Errors
            .Count
            .Should()
            .Be(1);

            result
            .Errors.Select(x => x.ErrorMessage)
            .Should()
            .Contain("CoreProviderVersionUpdates - UseLatest is not valid for provider source - CFS");
        }
Ejemplo n.º 4
0
        public void EditSpecification_GivenProviderVersionChangesAndRegenerateScopedProvidersFails_ExceptionThrown()
        {
            //Arrange
            var existingFundingStreams = _specification.Current.FundingStreams;
            SpecificationEditModel specificationEditModel = new SpecificationEditModel
            {
                FundingPeriodId = "fp10",
                Name            = "new spec name"
            };

            PolicyModels.FundingStream fundingStream = new PolicyModels.FundingStream
            {
                Id = existingFundingStreams.First().Id
            };
            Models.Specs.SpecificationVersion newSpecVersion = _specification.Current.Clone() as Models.Specs.SpecificationVersion;
            newSpecVersion.Name             = specificationEditModel.Name;
            newSpecVersion.FundingPeriod.Id = specificationEditModel.FundingPeriodId;
            newSpecVersion.FundingStreams   = new[] { new Reference {
                                                          Id = "fs11"
                                                      } };
            newSpecVersion.ProviderVersionId = "Provider version 2";

            _providersApiClient.RegenerateProviderSummariesForSpecification(_specification.Id, true)
            .Returns(new ApiResponse <bool>(HttpStatusCode.BadRequest));

            var service = CreateSpecificationsService(newSpecVersion);

            //Act
            Func <Task> invocation = async() => await service.EditSpecification(SpecificationId, specificationEditModel, null, null);

            //Arrange
            invocation.Should()
            .Throw <RetriableException>()
            .WithMessage($"Unable to re-generate scoped providers while editing specification '{_specification.Id}' with status code: {HttpStatusCode.BadRequest}");
        }
        public void Validate_GivenEmptyProviderVersionId_ValidIsFalse()
        {
            //Arrange
            SpecificationEditModel model = CreateModel();

            model.ProviderVersionId = string.Empty;
            model.SpecificationId   = "specId";

            SpecificationEditModelValidator validator = CreateValidator();

            //Act
            ValidationResult result = validator.Validate(model);

            //Assert
            result
            .IsValid
            .Should()
            .BeFalse();

            result
            .Errors.Select(x => x.PropertyName == "ProviderVersionId" && x.ErrorCode == "NotEmptyValidator")
            .Count()
            .Should()
            .Be(1);
        }
        public void Validate_GivenEmptyFundingPeriodId_ValidIsFalse()
        {
            //Arrange
            SpecificationEditModel model = CreateModel();

            model.FundingPeriodId = string.Empty;
            model.SpecificationId = "specId";

            SpecificationEditModelValidator validator = CreateValidator();

            //Act
            ValidationResult result = validator.Validate(model);

            //Assert
            result
            .IsValid
            .Should()
            .BeFalse();

            result
            .Errors
            .Count
            .Should()
            .Be(1);
        }
Ejemplo n.º 7
0
        public async Task EditSpecification_WhenInvalidModelProvided_ThenValidationErrorReturned()
        {
            // Arrange
            ValidationResult validationResult = new ValidationResult();

            validationResult.Errors.Add(new ValidationFailure("error", "error"));

            IValidator <SpecificationEditModel> validator = CreateEditSpecificationValidator(validationResult);

            SpecificationsService specificationsService = CreateService(specificationEditModelValidator: validator);

            SpecificationEditModel specificationEditModel = new SpecificationEditModel();

            string json = JsonConvert.SerializeObject(specificationEditModel);

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

            HttpContext context = Substitute.For <HttpContext>();

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

            IQueryCollection queryStringValues = new QueryCollection(new Dictionary <string, StringValues>
            {
                { "specificationId", new StringValues(SpecificationId) },
            });

            request
            .Query
            .Returns(queryStringValues);
            request
            .Body
            .Returns(stream);

            request
            .HttpContext
            .Returns(context);

            // Act
            IActionResult result = await specificationsService.EditSpecification(request);

            // Assert
            result
            .Should()
            .BeOfType <BadRequestObjectResult>()
            .Which
            .Value
            .Should()
            .BeOfType <SerializableError>()
            .Which
            .Should()
            .HaveCount(1);

            await validator
            .Received(1)
            .ValidateAsync(Arg.Any <SpecificationEditModel>());
        }
Ejemplo n.º 8
0
        public async Task EditSpecification_GivenSpecificationWasfoundAndFundingPeriodChangedButFailedToGetFundingPeriodsFromCosmos_ReturnsPreConditionFailedresult()
        {
            //Arrange
            SpecificationEditModel specificationEditModel = new SpecificationEditModel
            {
                FundingPeriodId = "fp10"
            };

            string json = JsonConvert.SerializeObject(specificationEditModel);

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

            HttpContext context = Substitute.For <HttpContext>();

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

            IQueryCollection queryStringValues = new QueryCollection(new Dictionary <string, StringValues>
            {
                { "specificationId", new StringValues(SpecificationId) },
            });

            request
            .Query
            .Returns(queryStringValues);
            request
            .Body
            .Returns(stream);

            request
            .HttpContext
            .Returns(context);

            ILogger logger = CreateLogger();

            Specification specification = CreateSpecification();

            ISpecificationsRepository specificationsRepository = CreateSpecificationsRepository();

            specificationsRepository
            .GetSpecificationById(Arg.Is(SpecificationId))
            .Returns(specification);

            SpecificationsService service = CreateService(logs: logger, specificationsRepository: specificationsRepository);

            //Act
            IActionResult result = await service.EditSpecification(request);

            //Arrange
            result
            .Should()
            .BeOfType <PreconditionFailedResult>()
            .Which
            .Value
            .Should()
            .Be($"Unable to find funding period with ID '{specificationEditModel.FundingPeriodId}'.");
        }
Ejemplo n.º 9
0
        public async Task EditSpecification_GivenSpecificationWasNotFound_ReturnsNotFoundResult()
        {
            //Arrange
            SpecificationEditModel specificationEditModel = new SpecificationEditModel();

            string json = JsonConvert.SerializeObject(specificationEditModel);

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

            HttpContext context = Substitute.For <HttpContext>();

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

            IQueryCollection queryStringValues = new QueryCollection(new Dictionary <string, StringValues>
            {
                { "specificationId", new StringValues(SpecificationId) },
            });

            request
            .Query
            .Returns(queryStringValues);
            request
            .Body
            .Returns(stream);

            request
            .HttpContext
            .Returns(context);

            ILogger logger = CreateLogger();

            ISpecificationsRepository specificationsRepository = CreateSpecificationsRepository();

            specificationsRepository
            .GetSpecificationById(Arg.Is(SpecificationId))
            .Returns((Specification)null);

            SpecificationsService service = CreateService(logs: logger, specificationsRepository: specificationsRepository);

            //Act
            IActionResult result = await service.EditSpecification(request);

            //Arrange
            result
            .Should()
            .BeOfType <NotFoundObjectResult>()
            .Which
            .Value
            .Should()
            .Be("Specification not found");

            logger
            .Received(1)
            .Warning(Arg.Is($"Failed to find specification for id: {SpecificationId}"));
        }
Ejemplo n.º 10
0
        public async Task EditSpecification_GivenChangesAndSpecContainsCalculations_UpdatesSearchAndSendsMessage()
        {
            //Arrange
            SpecificationEditModel specificationEditModel = new SpecificationEditModel
            {
                FundingPeriodId   = "fp10",
                Name              = "new spec name",
                ProviderVersionId = _specification.Current.ProviderVersionId
            };

            Models.Specs.SpecificationVersion newSpecVersion = _specification.Current.Clone() as Models.Specs.SpecificationVersion;
            newSpecVersion.Name             = specificationEditModel.Name;
            newSpecVersion.FundingPeriod.Id = specificationEditModel.FundingPeriodId;
            newSpecVersion.FundingStreams   = new[] { new Reference {
                                                          Id = "fs11"
                                                      } };
            _versionRepository
            .CreateVersion(Arg.Any <Models.Specs.SpecificationVersion>(), Arg.Any <Models.Specs.SpecificationVersion>())
            .Returns(newSpecVersion);

            AndGetFundingConfiguration(
                _specification.Current.FundingStreams.FirstOrDefault().Id,
                specificationEditModel.FundingPeriodId);

            var service = CreateSpecificationsService(newSpecVersion);

            //Act
            IActionResult result = await service.EditSpecification(SpecificationId, specificationEditModel, null, null);

            //Assert
            await _specificationIndexer
            .Received(1)
            .Index(Arg.Is <Specification>(_ => ReferenceEquals(_.Current, newSpecVersion)));

            await
            _cacheProvider
            .Received(1)
            .RemoveAsync <SpecificationSummary>(Arg.Is($"{CacheKeys.SpecificationSummaryById}{_specification.Id}"));

            await
            _messengerService
            .Received(1)
            .SendToTopic(Arg.Is(ServiceBusConstants.TopicNames.EditSpecification),
                         Arg.Is <SpecificationVersionComparisonModel>(
                             m => m.Id == SpecificationId &&
                             m.Current.Name == "new spec name" &&
                             m.Previous.Name == "Spec name"
                             ), Arg.Any <IDictionary <string, string> >(), Arg.Is(true));

            await
            _versionRepository
            .Received(1)
            .SaveVersion(Arg.Is(newSpecVersion));
        }
Ejemplo n.º 11
0
        public async Task EditSpecification_GivenProviderVersionChanges_CallsRegenerateScopedProviders()
        {
            //Arrange
            SpecificationEditModel specificationEditModel = new SpecificationEditModel
            {
                FundingPeriodId = "fp10",
                Name            = "new spec name"
            };

            Models.Specs.SpecificationVersion newSpecVersion = _specification.Current.Clone() as Models.Specs.SpecificationVersion;
            newSpecVersion.Name             = specificationEditModel.Name;
            newSpecVersion.FundingPeriod.Id = specificationEditModel.FundingPeriodId;
            newSpecVersion.FundingStreams   = new[] { new Reference {
                                                          Id = "fs11"
                                                      } };
            newSpecVersion.ProviderVersionId = "Provider version 2";

            _providersApiClient.RegenerateProviderSummariesForSpecification(_specification.Id, true)
            .Returns(new ApiResponse <bool>(HttpStatusCode.OK, true));

            AndGetFundingConfiguration(
                _specification.Current.FundingStreams.FirstOrDefault().Id,
                specificationEditModel.FundingPeriodId);

            SpecificationsService service = CreateSpecificationsService(newSpecVersion);

            //Act
            IActionResult result = await service.EditSpecification(SpecificationId, specificationEditModel, null, null);

            await _specificationIndexer
            .Received(1)
            .Index(Arg.Is <Specification>(_ => ReferenceEquals(_.Current, newSpecVersion)));

            await
            _cacheProvider
            .Received(1)
            .RemoveAsync <SpecificationSummary>(Arg.Is($"{CacheKeys.SpecificationSummaryById}{_specification.Id}"));

            await
            _messengerService
            .Received(1)
            .SendToTopic(Arg.Is(ServiceBusConstants.TopicNames.EditSpecification),
                         Arg.Is <SpecificationVersionComparisonModel>(
                             m => m.Id == SpecificationId &&
                             m.Current.Name == "new spec name" &&
                             m.Previous.Name == "Spec name"
                             ), Arg.Any <IDictionary <string, string> >(), Arg.Is(true));

            await
            _versionRepository
            .Received(1)
            .SaveVersion(Arg.Is(newSpecVersion));
        }
Ejemplo n.º 12
0
        public async Task EditSpecification_GivenFailsToUpdateCosmosWithBadRequest_ReturnsBadRequest()
        {
            //Arrange
            IEnumerable <Reference> existingFundingStreams = _specification.Current.FundingStreams;
            SpecificationEditModel  specificationEditModel = new SpecificationEditModel
            {
                FundingPeriodId   = "fp10",
                ProviderVersionId = _specification.Current.ProviderVersionId
            };

            PolicyModels.FundingStream fundingStream = new PolicyModels.FundingStream
            {
                Id   = existingFundingStreams.First().Id,
                Name = existingFundingStreams.First().Name
            };
            ApiResponse <PolicyModels.FundingStream> fundingStreamResponse =
                new ApiResponse <PolicyModels.FundingStream>(HttpStatusCode.OK, fundingStream);

            _specificationsRepository
            .GetSpecificationById(Arg.Is(SpecificationId))
            .Returns(_specification);
            _policiesApiClient
            .GetFundingPeriodById(Arg.Is(_fundingPeriod.Id))
            .Returns(_fundingPeriodResponse);
            _policiesApiClient
            .GetFundingStreamById(Arg.Is(fundingStream.Id))
            .Returns(fundingStreamResponse);
            _specificationsRepository
            .UpdateSpecification(Arg.Any <Specification>())
            .Returns(HttpStatusCode.BadRequest);

            AndGetFundingConfiguration(
                _specification.Current.FundingStreams.FirstOrDefault().Id,
                specificationEditModel.FundingPeriodId);

            SpecificationsService service = CreateService(mapper: _mapper, logs: _logger, specificationsRepository: _specificationsRepository, policiesApiClient: _policiesApiClient);

            //Act
            IActionResult result = await service.EditSpecification(SpecificationId, specificationEditModel, null, null);

            //Assert
            result
            .Should()
            .BeOfType <StatusCodeResult>()
            .Which
            .StatusCode
            .Should()
            .Be(400);
        }
Ejemplo n.º 13
0
        public async Task EditSpecification_GivenSetLatestProviderVersionChangesFromManualToUseLatest_InstructToQueueProviderSnapshotDataLoadJob()
        {
            //Arrange
            _specification.Current.CoreProviderVersionUpdates = CoreProviderVersionUpdates.Manual;
            SpecificationEditModel specificationEditModel = new SpecificationEditModel
            {
                FundingPeriodId            = "fp10",
                Name                       = "new spec name",
                ProviderVersionId          = _specification.Current.ProviderVersionId,
                AssignedTemplateIds        = new Dictionary <string, string>(),
                CoreProviderVersionUpdates = CoreProviderVersionUpdates.UseLatest
            };
            Reference user = new Reference();

            SpecificationVersion newSpecVersion = _specification.Current.DeepCopy(useCamelCase: false);

            newSpecVersion.Name             = specificationEditModel.Name;
            newSpecVersion.FundingPeriod.Id = specificationEditModel.FundingPeriodId;
            newSpecVersion.FundingStreams   = new[] { new Reference {
                                                          Id = "fs11"
                                                      } };
            newSpecVersion.FundingPeriod.Name = "p10";
            newSpecVersion.Author             = user;
            newSpecVersion.Description        = specificationEditModel.Description;

            string specFundingStreamId = _specification.Current.FundingStreams.FirstOrDefault().Id;

            AndGetFundingConfiguration(
                specFundingStreamId,
                specificationEditModel.FundingPeriodId);

            _providersApiClient.GetCurrentProviderMetadataForFundingStream(specFundingStreamId)
            .Returns(new ApiResponse <CurrentProviderVersionMetadata>(HttpStatusCode.NotFound, null));

            SpecificationsService service = CreateSpecificationsService(newSpecVersion);

            string correlationId = NewRandomString();

            //Act
            IActionResult result = await service.EditSpecification(SpecificationId, specificationEditModel, user, correlationId);

            result.Should()
            .BeOfType <InternalServerErrorResult>()
            .Which
            .Value
            .Should()
            .Be($"No current provider metadata returned for funding stream id '{specFundingStreamId}'.");
        }
        public void Validate_GivenValidModel_ValidIsTrue()
        {
            //Arrange
            SpecificationEditModel model = CreateModel();

            model.SpecificationId = "specId";

            SpecificationEditModelValidator validator = CreateValidator();

            //Act
            ValidationResult result = validator.Validate(model);

            //Assert
            result
            .IsValid
            .Should()
            .BeTrue();
        }
Ejemplo n.º 15
0
        public async Task EditSpecification_GivenChangesWithFDZProviderSourceAndProviderSnapshotIdNotSet_ReturnsPreconditionFailedResult()
        {
            //Arrange
            SpecificationEditModel specificationEditModel = new SpecificationEditModel
            {
                FundingPeriodId     = "fp10",
                Name                = "new spec name",
                ProviderVersionId   = _specification.Current.ProviderVersionId,
                Description         = "new spec description",
                AssignedTemplateIds = new Dictionary <string, string>()
            };

            Reference user = new Reference();

            SpecificationVersion newSpecVersion = _specification.Current.DeepCopy(useCamelCase: false);

            newSpecVersion.Name               = specificationEditModel.Name;
            newSpecVersion.FundingPeriod.Id   = specificationEditModel.FundingPeriodId;
            newSpecVersion.FundingPeriod.Name = "p10";
            newSpecVersion.Author             = user;
            newSpecVersion.Description        = specificationEditModel.Description;

            AndGetFundingConfiguration(
                _specification.Current.FundingStreams.FirstOrDefault().Id,
                specificationEditModel.FundingPeriodId,
                ProviderSource.FDZ);

            SpecificationsService service = CreateSpecificationsService(newSpecVersion);

            string correlationId = NewRandomString();

            SpecificationVersion previousSpecificationVersion = _specification.Current;

            //Act
            IActionResult actionResult =
                await service.EditSpecification(SpecificationId, specificationEditModel, user, correlationId);

            actionResult
            .Should()
            .BeOfType <PreconditionFailedResult>();
        }
Ejemplo n.º 16
0
        public async Task EditSpecification_GivenSpecificationWasNotFound_ReturnsNotFoundResult()
        {
            //Arrange
            SpecificationEditModel specificationEditModel = new SpecificationEditModel();

            _specificationsRepository.GetSpecificationById(Arg.Is(SpecificationId))
            .Returns((Specification)null);
            SpecificationsService service = CreateService(logs: _logger, specificationsRepository: _specificationsRepository);

            //Act
            IActionResult result = await service.EditSpecification(SpecificationId, specificationEditModel, null, null);

            //Assert
            result
            .Should().BeOfType <NotFoundObjectResult>()
            .Which.Value.Should()
            .Be("Specification not found");
            _logger
            .Received(1)
            .Warning(Arg.Is($"Failed to find specification for id: {SpecificationId}"));
        }
Ejemplo n.º 17
0
        public async Task EditSpecification_GivenSpecificationWasfoundAndFundingPeriodChangedButFailedToGetFundingPeriodsFromCosmos_ReturnsPreConditionFailedResult()
        {
            //Arrange
            SpecificationEditModel specificationEditModel = new SpecificationEditModel
            {
                FundingPeriodId   = "fp10",
                ProviderVersionId = _specification.Current.ProviderVersionId
            };

            _specificationsRepository.GetSpecificationById(Arg.Is(SpecificationId))
            .Returns(_specification);
            SpecificationsService service = CreateService(logs: _logger, specificationsRepository: _specificationsRepository);

            //Act
            IActionResult result = await service.EditSpecification(SpecificationId, specificationEditModel, null, null);

            //Assert
            result
            .Should().BeOfType <PreconditionFailedResult>()
            .Which.Value.Should().Be($"Unable to find funding period with ID '{specificationEditModel.FundingPeriodId}'.");
        }
Ejemplo n.º 18
0
        public async Task EditSpecification_WhenInvalidModelProvided_ThenValidationErrorReturned()
        {
            // Arrange
            ValidationResult validationResult = new ValidationResult()
            {
                Errors = { new ValidationFailure("error", "error") }
            };
            IValidator <SpecificationEditModel> validator = CreateEditSpecificationValidator(validationResult);
            SpecificationsService  specificationsService  = CreateService(specificationEditModelValidator: validator);
            SpecificationEditModel specificationEditModel = new SpecificationEditModel();

            // Act
            IActionResult result = await specificationsService.EditSpecification(SpecificationId, specificationEditModel, null, null);

            // Assert
            result
            .Should().BeOfType <BadRequestObjectResult>()
            .Which.Value.Should().BeOfType <SerializableError>()
            .Which.Should().HaveCount(1);
            await validator
            .Received(1).ValidateAsync(Arg.Any <SpecificationEditModel>());
        }
        public void Validate_GivenCoreProviderVersionUpdatesUseLatestForFDZProviderSource_ValidIsTrue()
        {
            //Arrange
            SpecificationEditModel model = CreateModel();

            model.SpecificationId            = "specId";
            model.CoreProviderVersionUpdates = CoreProviderVersionUpdates.UseLatest;
            model.ProviderSnapshotId         = 1;

            ISpecificationsRepository repository        = CreateSpecificationsRepository();
            IPoliciesApiClient        policiesApiClient = CreatePoliciesApiClient(providerSource: ProviderSource.FDZ);

            SpecificationEditModelValidator validator = CreateValidator(repository, policiesApiClient: policiesApiClient);

            //Act
            ValidationResult result = validator.Validate(model);

            //Assert
            result
            .IsValid
            .Should()
            .BeTrue();
        }
        public void Validate_GivenEmptyProviderSnapshotId_ValidIsFalse()
        {
            //Arrange
            SpecificationEditModel model = CreateModel();

            model.SpecificationId = "specId";

            IPoliciesApiClient policiesApiClient = Substitute.For <IPoliciesApiClient>();

            policiesApiClient
            .GetFundingPeriodById(Arg.Any <string>())
            .Returns(new ApiResponse <PolicyModels.FundingPeriod>(HttpStatusCode.OK, new PolicyModels.FundingPeriod()));

            policiesApiClient
            .GetFundingConfiguration(Arg.Any <string>(), Arg.Any <string>())
            .Returns(new ApiResponse <PolicyModels.FundingConfig.FundingConfiguration>(HttpStatusCode.OK, new PolicyModels.FundingConfig.FundingConfiguration {
                ProviderSource = ProviderSource.FDZ
            }));

            SpecificationEditModelValidator validator = CreateValidator(policiesApiClient: policiesApiClient);

            //Act
            ValidationResult result = validator.Validate(model);

            //Assert
            result
            .IsValid
            .Should()
            .BeFalse();

            result
            .Errors
            .Count
            .Should()
            .Be(1);
        }
        public void Validate_GivenNonExistingFundingPeriodId_ValidIsFalse()
        {
            //Arrange
            SpecificationEditModel model = CreateModel();

            model.FundingPeriodId = "A Non Existing ID";
            model.SpecificationId = "specId";
            SpecificationEditModelValidator validator = CreateValidator(policiesApiClient: CreatePoliciesApiClient(HttpStatusCode.NotFound));

            //Act
            ValidationResult result = validator.Validate(model);

            //Assert
            result
            .IsValid
            .Should()
            .BeFalse();

            result
            .Errors
            .Count
            .Should()
            .Be(1);
        }
        public void Validate_GivenNameAlreadyExists_ValidIsFalse()
        {
            //Arrange
            SpecificationEditModel model = CreateModel();

            ISpecificationsRepository repository = CreateSpecificationsRepository(true);

            SpecificationEditModelValidator validator = CreateValidator(repository);

            //Act
            ValidationResult result = validator.Validate(model);

            //Assert
            result
            .IsValid
            .Should()
            .BeFalse();

            result
            .Errors
            .Count
            .Should()
            .Be(1);
        }
Ejemplo n.º 23
0
        public async Task EditSpecification_GivenChangesAndSpecContainsPoliciesAndCalculations_UpdatesSearchAndSendsMessage()
        {
            //Arrange
            SpecificationEditModel specificationEditModel = new SpecificationEditModel
            {
                FundingPeriodId  = "fp10",
                Name             = "new spec name",
                FundingStreamIds = new[] { "fs11" }
            };

            Period fundingPeriod = new Period
            {
                Id   = "fp10",
                Name = "fp 10"
            };

            IEnumerable <FundingStream> fundingStreams = new[]
            {
                new FundingStream {
                    AllocationLines = new List <AllocationLine>
                    {
                        new AllocationLine {
                            Id = "al1", Name = "al2"
                        }
                    }
                }
            };

            string json = JsonConvert.SerializeObject(specificationEditModel);

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

            HttpContext context = Substitute.For <HttpContext>();

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

            IQueryCollection queryStringValues = new QueryCollection(new Dictionary <string, StringValues>
            {
                { "specificationId", new StringValues(SpecificationId) },
            });

            request
            .Query
            .Returns(queryStringValues);
            request
            .Body
            .Returns(stream);

            request
            .HttpContext
            .Returns(context);

            ILogger logger = CreateLogger();

            Specification specification = CreateSpecification();

            specification
            .Current
            .Policies = new[]
            {
                new Policy
                {
                    Calculations = new[]
                    {
                        new Calculation {
                            AllocationLine = new AllocationLine {
                                Id = "oldallocationlineid"
                            }
                        }
                    }
                }
            };

            ISpecificationsRepository specificationsRepository = CreateSpecificationsRepository();

            specificationsRepository
            .GetSpecificationById(Arg.Is(SpecificationId))
            .Returns(specification);

            specificationsRepository
            .GetPeriodById(Arg.Is(fundingPeriod.Id))
            .Returns(fundingPeriod);

            specificationsRepository
            .GetFundingStreams(Arg.Any <Expression <Func <FundingStream, bool> > >())
            .Returns(fundingStreams);

            specificationsRepository
            .UpdateSpecification(Arg.Any <Specification>())
            .Returns(HttpStatusCode.OK);

            ISearchRepository <SpecificationIndex> searchRepository = CreateSearchRepository();

            ICacheProvider cacheProvider = CreateCacheProvider();

            IMessengerService messengerService = CreateMessengerService();

            SpecificationVersion newSpecVersion = specification.Current.Clone() as SpecificationVersion;

            newSpecVersion.Name             = specificationEditModel.Name;
            newSpecVersion.FundingPeriod.Id = specificationEditModel.FundingPeriodId;
            newSpecVersion.FundingStreams   = new[] { new FundingStream {
                                                          Id = "fs11"
                                                      } };

            IVersionRepository <SpecificationVersion> versionRepository = CreateVersionRepository();

            versionRepository
            .CreateVersion(Arg.Any <SpecificationVersion>(), Arg.Any <SpecificationVersion>())
            .Returns(newSpecVersion);

            SpecificationsService service = CreateService(
                logs: logger, specificationsRepository: specificationsRepository, searchRepository: searchRepository,
                cacheProvider: cacheProvider, messengerService: messengerService, specificationVersionRepository: versionRepository);

            //Act
            IActionResult result = await service.EditSpecification(request);

            //Arrange
            await
            searchRepository
            .Received(1)
            .Index(Arg.Is <IEnumerable <SpecificationIndex> >(
                       m => m.First().Id == SpecificationId &&
                       m.First().Name == "new spec name" &&
                       m.First().FundingPeriodId == "fp10" &&
                       m.First().FundingStreamIds.Count() == 1
                       ));

            await
            cacheProvider
            .Received(1)
            .RemoveAsync <SpecificationSummary>(Arg.Is($"{CacheKeys.SpecificationSummaryById}{specification.Id}"));

            await
            messengerService
            .Received(1)
            .SendToTopic(Arg.Is(ServiceBusConstants.TopicNames.EditSpecification),
                         Arg.Is <SpecificationVersionComparisonModel>(
                             m => m.Id == SpecificationId &&
                             m.Current.Name == "new spec name" &&
                             m.Previous.Name == "Spec name"
                             ), Arg.Any <IDictionary <string, string> >(), Arg.Is(true));

            await
            versionRepository
            .Received(1)
            .SaveVersion(Arg.Is(newSpecVersion));
        }
Ejemplo n.º 24
0
        public async Task EditSpecification_GivenFailsToUpdateCosomosWithBadRequest_ReturnsBadRequest()
        {
            //Arrange
            SpecificationEditModel specificationEditModel = new SpecificationEditModel
            {
                FundingPeriodId = "fp10"
            };

            Period fundingPeriod = new Period
            {
                Id   = "fp10",
                Name = "fp 10"
            };

            IEnumerable <FundingStream> fundingStreams = new[]
            {
                new FundingStream()
            };

            string json = JsonConvert.SerializeObject(specificationEditModel);

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

            HttpContext context = Substitute.For <HttpContext>();

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

            IQueryCollection queryStringValues = new QueryCollection(new Dictionary <string, StringValues>
            {
                { "specificationId", new StringValues(SpecificationId) },
            });

            request
            .Query
            .Returns(queryStringValues);
            request
            .Body
            .Returns(stream);

            request
            .HttpContext
            .Returns(context);

            ILogger logger = CreateLogger();

            Specification specification = CreateSpecification();

            ISpecificationsRepository specificationsRepository = CreateSpecificationsRepository();

            specificationsRepository
            .GetSpecificationById(Arg.Is(SpecificationId))
            .Returns(specification);

            specificationsRepository
            .GetPeriodById(Arg.Is(fundingPeriod.Id))
            .Returns(fundingPeriod);

            specificationsRepository
            .GetFundingStreams(Arg.Any <Expression <Func <FundingStream, bool> > >())
            .Returns(fundingStreams);

            specificationsRepository
            .UpdateSpecification(Arg.Any <Specification>())
            .Returns(HttpStatusCode.BadRequest);

            SpecificationsService service = CreateService(logs: logger, specificationsRepository: specificationsRepository);

            //Act
            IActionResult result = await service.EditSpecification(request);

            //Arrange
            result
            .Should()
            .BeOfType <StatusCodeResult>()
            .Which
            .StatusCode
            .Should()
            .Be(400);
        }
Ejemplo n.º 25
0
        public async Task EditSpecification_GivenSpecificationWasFoundAndFundingPeriodChangedAndfundinfgStreamsChangedButFailsToFindFundingStreams_ReturnsInternalServerErrorResult()
        {
            //Arrange
            SpecificationEditModel specificationEditModel = new SpecificationEditModel
            {
                FundingPeriodId = "fp10"
            };

            Period fundingPeriod = new Period
            {
                Id   = "fp10",
                Name = "fp 10"
            };

            string json = JsonConvert.SerializeObject(specificationEditModel);

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

            HttpContext context = Substitute.For <HttpContext>();

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

            IQueryCollection queryStringValues = new QueryCollection(new Dictionary <string, StringValues>
            {
                { "specificationId", new StringValues(SpecificationId) },
            });

            request
            .Query
            .Returns(queryStringValues);
            request
            .Body
            .Returns(stream);

            request
            .HttpContext
            .Returns(context);

            ILogger logger = CreateLogger();

            Specification specification = CreateSpecification();

            ISpecificationsRepository specificationsRepository = CreateSpecificationsRepository();

            specificationsRepository
            .GetSpecificationById(Arg.Is(SpecificationId))
            .Returns(specification);

            specificationsRepository
            .GetPeriodById(Arg.Is(fundingPeriod.Id))
            .Returns(fundingPeriod);

            SpecificationsService service = CreateService(logs: logger, specificationsRepository: specificationsRepository);

            //Act
            IActionResult result = await service.EditSpecification(request);

            //Arrange
            result
            .Should()
            .BeOfType <InternalServerErrorResult>()
            .Which
            .Value
            .Should()
            .Be("No funding streams were retrieved to add to the Specification");
        }
Ejemplo n.º 26
0
        public async Task EditSpecification_GivenChangesWithFDZProviderSource_UpdatesSearchAndSendsMessage()
        {
            //Arrange
            SpecificationEditModel specificationEditModel = new SpecificationEditModel
            {
                FundingPeriodId     = "fp10",
                Name                = "new spec name",
                ProviderVersionId   = _specification.Current.ProviderVersionId,
                Description         = "new spec description",
                AssignedTemplateIds = new Dictionary <string, string>(),
                ProviderSnapshotId  = 1
            };

            Reference user = new Reference();

            SpecificationVersion newSpecVersion = _specification.Current.DeepCopy(useCamelCase: false);

            newSpecVersion.Name               = specificationEditModel.Name;
            newSpecVersion.FundingPeriod.Id   = specificationEditModel.FundingPeriodId;
            newSpecVersion.FundingPeriod.Name = "p10";
            newSpecVersion.Author             = user;
            newSpecVersion.Description        = specificationEditModel.Description;
            newSpecVersion.ProviderSnapshotId = 1;
            newSpecVersion.ProviderSource     = Models.Providers.ProviderSource.FDZ;

            AndGetFundingConfiguration(
                _specification.Current.FundingStreams.FirstOrDefault().Id,
                specificationEditModel.FundingPeriodId,
                ProviderSource.FDZ);

            SpecificationsService service = CreateSpecificationsService(newSpecVersion);

            string correlationId = NewRandomString();

            SpecificationVersion previousSpecificationVersion = _specification.Current;

            //Act
            await service.EditSpecification(SpecificationId, specificationEditModel, user, correlationId);

            await _specificationIndexer
            .Received(1)
            .Index(Arg.Is <Specification>(_ => ReferenceEquals(_.Current, newSpecVersion)));

            await
            _cacheProvider
            .Received(1)
            .RemoveAsync <SpecificationSummary>(Arg.Is($"{CacheKeys.SpecificationSummaryById}{_specification.Id}"));

            await
            _messengerService
            .Received(1)
            .SendToTopic(Arg.Is(ServiceBusConstants.TopicNames.EditSpecification),
                         Arg.Is <SpecificationVersionComparisonModel>(
                             m => m.Id == SpecificationId &&
                             m.Current.Name == "new spec name" &&
                             m.Previous.Name == "Spec name"
                             ), Arg.Any <IDictionary <string, string> >(), Arg.Is(true));

            await
            _versionRepository
            .Received(1)
            .SaveVersion(Arg.Is(newSpecVersion));

            await _templateVersionChangedHandler
            .Received(1)
            .HandleTemplateVersionChanged(Arg.Is(previousSpecificationVersion),
                                          Arg.Is <SpecificationVersion>(_ => newSpecVersion.AsJson(true) == _.AsJson(true)),
                                          Arg.Is(specificationEditModel.AssignedTemplateIds),
                                          Arg.Is(user),
                                          Arg.Is(correlationId));
        }
Ejemplo n.º 27
0
        public async Task EditSpecification_GivenChangesAndNoCurrentProviderVersionMetatdataForFundingStream_ReturnServerError()
        {
            //Arrange
            bool withRunCalculationEngineAfterCoreProviderUpdate = true;

            _specification.Current.CoreProviderVersionUpdates = CoreProviderVersionUpdates.Manual;
            SpecificationEditModel specificationEditModel = new SpecificationEditModel
            {
                FundingPeriodId            = "fp10",
                Name                       = "new spec name",
                ProviderVersionId          = _specification.Current.ProviderVersionId,
                AssignedTemplateIds        = new Dictionary <string, string>(),
                CoreProviderVersionUpdates = CoreProviderVersionUpdates.UseLatest
            };
            Reference user = new Reference();

            SpecificationVersion newSpecVersion = _specification.Current.DeepCopy(useCamelCase: false);

            newSpecVersion.Name             = specificationEditModel.Name;
            newSpecVersion.FundingPeriod.Id = specificationEditModel.FundingPeriodId;
            newSpecVersion.FundingStreams   = new[] { new Reference {
                                                          Id = "fs11"
                                                      } };
            newSpecVersion.FundingPeriod.Name = "p10";
            newSpecVersion.Author             = user;
            newSpecVersion.Description        = specificationEditModel.Description;

            string specFundingStreamId = _specification.Current.FundingStreams.FirstOrDefault().Id;
            int    providerSnapshotId  = NewRandomInt();

            CurrentProviderVersionMetadata currentProviderVersionMetadata = new CurrentProviderVersionMetadata
            {
                FundingStreamId    = specFundingStreamId,
                ProviderSnapshotId = providerSnapshotId
            };

            AndGetFundingConfiguration(
                specFundingStreamId,
                specificationEditModel.FundingPeriodId,
                withRunCalculationEngineAfterCoreProviderUpdate: withRunCalculationEngineAfterCoreProviderUpdate);

            _providersApiClient.GetCurrentProviderMetadataForFundingStream(specFundingStreamId)
            .Returns(new ApiResponse <CurrentProviderVersionMetadata>(HttpStatusCode.OK, currentProviderVersionMetadata));

            SpecificationsService service = CreateSpecificationsService(newSpecVersion);

            string correlationId = NewRandomString();

            SpecificationVersion previousSpecificationVersion = _specification.Current;

            //Act
            await service.EditSpecification(SpecificationId, specificationEditModel, user, correlationId);

            await _specificationIndexer
            .Received(1)
            .Index(Arg.Is <Specification>(_ => ReferenceEquals(_.Current, newSpecVersion)));

            await
            _cacheProvider
            .Received(1)
            .RemoveAsync <SpecificationSummary>(Arg.Is($"{CacheKeys.SpecificationSummaryById}{_specification.Id}"));

            await
            _messengerService
            .Received(1)
            .SendToTopic(Arg.Is(ServiceBusConstants.TopicNames.EditSpecification),
                         Arg.Is <SpecificationVersionComparisonModel>(
                             m => m.Id == SpecificationId &&
                             m.Current.Name == "new spec name" &&
                             m.Previous.Name == "Spec name"
                             ), Arg.Any <IDictionary <string, string> >(), Arg.Is(true));

            await
            _versionRepository
            .Received(1)
            .SaveVersion(Arg.Is(newSpecVersion));

            await _templateVersionChangedHandler
            .Received(1)
            .HandleTemplateVersionChanged(Arg.Is(previousSpecificationVersion),
                                          Arg.Any <SpecificationVersion>(),
                                          Arg.Is(specificationEditModel.AssignedTemplateIds),
                                          Arg.Is(user),
                                          Arg.Is(correlationId));

            await _editSpecificationJobActions
            .Received(1)
            .Run(Arg.Is <SpecificationVersion>(
                     m => !string.IsNullOrWhiteSpace(m.EntityId) &&
                     m.Name == specificationEditModel.Name),
                 Arg.Any <Reference>(),
                 Arg.Any <string>(),
                 true,
                 withRunCalculationEngineAfterCoreProviderUpdate);
        }
Ejemplo n.º 28
0
        public async Task EditSpecification_WhenIndexingReturnsErrors_ShouldThrowException()
        {
            //Arrange
            const string errorMessage = "Encountered error 802 code";

            SpecificationEditModel specificationEditModel = new SpecificationEditModel
            {
                FundingPeriodId  = "fp10",
                Name             = "new spec name",
                FundingStreamIds = new[] { "fs11" }
            };

            Period fundingPeriod = new Period
            {
                Id   = "fp10",
                Name = "fp 10"
            };

            IEnumerable <FundingStream> fundingStreams = new[]
            {
                new FundingStream {
                    AllocationLines = new List <AllocationLine>
                    {
                        new AllocationLine {
                            Id = "al1", Name = "al2"
                        }
                    }
                }
            };

            string json = JsonConvert.SerializeObject(specificationEditModel);

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

            HttpContext context = Substitute.For <HttpContext>();

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

            IQueryCollection queryStringValues = new QueryCollection(new Dictionary <string, StringValues>
            {
                { "specificationId", new StringValues(SpecificationId) },
            });

            request
            .Query
            .Returns(queryStringValues);
            request
            .Body
            .Returns(stream);

            request
            .HttpContext
            .Returns(context);

            ILogger logger = CreateLogger();

            Specification specification = CreateSpecification();

            ISpecificationsRepository specificationsRepository = CreateSpecificationsRepository();

            specificationsRepository
            .GetSpecificationById(Arg.Is(SpecificationId))
            .Returns(specification);

            specificationsRepository
            .GetPeriodById(Arg.Is(fundingPeriod.Id))
            .Returns(fundingPeriod);

            specificationsRepository
            .GetFundingStreams(Arg.Any <Expression <Func <FundingStream, bool> > >())
            .Returns(fundingStreams);

            specificationsRepository
            .UpdateSpecification(Arg.Any <Specification>())
            .Returns(HttpStatusCode.OK);

            ISearchRepository <SpecificationIndex> searchRepository = CreateSearchRepository();

            searchRepository
            .Index(Arg.Any <IEnumerable <SpecificationIndex> >())
            .Returns(new[] { new IndexError()
                             {
                                 ErrorMessage = errorMessage
                             } });

            ICacheProvider cacheProvider = CreateCacheProvider();

            IMessengerService messengerService = CreateMessengerService();

            SpecificationVersion newSpecVersion = specification.Current.Clone() as SpecificationVersion;

            newSpecVersion.Name             = specificationEditModel.Name;
            newSpecVersion.FundingPeriod.Id = specificationEditModel.FundingPeriodId;
            newSpecVersion.FundingStreams   = new[] { new FundingStream {
                                                          Id = "fs11"
                                                      } };

            IVersionRepository <SpecificationVersion> versionRepository = CreateVersionRepository();

            versionRepository
            .CreateVersion(Arg.Any <SpecificationVersion>(), Arg.Any <SpecificationVersion>())
            .Returns(newSpecVersion);

            SpecificationsService service = CreateService(
                logs: logger, specificationsRepository: specificationsRepository, searchRepository: searchRepository,
                cacheProvider: cacheProvider, messengerService: messengerService, specificationVersionRepository: versionRepository);

            //Act
            Func <Task <IActionResult> > editSpecification = async() => await service.EditSpecification(request);

            //Assert
            editSpecification
            .Should()
            .Throw <ApplicationException>()
            .Which
            .Message
            .Should()
            .Be($"Could not index specification {specification.Current.Id} because: {errorMessage}");
        }
Ejemplo n.º 29
0
        public async Task EditSpecification_GivenChangesButFundingPeriodUnchanged_EnsuresCacheCorrectlyInvalidates()
        {
            //Arrange
            SpecificationEditModel specificationEditModel = new SpecificationEditModel
            {
                FundingPeriodId  = "FP1",
                Name             = "new spec name",
                FundingStreamIds = new[] { "fs11" }
            };

            Period fundingPeriod = new Period
            {
                Id   = "FP1",
                Name = "fp 1"
            };

            IEnumerable <FundingStream> fundingStreams = new[]
            {
                new FundingStream()
            };

            string json = JsonConvert.SerializeObject(specificationEditModel);

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

            HttpContext context = Substitute.For <HttpContext>();

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

            IQueryCollection queryStringValues = new QueryCollection(new Dictionary <string, StringValues>
            {
                { "specificationId", new StringValues(SpecificationId) },
            });

            request
            .Query
            .Returns(queryStringValues);
            request
            .Body
            .Returns(stream);

            request
            .HttpContext
            .Returns(context);

            ILogger logger = CreateLogger();

            Specification specification = CreateSpecification();

            ISpecificationsRepository specificationsRepository = CreateSpecificationsRepository();

            specificationsRepository
            .GetSpecificationById(Arg.Is(SpecificationId))
            .Returns(specification);

            specificationsRepository
            .GetPeriodById(Arg.Is(fundingPeriod.Id))
            .Returns(fundingPeriod);

            specificationsRepository
            .GetFundingStreams(Arg.Any <Expression <Func <FundingStream, bool> > >())
            .Returns(fundingStreams);

            specificationsRepository
            .UpdateSpecification(Arg.Any <Specification>())
            .Returns(HttpStatusCode.OK);

            ICacheProvider cacheProvider = CreateCacheProvider();

            SpecificationVersion newSpecVersion = specification.Current.Clone() as SpecificationVersion;

            IVersionRepository <SpecificationVersion> versionRepository = CreateVersionRepository();

            versionRepository
            .CreateVersion(Arg.Any <SpecificationVersion>(), Arg.Any <SpecificationVersion>())
            .Returns(newSpecVersion);

            SpecificationsService service = CreateService(
                logs: logger, specificationsRepository: specificationsRepository, cacheProvider: cacheProvider, specificationVersionRepository: versionRepository);

            //Act
            IActionResult result = await service.EditSpecification(request);

            //Arrange
            await
            cacheProvider
            .Received(1)
            .RemoveAsync <SpecificationSummary>(Arg.Is($"{CacheKeys.SpecificationSummaryById}{specification.Id}"));

            await
            cacheProvider
            .DidNotReceive()
            .RemoveAsync <List <SpecificationSummary> >(Arg.Is($"{CacheKeys.SpecificationSummariesByFundingPeriodId}fp1"));

            await
            versionRepository
            .Received(1)
            .SaveVersion(Arg.Is(newSpecVersion));
        }
Ejemplo n.º 30
0
        public async Task <IActionResult> EditSpecification([FromQuery] string specificationId, [FromBody] SpecificationEditModel specificationEditModel)
        {
            Reference user          = Request.GetUser();
            string    correlationId = ControllerContext.HttpContext.Request.GetCorrelationId();

            return(await _specService.EditSpecification(specificationId, specificationEditModel, user, correlationId));
        }