Ejemplo n.º 1
0
 public ReindexUtilitiesTests(ITestOutputHelper output)
 {
     _output = output;
     _searchParameterHashMap = new Dictionary<string, string>() { { "Patient", "hash1" } };
     Func<Health.Extensions.DependencyInjection.IScoped<IFhirDataStore>> fhirDataStoreScope = () => _fhirDataStore.CreateMockScope();
     _searchParameterStatusManager = new SearchParameterStatusManager(_searchParameterStatusDataStore, _searchParameterDefinitionManager, _searchParameterSupportResolver, _mediator, NullLogger<SearchParameterStatusManager>.Instance);
     _reindexUtilities = new ReindexUtilities(fhirDataStoreScope, _searchIndexer, _resourceDeserializer, _searchParameterDefinitionManager, _searchParameterStatusManager, _resourceWrapperFactory);
 }
Ejemplo n.º 2
0
        public async Task InitializeAsync()
        {
            _fhirOperationDataStore         = _fixture.OperationDataStore;
            _fhirStorageTestHelper          = _fixture.TestHelper;
            _scopedOperationDataStore       = _fixture.OperationDataStore.CreateMockScope();
            _scopedDataStore                = _fixture.DataStore.CreateMockScope();
            _searchParameterStatusDataStore = _fixture.SearchParameterStatusDataStore;

            _jobConfiguration = new ReindexJobConfiguration();
            IOptions <ReindexJobConfiguration> optionsReindexConfig = Substitute.For <IOptions <ReindexJobConfiguration> >();

            optionsReindexConfig.Value.Returns(_jobConfiguration);

            _searchParameterDefinitionManager = new SearchParameterDefinitionManager(ModelInfoProvider.Instance);
            await _searchParameterDefinitionManager.StartAsync(CancellationToken.None);

            _supportedSearchParameterDefinitionManager = new SupportedSearchParameterDefinitionManager(_searchParameterDefinitionManager);
            var fhirRequestContextAccessor = Substitute.For <IFhirRequestContextAccessor>();

            _searchableSearchParameterDefinitionManager = new SearchableSearchParameterDefinitionManager(_searchParameterDefinitionManager, fhirRequestContextAccessor);

            ResourceWrapperFactory wrapperFactory = Mock.TypeWithArguments <ResourceWrapperFactory>(
                new RawResourceFactory(new FhirJsonSerializer()),
                _searchIndexer,
                _searchableSearchParameterDefinitionManager,
                Deserializers.ResourceDeserializer);

            _searchParameterStatusManager = new SearchParameterStatusManager(
                _searchParameterStatusDataStore,
                _searchParameterDefinitionManager,
                _searchParameterSupportResolver,
                _mediator);

            _createReindexRequestHandler = new CreateReindexRequestHandler(
                _fhirOperationDataStore,
                DisabledFhirAuthorizationService.Instance,
                optionsReindexConfig,
                _searchParameterDefinitionManager);
            _reindexUtilities = new ReindexUtilities(
                () => _scopedDataStore,
                _searchIndexer,
                Deserializers.ResourceDeserializer,
                _supportedSearchParameterDefinitionManager,
                _searchParameterStatusManager,
                wrapperFactory);

            coreOptions.Value.Returns(new CoreFeatureConfiguration());

            var searchParameterExpressionParser = new SearchParameterExpressionParser(new ReferenceSearchValueParser(fhirRequestContextAccessor));
            var expressionParser     = new ExpressionParser(() => _searchableSearchParameterDefinitionManager, searchParameterExpressionParser);
            var searchOptionsFactory = new SearchOptionsFactory(expressionParser, () => _searchableSearchParameterDefinitionManager, coreOptions, fhirRequestContextAccessor, _sortingValidator, NullLogger <SearchOptionsFactory> .Instance);
            var cosmosSearchService  = new FhirCosmosSearchService(searchOptionsFactory, _fixture.DataStore as CosmosFhirDataStore, new QueryBuilder(), _searchParameterDefinitionManager, fhirRequestContextAccessor) as ISearchService;

            _searchService = cosmosSearchService.CreateMockScope();

            await _fhirStorageTestHelper.DeleteAllReindexJobRecordsAsync(CancellationToken.None);
        }
