Ejemplo n.º 1
0
        public async Task <UpsertResourceResponse> Handle(UpsertResourceRequest request, CancellationToken cancellationToken, RequestHandlerDelegate <UpsertResourceResponse> next)
        {
            // if the resource type being updated is a SearchParameter, then we want to query the previous version before it is changed
            // because we will need to the Url property to update the definition in the SearchParameterDefinitionManager
            // and the user could be changing the Url as part of this update
            if (request.Resource.InstanceType.Equals(KnownResourceTypes.SearchParameter, StringComparison.Ordinal))
            {
                var             resourceKey             = new ResourceKey(request.Resource.InstanceType, request.Resource.Id, request.Resource.VersionId);
                ResourceWrapper prevSearchParamResource = await _fhirDataStore.GetAsync(resourceKey, cancellationToken);

                if (prevSearchParamResource != null)
                {
                    // Update the SearchParameterDefinitionManager with the new SearchParameter in order to validate any changes
                    // to the fhirpath or the datatype
                    await _searchParameterOperations.UpdateSearchParameterAsync(request.Resource.Instance, prevSearchParamResource.RawResource, cancellationToken);
                }
                else
                {
                    await _searchParameterOperations.AddSearchParameterAsync(request.Resource.Instance, cancellationToken);
                }
            }

            // Now allow the resource to updated per the normal behavior
            return(await next());
        }
        public async Task <UpsertResourceResponse> Handle(UpsertResourceRequest request, CancellationToken cancellationToken, RequestHandlerDelegate <UpsertResourceResponse> next)
        {
            ResourceWrapper prevSearchParamResource = null;
            bool            isSearchParameter       = false;

            // if the resource type being updated is a SearchParaemter, then we want to query the previous version before it is changed
            // because we will need to the Url property to update the definition in the SearchParameterDefinitionManager
            // and the user could be changing the Url as part of this update
            if (request.Resource.InstanceType.Equals(KnownResourceTypes.SearchParameter, StringComparison.Ordinal))
            {
                isSearchParameter = true;
                var resourceKey = new ResourceKey(request.Resource.InstanceType, request.Resource.Id, request.Resource.VersionId);
                prevSearchParamResource = await _fhirDataStore.GetAsync(resourceKey, cancellationToken);
            }

            // Now allow the resource to updated per the normal behavior
            var response = await next();

            if (isSearchParameter)
            {
                // Once the SearchParameter resource is update in the data store, we will update
                // the metadata in the SearchParameterDefinitionManager
                await _searchParameterOperations.UpdateSearchParameterAsync(request.Resource.Instance, prevSearchParamResource.RawResource);
            }

            return(response);
        }
Ejemplo n.º 3
0
        public void GivenAResourceWithoutInvalidId_WhenValidatingUpsert_ThenInvalidShouldBeReturned(string id)
        {
            var validator = new UpsertResourceValidator(new NarrativeHtmlSanitizer(NullLogger <NarrativeHtmlSanitizer> .Instance), new ModelAttributeValidator());
            var resource  = Samples.GetDefaultObservation()
                            .UpdateId(id);

            var upsertResourceRequest = new UpsertResourceRequest(resource);
            var result = validator.Validate(upsertResourceRequest);

            Assert.False(result.IsValid);
        }
Ejemplo n.º 4
0
        public async Task <UpsertResourceResponse> Handle(
            UpsertResourceRequest request,
            CancellationToken cancellationToken,
            RequestHandlerDelegate <UpsertResourceResponse> next)
        {
            EnsureArg.IsNotNull(request, nameof(request));
            EnsureArg.IsNotNull(next, nameof(next));

            var response = await next();

            await FireEvent(response, cancellationToken);

            return(response);
        }
Ejemplo n.º 5
0
        public async Task GivenARequest_WhenValidatingThatType_ThenAllValidationRulesShouldRun()
        {
            var mockValidator1 = Substitute.For <AbstractValidator <UpsertResourceRequest> >();
            var mockValidator2 = Substitute.For <AbstractValidator <UpsertResourceRequest> >();

            var validators = new[] { mockValidator1, mockValidator2 };
            var upsertValidationHandler = new ValidateRequestPreProcessor <UpsertResourceRequest>(validators);
            var upsertResourceRequest   = new UpsertResourceRequest(Samples.GetDefaultObservation());

            await upsertValidationHandler.Process(upsertResourceRequest, CancellationToken.None);

            await mockValidator1.Received().ValidateAsync(Arg.Any <ValidationContext <UpsertResourceRequest> >(), Arg.Any <CancellationToken>());

            await mockValidator2.Received().ValidateAsync(Arg.Any <ValidationContext <UpsertResourceRequest> >(), Arg.Any <CancellationToken>());
        }
