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); }
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); }
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); }
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>()); }
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); }
public async Task <UpsertResourceResponse> Handle(UpsertResourceRequest request, CancellationToken cancellationToken, RequestHandlerDelegate <UpsertResourceResponse> next) => await GenericHandle(next, cancellationToken);