Ejemplo n.º 3
0
        public SearchParameterUtilities(
            SearchParameterStatusManager searchParameterStatusManager,
            ISearchParameterDefinitionManager searchParameterDefinitionManager)
        {
            EnsureArg.IsNotNull(searchParameterStatusManager, nameof(searchParameterStatusManager));
            EnsureArg.IsNotNull(searchParameterDefinitionManager, nameof(searchParameterDefinitionManager));

            _searchParameterStatusManager     = searchParameterStatusManager;
            _searchParameterDefinitionManager = searchParameterDefinitionManager;
        }
        public SearchParameterUtilities(
            SearchParameterStatusManager searchParameterStatusManager,
            ISearchParameterDefinitionManager searchParameterDefinitionManager,
            IModelInfoProvider modelInfoProvider)
        {
            EnsureArg.IsNotNull(searchParameterStatusManager, nameof(searchParameterStatusManager));
            EnsureArg.IsNotNull(searchParameterDefinitionManager, nameof(searchParameterDefinitionManager));
            EnsureArg.IsNotNull(modelInfoProvider, nameof(modelInfoProvider));

            _searchParameterStatusManager     = searchParameterStatusManager;
            _searchParameterDefinitionManager = searchParameterDefinitionManager;
            _modelInfoProvider = modelInfoProvider;
        }
        public SearchParameterOperations(
            SearchParameterStatusManager searchParameterStatusManager,
            ISearchParameterDefinitionManager searchParameterDefinitionManager,
            IModelInfoProvider modelInfoProvider,
            ISearchParameterSupportResolver searchParameterSupportResolver)
        {
            EnsureArg.IsNotNull(searchParameterStatusManager, nameof(searchParameterStatusManager));
            EnsureArg.IsNotNull(searchParameterDefinitionManager, nameof(searchParameterDefinitionManager));
            EnsureArg.IsNotNull(modelInfoProvider, nameof(modelInfoProvider));
            EnsureArg.IsNotNull(searchParameterSupportResolver, nameof(searchParameterSupportResolver));

            _searchParameterStatusManager     = searchParameterStatusManager;
            _searchParameterDefinitionManager = searchParameterDefinitionManager;
            _modelInfoProvider = modelInfoProvider;
            _searchParameterSupportResolver = searchParameterSupportResolver;
        }
Ejemplo n.º 6
0
        public ReindexUtilities(
            Func <IScoped <IFhirDataStore> > fhirDataStoreFactory,
            ISearchIndexer searchIndexer,
            ResourceDeserializer deserializer,
            ISupportedSearchParameterDefinitionManager searchParameterDefinitionManager,
            SearchParameterStatusManager searchParameterStatusManager)
        {
            EnsureArg.IsNotNull(fhirDataStoreFactory, nameof(fhirDataStoreFactory));
            EnsureArg.IsNotNull(searchIndexer, nameof(searchIndexer));
            EnsureArg.IsNotNull(deserializer, nameof(deserializer));
            EnsureArg.IsNotNull(searchParameterDefinitionManager, nameof(searchParameterDefinitionManager));
            EnsureArg.IsNotNull(searchParameterStatusManager, nameof(searchParameterStatusManager));

            _fhirDataStoreFactory             = fhirDataStoreFactory;
            _searchIndexer                    = searchIndexer;
            _deserializer                     = deserializer;
            _searchParameterDefinitionManager = searchParameterDefinitionManager;
            _searchParameterStatusManager     = searchParameterStatusManager;
        }
Ejemplo n.º 7
0
        public static SearchParameterDefinitionManager CreateSearchParameterDefinitionManager()
        {
            var manager = new SearchParameterDefinitionManager(ModelInfoProvider.Instance);

            manager.Start();

            var statusRegistry = new FilebasedSearchParameterRegistry(
                manager,
                ModelInfoProvider.Instance);
            var statusManager = new SearchParameterStatusManager(
                statusRegistry,
                manager,
                new SearchParameterSupportResolver(manager, Manager),
                Substitute.For <IMediator>());

            statusManager.EnsureInitialized().GetAwaiter().GetResult();

            return(manager);
        }