Ejemplo n.º 6
0
        public async Task GivenARequest_WhenValidatingThatTypeWithFailingRule_ThenAValidationExceptionShouldBeThrown()
        {
            var mockValidator1 = Substitute.For <AbstractValidator <UpsertResourceRequest> >();
            var mockValidator2 = Substitute.For <AbstractValidator <UpsertResourceRequest> >();

            var validators = new[] { mockValidator1, mockValidator2 };
            var upsertValidationHandler = new ValidateRequestPreProcessor <UpsertResourceRequest>(validators);
            var upsertResourceRequest   = new UpsertResourceRequest(Samples.GetDefaultObservation());

            var validationError = Task.FromResult(new ValidationResult(new[] { new ValidationFailure("Id", "Id should not be null") }));

            mockValidator2
            .ValidateAsync(Arg.Any <ValidationContext <UpsertResourceRequest> >(), Arg.Any <CancellationToken>())
            .Returns(validationError);

            await Assert.ThrowsAsync <ResourceNotValidException>(async() => await upsertValidationHandler.Process(upsertResourceRequest, CancellationToken.None));
        }
        public async Task GivenARequest_WhenReturningFhirValidationFailure_ThenOperationOutcomeIsUsedCorrectly()
        {
            var mockValidator = Substitute.For <AbstractValidator <UpsertResourceRequest> >();

            var validators = new[] { mockValidator };
            var upsertValidationHandler = new ValidateRequestPreProcessor <UpsertResourceRequest>(validators);
            var upsertResourceRequest   = new UpsertResourceRequest(Samples.GetDefaultObservation());

            var operationOutcomeIssue = new OperationOutcomeIssue(OperationOutcomeConstants.IssueSeverity.Error, OperationOutcomeConstants.IssueType.Invalid, "Id was Invalid");

            var validationError = Task.FromResult(new ValidationResult(new[] { new FhirValidationFailure("Id", operationOutcomeIssue.Diagnostics, operationOutcomeIssue) }));

            mockValidator
            .ValidateAsync(Arg.Any <ValidationContext <UpsertResourceRequest> >(), Arg.Any <CancellationToken>())
            .Returns(validationError);

            var exception = await Assert.ThrowsAsync <ResourceNotValidException>(async() => await upsertValidationHandler.Process(upsertResourceRequest, CancellationToken.None));

            Assert.Contains(operationOutcomeIssue, exception.Issues);
        }
        public void GivenConfigOrHeader_WhenValidatingUpsert_ThenProfileValidationShouldOrShouldntBeCalled(bool configValue, bool?headerValue, bool shouldCallProfileValidation)
        {
            var contextAccessor  = Substitute.For <RequestContextAccessor <IFhirRequestContext> >();
            var profileValidator = Substitute.For <IProfileValidator>();
            var config           = Substitute.For <IOptions <CoreFeatureConfiguration> >();

            config.Value.Returns(new CoreFeatureConfiguration()
            {
                ProfileValidationOnUpdate = configValue
            });
            var headers = new Dictionary <string, StringValues>();

            if (headerValue != null)
            {
                headers.Add(KnownHeaders.ProfileValidation, new StringValues(headerValue.Value.ToString()));
            }

            contextAccessor.RequestContext.RequestHeaders.Returns(headers);
            var validator = new UpsertResourceValidator(
                new ModelAttributeValidator(),
                new NarrativeHtmlSanitizer(NullLogger <NarrativeHtmlSanitizer> .Instance),
                profileValidator,
                contextAccessor,
                config);
            var resource = Samples.GetDefaultObservation();

            var upsertResourceRequest = new UpsertResourceRequest(resource);

            validator.Validate(upsertResourceRequest);

            if (shouldCallProfileValidation)
            {
                profileValidator.Received().TryValidate(Arg.Any <ITypedElement>(), Arg.Any <string>());
            }
            else
            {
                profileValidator.DidNotReceive().TryValidate(Arg.Any <ITypedElement>(), Arg.Any <string>());
            }
        }
        public void GivenAResourceWithoutInvalidId_WhenValidatingUpsert_ThenInvalidShouldBeReturned(string id)
        {
            var contextAccessor  = Substitute.For <RequestContextAccessor <IFhirRequestContext> >();
            var profileValidator = Substitute.For <IProfileValidator>();
            var config           = Substitute.For <IOptions <CoreFeatureConfiguration> >();

            config.Value.Returns(new CoreFeatureConfiguration());
            contextAccessor.RequestContext.RequestHeaders.Returns(new Dictionary <string, StringValues>());
            var validator = new UpsertResourceValidator(
                new ModelAttributeValidator(),
                new NarrativeHtmlSanitizer(NullLogger <NarrativeHtmlSanitizer> .Instance),
                profileValidator,
                contextAccessor,
                config);
            var resource = Samples.GetDefaultObservation()
                           .UpdateId(id);

            var upsertResourceRequest = new UpsertResourceRequest(resource);
            var result = validator.Validate(upsertResourceRequest);

            Assert.False(result.IsValid);
        }
Ejemplo n.º 10
0
 public async Task <UpsertResourceResponse> Handle(UpsertResourceRequest request, CancellationToken cancellationToken, RequestHandlerDelegate <UpsertResourceResponse> next)
 => await GenericHandle(next, cancellationToken);