public void GivenAnInvalidResource_WhenValidatingMemberMatch_ThenInvalidShouldBeReturned()
        {
            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 MemberMatchResourceValidator(
                new ModelAttributeValidator(),
                new NarrativeHtmlSanitizer(NullLogger <NarrativeHtmlSanitizer> .Instance),
                profileValidator,
                contextAccessor,
                config);

            var defaultCoverage = Samples.GetDefaultCoverage().ToPoco <Coverage>();
            var defaultPatient  = Samples.GetDefaultPatient().ToPoco <Patient>();

            defaultCoverage.Status = null;
            var createMemberMatchRequest = new MemberMatchRequest(defaultPatient.ToResourceElement(), defaultCoverage.ToResourceElement());
            var result = validator.Validate(createMemberMatchRequest);

            Assert.False(result.IsValid);
            Assert.True(result.Errors.Count >= 1);
            Assert.NotEmpty(result.Errors.Where(e => e.ErrorMessage.Contains("min. cardinality 1 cannot be null")));
        }
        public void GivenAResourceWithInvalidId_WhenValidatingMemberMatch_ThenInvalidShouldBeReturned(string id, string maliciousNarrative)
        {
            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 MemberMatchResourceValidator(
                new ModelAttributeValidator(),
                new NarrativeHtmlSanitizer(NullLogger <NarrativeHtmlSanitizer> .Instance),
                profileValidator,
                contextAccessor,
                config);

            var defaultCoverage = Samples.GetDefaultCoverage().ToPoco <Coverage>();
            var defaultPatient  = Samples.GetDefaultPatient().ToPoco <Patient>();

            defaultCoverage.Text.Div = maliciousNarrative;
            defaultPatient.Text.Div  = maliciousNarrative;

            var coverageResource = defaultCoverage.ToResourceElement()
                                   .UpdateId(id);

            var patientResource = defaultPatient.ToResourceElement()
                                  .UpdateId(id);

            var createResourceRequest = new MemberMatchRequest(patientResource, coverageResource);
            var result = validator.Validate(createResourceRequest);

            Assert.False(result.IsValid);
            Assert.True(result.Errors.Count >= 2);
            Assert.NotEmpty(result.Errors.Where(e => e.ErrorMessage.Contains("XHTML content should be contained within a single <div> element")));
            Assert.NotEmpty(result.Errors.Where(e => e.ErrorMessage.Contains("Id must be any combination of upper or lower case ASCII letters")));
        }
        public void GivenConfigOrHeader_WhenValidatingMemberMatch_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()
            {
                ProfileValidationOnCreate = 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 MemberMatchResourceValidator(
                new ModelAttributeValidator(),
                new NarrativeHtmlSanitizer(NullLogger <NarrativeHtmlSanitizer> .Instance),
                profileValidator,
                contextAccessor,
                config);

            var createMemberMatchRequest = new MemberMatchRequest(Samples.GetDefaultCoverage().ToPoco <Coverage>().ToResourceElement(), Samples.GetDefaultPatient().ToPoco <Patient>().ToResourceElement());

            validator.Validate(createMemberMatchRequest);

            if (shouldCallProfileValidation)
            {
                profileValidator.Received().TryValidate(Arg.Any <ITypedElement>(), Arg.Any <string>());
            }
            else
            {
                profileValidator.DidNotReceive().TryValidate(Arg.Any <ITypedElement>(), Arg.Any <string>());
            }
        }