Ejemplo n.º 8
0
        public static SearchParameterDefinitionManager CreateSearchParameterDefinitionManager()
        {
            var manager = new SearchParameterDefinitionManager(new FhirJsonParser(), ModelInfoProvider.Instance);

            manager.Start();

            Type managerType    = typeof(SearchParameterDefinitionManager);
            var  statusRegistry = new FilebasedSearchParameterRegistry(
                manager,
                managerType.Assembly,
                $"{managerType.Namespace}.unsupported-search-parameters.json");
            var statusManager = new SearchParameterStatusManager(
                statusRegistry,
                manager,
                new SearchParameterSupportResolver(manager, Manager),
                Substitute.For <IMediator>());

            statusManager.EnsureInitialized().GetAwaiter().GetResult();

            return(manager);
        }
Ejemplo n.º 9
0
        public static SearchParameterDefinitionManager CreateSearchParameterDefinitionManager(IModelInfoProvider modelInfoProvider)
        {
            if (Manager == null)
            {
                throw new InvalidOperationException($"{nameof(Manager)} was not instantiated.");
            }

            var definitionManager = new SearchParameterDefinitionManager(modelInfoProvider);

            definitionManager.Start();

            var statusRegistry = new FilebasedSearchParameterRegistry(
                definitionManager,
                modelInfoProvider);
            var statusManager = new SearchParameterStatusManager(
                statusRegistry,
                definitionManager,
                new SearchParameterSupportResolver(definitionManager, Manager),
                Substitute.For <IMediator>());

            statusManager.EnsureInitialized().GetAwaiter().GetResult();

            return(definitionManager);
        }
        public SearchParameterStatusManagerTests()
        {
            _searchParameterStatusDataStore   = Substitute.For <ISearchParameterStatusDataStore>();
            _searchParameterDefinitionManager = Substitute.For <ISearchParameterDefinitionManager>();
            _searchParameterSupportResolver   = Substitute.For <ISearchParameterSupportResolver>();
            _mediator = Substitute.For <IMediator>();

            _manager = new SearchParameterStatusManager(
                _searchParameterStatusDataStore,
                _searchParameterDefinitionManager,
                _searchParameterSupportResolver,
                _mediator);

            _resourceSearchParameterStatuses = new[]
            {
                new ResourceSearchParameterStatus
                {
                    Status      = SearchParameterStatus.Enabled,
                    Uri         = new Uri(ResourceId),
                    LastUpdated = Clock.UtcNow,
                },
                new ResourceSearchParameterStatus
                {
                    Status = SearchParameterStatus.Enabled,
                    Uri    = new Uri(ResourceLastupdated),
                    IsPartiallySupported = true,
                    LastUpdated          = Clock.UtcNow,
                },
                new ResourceSearchParameterStatus
                {
                    Status      = SearchParameterStatus.Disabled,
                    Uri         = new Uri(ResourceProfile),
                    LastUpdated = Clock.UtcNow,
                },
                new ResourceSearchParameterStatus
                {
                    Status      = SearchParameterStatus.Supported,
                    Uri         = new Uri(ResourceSecurity),
                    LastUpdated = Clock.UtcNow,
                },
            };

            _searchParameterStatusDataStore.GetSearchParameterStatuses().Returns(_resourceSearchParameterStatuses);

            List <string> baseResourceTypes = new List <string>()
            {
                "Resource"
            };
            List <string> targetResourceTypes = new List <string>()
            {
                "Patient"
            };

            _queryParameter       = new SearchParameterInfo("_query", SearchParamType.Token, new Uri(ResourceQuery));
            _searchParameterInfos = new[]
            {
                new SearchParameterInfo("_id", SearchParamType.Token, new Uri(ResourceId), targetResourceTypes: targetResourceTypes, baseResourceTypes: baseResourceTypes),
                new SearchParameterInfo("_lastUpdated", SearchParamType.Token, new Uri(ResourceLastupdated), targetResourceTypes: targetResourceTypes, baseResourceTypes: baseResourceTypes),
                new SearchParameterInfo("_profile", SearchParamType.Token, new Uri(ResourceProfile), targetResourceTypes: targetResourceTypes),
                new SearchParameterInfo("_security", SearchParamType.Token, new Uri(ResourceSecurity), targetResourceTypes: targetResourceTypes),
                _queryParameter,
            };

            _searchParameterDefinitionManager.GetSearchParameters("Account")
            .Returns(_searchParameterInfos);

            _searchParameterDefinitionManager.AllSearchParameters
            .Returns(_searchParameterInfos);

            _searchParameterDefinitionManager.GetSearchParameter(new Uri(ResourceQuery))
            .Returns(_queryParameter);

            _searchParameterSupportResolver
            .IsSearchParameterSupported(Arg.Any <SearchParameterInfo>())
            .Returns((false, false));

            _searchParameterSupportResolver
            .IsSearchParameterSupported(Arg.Is(_searchParameterInfos[4]))
            .Returns((true, false));
        }
        public SearchParameterDefinitionManagerTests()
        {
            _searchParameterSupportResolver = Substitute.For <ISearchParameterSupportResolver>();
            _mediator = Substitute.For <IMediator>();
            _searchParameterStatusDataStore   = Substitute.For <ISearchParameterStatusDataStore>();
            _searchParameterDefinitionManager = new SearchParameterDefinitionManager(ModelInfoProvider.Instance, _mediator);
            _fhirRequestContextAccessor       = Substitute.For <RequestContextAccessor <IFhirRequestContext> >();
            _fhirRequestContextAccessor.RequestContext.Returns(_fhirRequestContext);

            _manager = new SearchParameterStatusManager(
                _searchParameterStatusDataStore,
                _searchParameterDefinitionManager,
                _searchParameterSupportResolver,
                _mediator);

            _searchParameterStatusDataStore.GetSearchParameterStatuses()
            .Returns(new[]
            {
                new ResourceSearchParameterStatus
                {
                    Status = SearchParameterStatus.Enabled,
                    Uri    = new Uri(ResourceId),
                },
                new ResourceSearchParameterStatus
                {
                    Status = SearchParameterStatus.Enabled,
                    Uri    = new Uri(ResourceLastUpdated),
                    IsPartiallySupported = true,
                },
                new ResourceSearchParameterStatus
                {
                    Status = SearchParameterStatus.Disabled,
                    Uri    = new Uri(ResourceProfile),
                },
                new ResourceSearchParameterStatus
                {
                    Status = SearchParameterStatus.Supported,
                    Uri    = new Uri(ResourceSecurity),
                },
            });

            _queryParameter = new SearchParameterInfo("_query", "_query", SearchParamType.Token, new Uri(ResourceQuery), baseResourceTypes: new List <string>()
            {
                "Patient"
            });
            _searchParameterInfos = new[]
            {
                new SearchParameterInfo("_id", "_id", SearchParamType.Token, new Uri(ResourceId)),
                new SearchParameterInfo("_lastUpdated", "_lastUpdated", SearchParamType.Token, new Uri(ResourceLastUpdated)),
                new SearchParameterInfo("_profile", "_profile", SearchParamType.Token, new Uri(ResourceProfile)),
                new SearchParameterInfo("_security", "_security", SearchParamType.Token, new Uri(ResourceSecurity)),
                _queryParameter,
            };

            _testSearchParamInfo = new SearchParameterInfo("_test", "_test", SearchParamType.Special, new Uri(ResourceTest));

            _searchParameterSupportResolver
            .IsSearchParameterSupported(Arg.Any <SearchParameterInfo>())
            .Returns((false, false));

            _searchParameterSupportResolver
            .IsSearchParameterSupported(Arg.Is(_searchParameterInfos[4]))
            .Returns((true, false));

            var searchParameterDataStoreValidator = Substitute.For <IDataStoreSearchParameterValidator>();

            searchParameterDataStoreValidator.ValidateSearchParameter(Arg.Any <SearchParameterInfo>(), out Arg.Any <string>()).Returns(true, null);

            var searchService = Substitute.For <ISearchService>();

            _searchParameterOperations = new SearchParameterOperations(
                _manager,
                _searchParameterDefinitionManager,
                ModelInfoProvider.Instance,
                _searchParameterSupportResolver,
                searchParameterDataStoreValidator,
                () => searchService.CreateMockScope(),
                NullLogger <SearchParameterOperations> .Instance);
        }
        public async Task GivenExistingSearchParameters_WhenStartingSearchParameterDefinitionManager_ThenExistingParametersAdded()
        {
            // Create some existing search paramters that will be returned when searching for resources
            // of type SearchParameter
            var searchParam = new SearchParameter()
            {
                Id   = "id",
                Url  = "http://test/Patient-preexisting",
                Type = Hl7.Fhir.Model.SearchParamType.String,
                Base = new List <ResourceType?>()
                {
                    ResourceType.Patient
                },
                Expression = "Patient.name",
                Name       = "preexisting",
                Code       = "preexisting",
            };
            SearchResult result = GetSearchResultFromSearchParam(searchParam, "token");

            var searchParam2 = new SearchParameter()
            {
                Id   = "id2",
                Url  = "http://test/Patient-preexisting2",
                Type = Hl7.Fhir.Model.SearchParamType.String,
                Base = new List <ResourceType?>()
                {
                    ResourceType.Patient
                },
                Expression = "Patient.name",
                Name       = "preexisting2",
                Code       = "preexisting2",
            };
            SearchResult result2 = GetSearchResultFromSearchParam(searchParam2, "token2");

            var searchParam3 = new SearchParameter()
            {
                Id   = "QuestionnaireResponse-questionnaire2",
                Url  = "http://hl7.org/fhir/SearchParameter/QuestionnaireResponse-questionnaire2",
                Type = Hl7.Fhir.Model.SearchParamType.Reference,
                Base = new List <ResourceType?>()
                {
                    ResourceType.QuestionnaireResponse
                },
                Expression = "QuestionnaireResponse.questionnaire",
                Name       = "questionnaire2",
                Code       = "questionnaire2",
            };
            SearchResult result3 = GetSearchResultFromSearchParam(searchParam3, "token3");

            var searchParam4 = new SearchParameter()
            {
                Id   = "QuestionnaireResponse-questionnaire",
                Url  = "http://hl7.org/fhir/SearchParameter/QuestionnaireResponse-questionnaire",
                Type = Hl7.Fhir.Model.SearchParamType.Reference,
                Base = new List <ResourceType?>()
                {
                    ResourceType.QuestionnaireResponse
                },
                Expression = "QuestionnaireResponse.questionnaire",
                Name       = "questionnaire",
                Code       = "questionnaire",
            };
            SearchResult result4 = GetSearchResultFromSearchParam(searchParam4, null);

            var searchService = Substitute.For <ISearchService>();

            searchService.SearchAsync(Arg.Is <SearchOptions>(options => options.ContinuationToken == null), Arg.Any <CancellationToken>())
            .Returns(result);
            searchService.SearchAsync(
                Arg.Is <SearchOptions>(
                    options => options.ContinuationToken == "token"),
                Arg.Any <CancellationToken>())
            .Returns(result2);
            searchService.SearchAsync(
                Arg.Is <SearchOptions>(
                    options => options.ContinuationToken == "token2"),
                Arg.Any <CancellationToken>())
            .Returns(result3);
            searchService.SearchAsync(
                Arg.Is <SearchOptions>(
                    options => options.ContinuationToken == "token3"),
                Arg.Any <CancellationToken>())
            .Returns(result4);

            var dataStoreSearchParamValidator = Substitute.For <IDataStoreSearchParameterValidator>();

            dataStoreSearchParamValidator.ValidateSearchParameter(Arg.Any <SearchParameterInfo>(), out Arg.Any <string>()).Returns(true);

            _searchParameterSupportResolver
            .IsSearchParameterSupported(Arg.Is <SearchParameterInfo>(s => s.Name.StartsWith("preexisting")))
            .Returns((true, false));

            var searchParameterDefinitionManager = new SearchParameterDefinitionManager(ModelInfoProvider.Instance, _mediator, () => searchService.CreateMockScope(), NullLogger <SearchParameterDefinitionManager> .Instance);

            await searchParameterDefinitionManager.EnsureInitializedAsync(CancellationToken.None);

            var statusManager = new SearchParameterStatusManager(
                _searchParameterStatusDataStore,
                searchParameterDefinitionManager,
                _searchParameterSupportResolver,
                _mediator,
                NullLogger <SearchParameterStatusManager> .Instance);

            await statusManager.EnsureInitializedAsync(CancellationToken.None);

            var patientParams = searchParameterDefinitionManager.GetSearchParameters("Patient");

            Assert.False(patientParams.Where(p => p.Name == "preexisting").First().IsSearchable);
            Assert.True(patientParams.Where(p => p.Name == "preexisting2").First().IsSearchable);

            var questionnaireParams = searchParameterDefinitionManager.GetSearchParameters("QuestionnaireResponse");

            Assert.Single(questionnaireParams.Where(p => p.Name == "questionnaire2"));
        }