public static SearchParameterDefinitionManager CreateSearchParameterDefinitionManager() { var manager = new SearchParameterDefinitionManager(new FhirJsonParser(), ModelInfoProvider.Instance); manager.Start(); return(manager); }
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); }
private async Task <IReadOnlyCollection <(SearchParameterTypeResult result, bool hasConverter, IFhirNodeToSearchValueTypeConverter converter)> > GetConvertsForSearchParameters( string resourceType, SearchParameterInfo parameterInfo) { var parsed = SearchParameterFixtureData.Compiler.Parse(parameterInfo.Expression); SearchParameterDefinitionManager searchParameterDefinitionManager = await _fixture.GetSearchDefinitionManagerAsync(); (SearchParamType Type, Expression, Uri DefinitionUrl)[] componentExpressions = parameterInfo.Component
public async Task ListAllUnsupportedTypes() { var unsupported = new UnsupportedSearchParameters(); SearchParameterDefinitionManager manager = await SearchParameterFixtureData.CreateSearchParameterDefinitionManagerAsync(ModelInfoProvider.Instance); var resourceAndSearchParameters = ModelInfoProvider.Instance .GetResourceTypeNames() .Select(resourceType => (resourceType, parameters: manager.GetSearchParameters(resourceType))); foreach (var searchParameterRow in resourceAndSearchParameters) { foreach (SearchParameterInfo parameterInfo in searchParameterRow.parameters) { if (parameterInfo.Code != "_type") { var converters = await GetConvertsForSearchParameters(searchParameterRow.resourceType, parameterInfo); if (converters.All(x => x.hasConverter == false)) { unsupported.Unsupported.Add(parameterInfo.Url); } else if (converters.Any(x => x.hasConverter == false)) { unsupported.PartialSupport.Add(parameterInfo.Url); } } } } // Print the current state to the console _outputHelper.WriteLine(JsonConvert.SerializeObject(unsupported, new JsonSerializerSettings { NullValueHandling = NullValueHandling.Ignore, Formatting = Formatting.Indented, })); // Check this against the list already in the system: var systemUnsupported = new UnsupportedSearchParameters(); foreach (var searchParameter in resourceAndSearchParameters.SelectMany(x => x.parameters)) { if (!searchParameter.IsSupported) { systemUnsupported.Unsupported.Add(searchParameter.Url); } else if (searchParameter.IsPartiallySupported) { systemUnsupported.PartialSupport.Add(searchParameter.Url); } } // Expect that the static file "unsupported-search-parameters.json" equals the generated list Assert.Equal(systemUnsupported.Unsupported, unsupported.Unsupported); Assert.Equal(systemUnsupported.PartialSupport, unsupported.PartialSupport); }
public FhirStorageTests(FhirStorageTestsFixture fixture) { _fixture = fixture; _capabilityStatement = fixture.CapabilityStatement; _deserializer = fixture.Deserializer; _dataStore = fixture.DataStore; _fhirJsonParser = fixture.JsonParser; _conformanceProvider = fixture.ConformanceProvider; _searchParameterDefinitionManager = fixture.SearchParameterDefinitionManager; Mediator = fixture.Mediator; }
public SqlServerFhirStorageTestHelper( string initialConnectionString, string masterDatabaseName, SearchParameterDefinitionManager searchParameterDefinitionManager, SqlServerFhirModel sqlServerFhirModel, ISqlConnectionFactory sqlConnectionFactory) { EnsureArg.IsNotNull(searchParameterDefinitionManager, nameof(searchParameterDefinitionManager)); EnsureArg.IsNotNull(sqlServerFhirModel, nameof(sqlServerFhirModel)); EnsureArg.IsNotNull(sqlConnectionFactory, nameof(sqlConnectionFactory)); _masterDatabaseName = masterDatabaseName; _initialConnectionString = initialConnectionString; _searchParameterDefinitionManager = searchParameterDefinitionManager; _sqlServerFhirModel = sqlServerFhirModel; _sqlConnectionFactory = sqlConnectionFactory; }
public async Task InitializeAsync() { _fhirOperationDataStore = _fixture.OperationDataStore; _fhirStorageTestHelper = _fixture.TestHelper; _scopedOperationDataStore = _fhirOperationDataStore.CreateMockScope(); _scopedDataStore = _fixture.DataStore.CreateMockScope(); _jobConfiguration = new ReindexJobConfiguration(); IOptions <ReindexJobConfiguration> optionsReindexConfig = Substitute.For <IOptions <ReindexJobConfiguration> >(); optionsReindexConfig.Value.Returns(_jobConfiguration); _searchParameterDefinitionManager = _fixture.SearchParameterDefinitionManager; _supportedSearchParameterDefinitionManager = _fixture.SupportedSearchParameterDefinitionManager; ResourceWrapperFactory wrapperFactory = Mock.TypeWithArguments <ResourceWrapperFactory>( new RawResourceFactory(new FhirJsonSerializer()), new FhirRequestContextAccessor(), _searchIndexer, _searchParameterDefinitionManager, Deserializers.ResourceDeserializer); _searchParameterStatusManager = _fixture.SearchParameterStatusManager; _createReindexRequestHandler = new CreateReindexRequestHandler( _fhirOperationDataStore, DisabledFhirAuthorizationService.Instance, optionsReindexConfig, _searchParameterDefinitionManager, _searchParameterOperations); _reindexUtilities = new ReindexUtilities( () => _scopedDataStore, _searchIndexer, Deserializers.ResourceDeserializer, _supportedSearchParameterDefinitionManager, _searchParameterStatusManager, wrapperFactory); _searchService = _fixture.SearchService.CreateMockScope(); await _fhirStorageTestHelper.DeleteAllReindexJobRecordsAsync(CancellationToken.None); _throttleController.GetThrottleBasedDelay().Returns(0); _throttleController.GetThrottleBatchSize().Returns(100U); }
public static async Task <SearchParameterDefinitionManager> CreateSearchParameterDefinitionManagerAsync(IModelInfoProvider modelInfoProvider) { var definitionManager = new SearchParameterDefinitionManager(modelInfoProvider); await definitionManager.StartAsync(CancellationToken.None); var statusRegistry = new FilebasedSearchParameterStatusDataStore( definitionManager, modelInfoProvider); var statusManager = new SearchParameterStatusManager( statusRegistry, definitionManager, new SearchParameterSupportResolver(definitionManager, await GetFhirNodeToSearchValueTypeConverterManagerAsync()), Substitute.For <IMediator>()); await statusManager.EnsureInitialized(); return(definitionManager); }
public ReindexJobTests(FhirStorageTestsFixture fixture) { _fhirOperationDataStore = fixture.OperationDataStore; _fhirStorageTestHelper = fixture.TestHelper; _scopedOperationDataStore = fixture.OperationDataStore.CreateMockScope(); _scopedOperationDataStore = fixture.OperationDataStore.CreateMockScope(); _scopedDataStore = fixture.DataStore.CreateMockScope(); _jobConfiguration = new ReindexJobConfiguration(); IOptions <ReindexJobConfiguration> optionsReindexConfig = Substitute.For <IOptions <ReindexJobConfiguration> >(); optionsReindexConfig.Value.Returns(_jobConfiguration); _searchParameterDefinitionManager = new SearchParameterDefinitionManager(ModelInfoProvider.Instance); _searchParameterDefinitionManager.Start(); _searchParameterDefinitionManager.UpdateSearchParameterHashMap(new Dictionary <string, string>() { { "Patient", "newHash" } }); _supportedSearchParameterDefinitionManager = new SupportedSearchParameterDefinitionManager(_searchParameterDefinitionManager); var fhirRequestContextAccessor = Substitute.For <IFhirRequestContextAccessor>(); _searchableSearchParameterDefinitionManager = new SearchableSearchParameterDefinitionManager(_searchParameterDefinitionManager, fhirRequestContextAccessor); _createReindexRequestHandler = new CreateReindexRequestHandler( _fhirOperationDataStore, DisabledFhirAuthorizationService.Instance, optionsReindexConfig, _searchParameterDefinitionManager); _reindexUtilities = new ReindexUtilities( () => _scopedDataStore, _searchIndexer, Deserializers.ResourceDeserializer, _supportedSearchParameterDefinitionManager, _searchParameterRegistry); coreOptions.Value.Returns(new CoreFeatureConfiguration()); var searchParameterExpressionParser = new SearchParameterExpressionParser(() => _searchParameterDefinitionManager, new ReferenceSearchValueParser(fhirRequestContextAccessor)); var expressionParser = new ExpressionParser(() => _searchableSearchParameterDefinitionManager, searchParameterExpressionParser); var searchOptionsFactory = new SearchOptionsFactory(expressionParser, () => _searchableSearchParameterDefinitionManager, coreOptions, fhirRequestContextAccessor, NullLogger <SearchOptionsFactory> .Instance); var cosmosSearchService = new FhirCosmosSearchService(searchOptionsFactory, fixture.DataStore as CosmosFhirDataStore, new QueryBuilder()) as ISearchService; _searchService = cosmosSearchService.CreateMockScope(); }
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); }
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); }
public static async Task <SearchParameterDefinitionManager> CreateSearchParameterDefinitionManagerAsync(IModelInfoProvider modelInfoProvider, IMediator mediator) { var searchService = Substitute.For <ISearchService>(); var definitionManager = new SearchParameterDefinitionManager(modelInfoProvider, mediator, () => searchService.CreateMockScope(), NullLogger <SearchParameterDefinitionManager> .Instance); await definitionManager.StartAsync(CancellationToken.None); await definitionManager.EnsureInitializedAsync(CancellationToken.None); var statusRegistry = new FilebasedSearchParameterStatusDataStore( definitionManager, modelInfoProvider); var statusManager = new SearchParameterStatusManager( statusRegistry, definitionManager, new SearchParameterSupportResolver(await GetFhirTypedElementToSearchValueConverterManagerAsync()), Substitute.For <IMediator>(), NullLogger <SearchParameterStatusManager> .Instance); await statusManager.EnsureInitializedAsync(CancellationToken.None); return(definitionManager); }
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 SqlServerFhirStorageTestsFixture() { var initialConnectionString = Environment.GetEnvironmentVariable("SqlServer:ConnectionString") ?? LocalConnectionString; _databaseName = $"FHIRINTEGRATIONTEST_{DateTimeOffset.UtcNow.ToUnixTimeSeconds()}_{BigInteger.Abs(new BigInteger(Guid.NewGuid().ToByteArray()))}"; TestConnectionString = new SqlConnectionStringBuilder(initialConnectionString) { InitialCatalog = _databaseName }.ToString(); var schemaOptions = new SqlServerSchemaOptions { AutomaticUpdatesEnabled = true }; var config = new SqlServerDataStoreConfiguration { ConnectionString = TestConnectionString, Initialize = true, SchemaOptions = schemaOptions }; var schemaInformation = new SchemaInformation(SchemaVersionConstants.Min, SchemaVersionConstants.Max); var scriptProvider = new ScriptProvider <SchemaVersion>(); var baseScriptProvider = new BaseScriptProvider(); var mediator = Substitute.For <IMediator>(); var sqlConnectionFactory = new DefaultSqlConnectionFactory(config); var schemaUpgradeRunner = new SchemaUpgradeRunner(scriptProvider, baseScriptProvider, mediator, NullLogger <SchemaUpgradeRunner> .Instance, sqlConnectionFactory); _schemaInitializer = new SchemaInitializer(config, schemaUpgradeRunner, schemaInformation, sqlConnectionFactory, NullLogger <SchemaInitializer> .Instance); var searchParameterDefinitionManager = new SearchParameterDefinitionManager(ModelInfoProvider.Instance); _filebasedSearchParameterStatusDataStore = new FilebasedSearchParameterStatusDataStore(searchParameterDefinitionManager, ModelInfoProvider.Instance); var securityConfiguration = new SecurityConfiguration { PrincipalClaims = { "oid" } }; var sqlServerFhirModel = new SqlServerFhirModel( config, schemaInformation, searchParameterDefinitionManager, () => _filebasedSearchParameterStatusDataStore, Options.Create(securityConfiguration), NullLogger <SqlServerFhirModel> .Instance); var serviceCollection = new ServiceCollection(); serviceCollection.AddSqlServerTableRowParameterGenerators(); serviceCollection.AddSingleton(sqlServerFhirModel); ServiceProvider serviceProvider = serviceCollection.BuildServiceProvider(); var upsertResourceTvpGenerator = serviceProvider.GetRequiredService <VLatest.UpsertResourceTvpGenerator <ResourceMetadata> >(); var upsertSearchParamsTvpGenerator = serviceProvider.GetRequiredService <VLatest.UpsertSearchParamsTvpGenerator <List <ResourceSearchParameterStatus> > >(); var searchParameterToSearchValueTypeMap = new SearchParameterToSearchValueTypeMap(new SupportedSearchParameterDefinitionManager(searchParameterDefinitionManager)); SqlTransactionHandler = new SqlTransactionHandler(); SqlConnectionWrapperFactory = new SqlConnectionWrapperFactory(SqlTransactionHandler, new SqlCommandWrapperFactory(), sqlConnectionFactory); SqlServerSearchParameterStatusDataStore = new SqlServerSearchParameterStatusDataStore( () => SqlConnectionWrapperFactory.CreateMockScope(), upsertSearchParamsTvpGenerator, () => _filebasedSearchParameterStatusDataStore, schemaInformation); _fhirDataStore = new SqlServerFhirDataStore(config, sqlServerFhirModel, searchParameterToSearchValueTypeMap, upsertResourceTvpGenerator, Options.Create(new CoreFeatureConfiguration()), SqlConnectionWrapperFactory, NullLogger <SqlServerFhirDataStore> .Instance, schemaInformation); _fhirOperationDataStore = new SqlServerFhirOperationDataStore(SqlConnectionWrapperFactory, NullLogger <SqlServerFhirOperationDataStore> .Instance); _testHelper = new SqlServerFhirStorageTestHelper(initialConnectionString, MasterDatabaseName, searchParameterDefinitionManager, sqlServerFhirModel, sqlConnectionFactory); }
public async Task InitializeAsync() { var fhirStoredProcs = typeof(IStoredProcedure).Assembly .GetTypes() .Where(x => !x.IsAbstract && typeof(IStoredProcedure).IsAssignableFrom(x)) .ToArray() .Select(type => (IStoredProcedure)Activator.CreateInstance(type)); var optionsMonitor = Substitute.For <IOptionsMonitor <CosmosCollectionConfiguration> >(); optionsMonitor.Get(CosmosDb.Constants.CollectionConfigurationName).Returns(_cosmosCollectionConfiguration); var searchParameterDefinitionManager = new SearchParameterDefinitionManager(ModelInfoProvider.Instance); searchParameterDefinitionManager.Start(); _filebasedSearchParameterRegistry = new FilebasedSearchParameterRegistry(searchParameterDefinitionManager, ModelInfoProvider.Instance); var updaters = new ICollectionUpdater[] { new FhirCollectionSettingsUpdater(_cosmosDataStoreConfiguration, optionsMonitor, NullLogger <FhirCollectionSettingsUpdater> .Instance), new StoredProcedureInstaller(fhirStoredProcs), new CosmosDbStatusRegistryInitializer( () => _filebasedSearchParameterRegistry, new CosmosQueryFactory( new CosmosResponseProcessor(Substitute.For <IFhirRequestContextAccessor>(), Substitute.For <IMediator>(), NullLogger <CosmosResponseProcessor> .Instance), NullFhirCosmosQueryLogger.Instance)), }; var dbLock = new CosmosDbDistributedLockFactory(Substitute.For <Func <IScoped <Container> > >(), NullLogger <CosmosDbDistributedLock> .Instance); var upgradeManager = new CollectionUpgradeManager(updaters, _cosmosDataStoreConfiguration, optionsMonitor, dbLock, NullLogger <CollectionUpgradeManager> .Instance); ICosmosClientTestProvider testProvider = new CosmosClientReadWriteTestProvider(); var fhirRequestContextAccessor = new FhirRequestContextAccessor(); var cosmosResponseProcessor = Substitute.For <ICosmosResponseProcessor>(); var responseProcessor = new CosmosResponseProcessor(fhirRequestContextAccessor, Substitute.For <IMediator>(), NullLogger <CosmosResponseProcessor> .Instance); var handler = new FhirCosmosResponseHandler(() => new NonDisposingScope(_container), _cosmosDataStoreConfiguration, fhirRequestContextAccessor, responseProcessor); var documentClientInitializer = new FhirCosmosClientInitializer(testProvider, new[] { handler }, NullLogger <FhirCosmosClientInitializer> .Instance); _cosmosClient = documentClientInitializer.CreateCosmosClient(_cosmosDataStoreConfiguration); var fhirCollectionInitializer = new CollectionInitializer(_cosmosCollectionConfiguration.CollectionId, _cosmosDataStoreConfiguration, _cosmosCollectionConfiguration.InitialCollectionThroughput, upgradeManager, NullLogger <CollectionInitializer> .Instance); // Cosmos DB emulators throws errors when multiple collections are initialized concurrently. // Use the semaphore to only allow one initialization at a time. await CollectionInitializationSemaphore.WaitAsync(); try { await documentClientInitializer.InitializeDataStore(_cosmosClient, _cosmosDataStoreConfiguration, new List <ICollectionInitializer> { fhirCollectionInitializer }); _container = documentClientInitializer.CreateFhirContainer(_cosmosClient, _cosmosDataStoreConfiguration.DatabaseId, _cosmosCollectionConfiguration.CollectionId); } finally { CollectionInitializationSemaphore.Release(); } var cosmosDocumentQueryFactory = new CosmosQueryFactory(cosmosResponseProcessor, NullFhirCosmosQueryLogger.Instance); var documentClient = new NonDisposingScope(_container); _fhirDataStore = new CosmosFhirDataStore( documentClient, _cosmosDataStoreConfiguration, optionsMonitor, cosmosDocumentQueryFactory, new RetryExceptionPolicyFactory(_cosmosDataStoreConfiguration), NullLogger <CosmosFhirDataStore> .Instance, new VersionSpecificModelInfoProvider(), Options.Create(new CoreFeatureConfiguration())); _fhirOperationDataStore = new CosmosFhirOperationDataStore( documentClient, _cosmosDataStoreConfiguration, optionsMonitor, new RetryExceptionPolicyFactory(_cosmosDataStoreConfiguration), new CosmosQueryFactory(responseProcessor, new NullFhirCosmosQueryLogger()), NullLogger <CosmosFhirOperationDataStore> .Instance); _fhirStorageTestHelper = new CosmosDbFhirStorageTestHelper( _container, _cosmosDataStoreConfiguration.DatabaseId, _cosmosCollectionConfiguration.CollectionId); }
private async Task <(SqlServerFhirStorageTestHelper testHelper, SchemaUpgradeRunner upgradeRunner)> SetupTestHelperAndCreateDatabase(string databaseName, int maxSchemaVersion, bool forceIncrementalSchemaUpgrade) { var initialConnectionString = Environment.GetEnvironmentVariable("SqlServer:ConnectionString") ?? LocalConnectionString; var searchService = Substitute.For <ISearchService>(); ISearchParameterDefinitionManager defManager = new SearchParameterDefinitionManager(ModelInfoProvider.Instance, Substitute.For <IMediator>(), () => searchService.CreateMockScope(), NullLogger <SearchParameterDefinitionManager> .Instance); FilebasedSearchParameterStatusDataStore statusStore = new FilebasedSearchParameterStatusDataStore(defManager, ModelInfoProvider.Instance); var schemaInformation = new SchemaInformation(SchemaVersionConstants.Min, maxSchemaVersion); var connectionString = new SqlConnectionStringBuilder(initialConnectionString) { InitialCatalog = databaseName }.ToString(); var schemaOptions = new SqlServerSchemaOptions { AutomaticUpdatesEnabled = true }; var config = new SqlServerDataStoreConfiguration { ConnectionString = connectionString, Initialize = true, SchemaOptions = schemaOptions }; var sqlConnectionStringProvider = new DefaultSqlConnectionStringProvider(config); var securityConfiguration = new SecurityConfiguration { PrincipalClaims = { "oid" } }; SqlServerFhirModel sqlServerFhirModel = new SqlServerFhirModel( schemaInformation, defManager, () => statusStore, Options.Create(securityConfiguration), sqlConnectionStringProvider, Substitute.For <IMediator>(), NullLogger <SqlServerFhirModel> .Instance); var sqlConnectionFactory = new DefaultSqlConnectionFactory(sqlConnectionStringProvider); var testHelper = new SqlServerFhirStorageTestHelper( initialConnectionString, MasterDatabaseName, sqlServerFhirModel, sqlConnectionFactory); var scriptProvider = new ScriptProvider <SchemaVersion>(); var baseScriptProvider = new BaseScriptProvider(); var mediator = Substitute.For <IMediator>(); var schemaManagerDataStore = new SchemaManagerDataStore(sqlConnectionFactory); var schemaUpgradeRunner = new SchemaUpgradeRunner( scriptProvider, baseScriptProvider, NullLogger <SchemaUpgradeRunner> .Instance, sqlConnectionFactory, schemaManagerDataStore); var schemaInitializer = new SchemaInitializer( config, schemaUpgradeRunner, schemaInformation, sqlConnectionFactory, sqlConnectionStringProvider, mediator, NullLogger <SchemaInitializer> .Instance); await testHelper.CreateAndInitializeDatabase( databaseName, maxSchemaVersion, forceIncrementalSchemaUpgrade, schemaInitializer); return(testHelper, schemaUpgradeRunner); }
internal SqlServerFhirStorageTestsFixture(int maximumSupportedSchemaVersion, string databaseName, IOptions <CoreFeatureConfiguration> coreFeatures = null) { var initialConnectionString = Environment.GetEnvironmentVariable("SqlServer:ConnectionString") ?? LocalConnectionString; _maximumSupportedSchemaVersion = maximumSupportedSchemaVersion; _databaseName = databaseName; TestConnectionString = new SqlConnectionStringBuilder(initialConnectionString) { InitialCatalog = _databaseName }.ToString(); var schemaOptions = new SqlServerSchemaOptions { AutomaticUpdatesEnabled = true }; var config = Options.Create(new SqlServerDataStoreConfiguration { ConnectionString = TestConnectionString, Initialize = true, SchemaOptions = schemaOptions, StatementTimeout = TimeSpan.FromMinutes(10) }); SchemaInformation = new SchemaInformation(SchemaVersionConstants.Min, maximumSupportedSchemaVersion); var scriptProvider = new ScriptProvider <SchemaVersion>(); var baseScriptProvider = new BaseScriptProvider(); var mediator = Substitute.For <IMediator>(); var sqlSortingValidator = new SqlServerSortingValidator(SchemaInformation); var sqlConnectionStringProvider = new DefaultSqlConnectionStringProvider(config); SqlConnectionFactory = new DefaultSqlConnectionFactory(sqlConnectionStringProvider); var schemaManagerDataStore = new SchemaManagerDataStore(SqlConnectionFactory, config, NullLogger <SchemaManagerDataStore> .Instance); _schemaUpgradeRunner = new SchemaUpgradeRunner(scriptProvider, baseScriptProvider, NullLogger <SchemaUpgradeRunner> .Instance, SqlConnectionFactory, schemaManagerDataStore); _schemaInitializer = new SchemaInitializer(config, schemaManagerDataStore, _schemaUpgradeRunner, SchemaInformation, SqlConnectionFactory, sqlConnectionStringProvider, mediator, NullLogger <SchemaInitializer> .Instance); _searchParameterDefinitionManager = new SearchParameterDefinitionManager(ModelInfoProvider.Instance, _mediator, () => _searchService.CreateMockScope(), NullLogger <SearchParameterDefinitionManager> .Instance); _searchParameterDefinitionManager.StartAsync(CancellationToken.None); _filebasedSearchParameterStatusDataStore = new FilebasedSearchParameterStatusDataStore(_searchParameterDefinitionManager, ModelInfoProvider.Instance); var securityConfiguration = new SecurityConfiguration { PrincipalClaims = { "oid" } }; var sqlServerFhirModel = new SqlServerFhirModel( SchemaInformation, _searchParameterDefinitionManager, () => _filebasedSearchParameterStatusDataStore, Options.Create(securityConfiguration), SqlConnectionFactory, Substitute.For <IMediator>(), NullLogger <SqlServerFhirModel> .Instance); SqlServerFhirModel = sqlServerFhirModel; var searchParameterToSearchValueTypeMap = new SearchParameterToSearchValueTypeMap(); var serviceCollection = new ServiceCollection(); serviceCollection.AddSqlServerTableRowParameterGenerators(); serviceCollection.AddSingleton(sqlServerFhirModel); serviceCollection.AddSingleton <ISqlServerFhirModel>(sqlServerFhirModel); serviceCollection.AddSingleton(searchParameterToSearchValueTypeMap); ServiceProvider serviceProvider = serviceCollection.BuildServiceProvider(); var upsertResourceTvpGeneratorV6 = serviceProvider.GetRequiredService <V6.UpsertResourceTvpGenerator <ResourceMetadata> >(); var upsertResourceTvpGeneratorV7 = serviceProvider.GetRequiredService <V7.UpsertResourceTvpGenerator <ResourceMetadata> >(); var upsertResourceTvpGeneratorV13 = serviceProvider.GetRequiredService <V13.UpsertResourceTvpGenerator <IReadOnlyList <ResourceWrapper> > >(); var upsertResourceTvpGeneratorV17 = serviceProvider.GetRequiredService <V17.UpsertResourceTvpGenerator <IReadOnlyList <ResourceWrapper> > >(); var upsertResourceTvpGeneratorVLatest = serviceProvider.GetRequiredService <VLatest.UpsertResourceTvpGenerator <IReadOnlyList <ResourceWrapper> > >(); var reindexResourceTvpGeneratorV17 = serviceProvider.GetRequiredService <V17.ReindexResourceTvpGenerator <IReadOnlyList <ResourceWrapper> > >(); var bulkReindexResourceTvpGeneratorV17 = serviceProvider.GetRequiredService <V17.BulkReindexResourcesTvpGenerator <IReadOnlyList <ResourceWrapper> > >(); var reindexResourceTvpGeneratorVLatest = serviceProvider.GetRequiredService <VLatest.ReindexResourceTvpGenerator <IReadOnlyList <ResourceWrapper> > >(); var bulkReindexResourceTvpGeneratorVLatest = serviceProvider.GetRequiredService <VLatest.BulkReindexResourcesTvpGenerator <IReadOnlyList <ResourceWrapper> > >(); var upsertSearchParamsTvpGenerator = serviceProvider.GetRequiredService <VLatest.UpsertSearchParamsTvpGenerator <List <ResourceSearchParameterStatus> > >(); _supportedSearchParameterDefinitionManager = new SupportedSearchParameterDefinitionManager(_searchParameterDefinitionManager); SqlTransactionHandler = new SqlTransactionHandler(); SqlConnectionWrapperFactory = new SqlConnectionWrapperFactory(SqlTransactionHandler, new SqlCommandWrapperFactory(), SqlConnectionFactory); SqlServerSearchParameterStatusDataStore = new SqlServerSearchParameterStatusDataStore( () => SqlConnectionWrapperFactory.CreateMockScope(), upsertSearchParamsTvpGenerator, () => _filebasedSearchParameterStatusDataStore, SchemaInformation, sqlSortingValidator, sqlServerFhirModel, _searchParameterDefinitionManager); IOptions <CoreFeatureConfiguration> options = coreFeatures ?? Options.Create(new CoreFeatureConfiguration()); _fhirDataStore = new SqlServerFhirDataStore( sqlServerFhirModel, searchParameterToSearchValueTypeMap, upsertResourceTvpGeneratorV6, upsertResourceTvpGeneratorV7, upsertResourceTvpGeneratorV13, upsertResourceTvpGeneratorV17, upsertResourceTvpGeneratorVLatest, reindexResourceTvpGeneratorV17, reindexResourceTvpGeneratorVLatest, bulkReindexResourceTvpGeneratorV17, bulkReindexResourceTvpGeneratorVLatest, options, SqlConnectionWrapperFactory, new CompressedRawResourceConverter(), NullLogger <SqlServerFhirDataStore> .Instance, SchemaInformation); _fhirOperationDataStore = new SqlServerFhirOperationDataStore(SqlConnectionWrapperFactory, NullLogger <SqlServerFhirOperationDataStore> .Instance); _fhirRequestContextAccessor.RequestContext.CorrelationId.Returns(Guid.NewGuid().ToString()); _fhirRequestContextAccessor.RequestContext.RouteName.Returns("routeName"); var searchableSearchParameterDefinitionManager = new SearchableSearchParameterDefinitionManager(_searchParameterDefinitionManager, _fhirRequestContextAccessor); var searchParameterExpressionParser = new SearchParameterExpressionParser(new ReferenceSearchValueParser(_fhirRequestContextAccessor)); var expressionParser = new ExpressionParser(() => searchableSearchParameterDefinitionManager, searchParameterExpressionParser); var searchOptionsFactory = new SearchOptionsFactory( expressionParser, () => searchableSearchParameterDefinitionManager, options, _fhirRequestContextAccessor, sqlSortingValidator, NullLogger <SearchOptionsFactory> .Instance); var searchParamTableExpressionQueryGeneratorFactory = new SearchParamTableExpressionQueryGeneratorFactory(searchParameterToSearchValueTypeMap); var sqlRootExpressionRewriter = new SqlRootExpressionRewriter(searchParamTableExpressionQueryGeneratorFactory); var chainFlatteningRewriter = new ChainFlatteningRewriter(searchParamTableExpressionQueryGeneratorFactory); var sortRewriter = new SortRewriter(searchParamTableExpressionQueryGeneratorFactory); var partitionEliminationRewriter = new PartitionEliminationRewriter(sqlServerFhirModel, SchemaInformation, () => searchableSearchParameterDefinitionManager); _searchService = new SqlServerSearchService( searchOptionsFactory, _fhirDataStore, sqlServerFhirModel, sqlRootExpressionRewriter, chainFlatteningRewriter, sortRewriter, partitionEliminationRewriter, SqlConnectionWrapperFactory, SchemaInformation, _fhirRequestContextAccessor, new CompressedRawResourceConverter(), NullLogger <SqlServerSearchService> .Instance); ISearchParameterSupportResolver searchParameterSupportResolver = Substitute.For <ISearchParameterSupportResolver>(); searchParameterSupportResolver.IsSearchParameterSupported(Arg.Any <SearchParameterInfo>()).Returns((true, false)); _searchParameterStatusManager = new SearchParameterStatusManager( SqlServerSearchParameterStatusDataStore, _searchParameterDefinitionManager, searchParameterSupportResolver, mediator, NullLogger <SearchParameterStatusManager> .Instance); _testHelper = new SqlServerFhirStorageTestHelper(initialConnectionString, MasterDatabaseName, sqlServerFhirModel, SqlConnectionFactory); }
public ReindexSearchTests(FhirStorageTestsFixture fixture) { _scopedDataStore = fixture.DataStore.CreateMockScope(); _searchService = fixture.SearchService.CreateMockScope(); _searchParameterDefinitionManager = fixture.SearchParameterDefinitionManager; }
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")); }
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 SearchParameterDefinitionManagerTests() { _searchParameterSupportResolver = Substitute.For <ISearchParameterSupportResolver>(); _mediator = Substitute.For <IMediator>(); _searchParameterStatusDataStore = Substitute.For <ISearchParameterStatusDataStore>(); _searchParameterDefinitionManager = new SearchParameterDefinitionManager(ModelInfoProvider.Instance); _fhirRequestContextAccessor = Substitute.For <IFhirRequestContextAccessor>(); _fhirRequestContextAccessor.FhirRequestContext.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", SearchParamType.Token, new Uri(ResourceQuery)); _searchParameterInfos = new[] { new SearchParameterInfo("_id", SearchParamType.Token, new Uri(ResourceId)), new SearchParameterInfo("_lastUpdated", SearchParamType.Token, new Uri(ResourceLastUpdated)), new SearchParameterInfo("_profile", SearchParamType.Token, new Uri(ResourceProfile)), new SearchParameterInfo("_security", SearchParamType.Token, new Uri(ResourceSecurity)), _queryParameter, }; _testSearchParamInfo = new SearchParameterInfo("_test", SearchParamType.Special, new Uri(ResourceTest)); _searchParameterSupportResolver .IsSearchParameterSupported(Arg.Any <SearchParameterInfo>()) .Returns((false, false)); _searchParameterSupportResolver .IsSearchParameterSupported(Arg.Is(_searchParameterInfos[4])) .Returns((true, false)); }
public async Task InitializeAsync() { var fhirStoredProcs = typeof(IStoredProcedure).Assembly .GetTypes() .Where(x => !x.IsAbstract && typeof(IStoredProcedure).IsAssignableFrom(x)) .ToArray() .Select(type => (IStoredProcedure)Activator.CreateInstance(type)); var optionsMonitor = Substitute.For <IOptionsMonitor <CosmosCollectionConfiguration> >(); optionsMonitor.Get(CosmosDb.Constants.CollectionConfigurationName).Returns(_cosmosCollectionConfiguration); _fhirRequestContextAccessor.RequestContext.CorrelationId.Returns(Guid.NewGuid().ToString()); _fhirRequestContextAccessor.RequestContext.RouteName.Returns("routeName"); _searchParameterDefinitionManager = new SearchParameterDefinitionManager(ModelInfoProvider.Instance, _mediator, () => _searchService.CreateMockScope(), NullLogger <SearchParameterDefinitionManager> .Instance); await _searchParameterDefinitionManager.StartAsync(CancellationToken.None); _supportedSearchParameterDefinitionManager = new SupportedSearchParameterDefinitionManager(_searchParameterDefinitionManager); var searchableSearchParameterDefinitionManager = new SearchableSearchParameterDefinitionManager(_searchParameterDefinitionManager, _fhirRequestContextAccessor); _filebasedSearchParameterStatusDataStore = new FilebasedSearchParameterStatusDataStore(_searchParameterDefinitionManager, ModelInfoProvider.Instance); IMediator mediator = Substitute.For <IMediator>(); var updaters = new ICollectionUpdater[] { new FhirCollectionSettingsUpdater(_cosmosDataStoreConfiguration, optionsMonitor, NullLogger <FhirCollectionSettingsUpdater> .Instance), new StoredProcedureInstaller(fhirStoredProcs), new CosmosDbSearchParameterStatusInitializer( () => _filebasedSearchParameterStatusDataStore, new CosmosQueryFactory( new CosmosResponseProcessor(_fhirRequestContextAccessor, mediator, Substitute.For <ICosmosQueryLogger>(), NullLogger <CosmosResponseProcessor> .Instance), NullFhirCosmosQueryLogger.Instance), _cosmosDataStoreConfiguration), }; var dbLock = new CosmosDbDistributedLockFactory(Substitute.For <Func <IScoped <Container> > >(), NullLogger <CosmosDbDistributedLock> .Instance); var upgradeManager = new CollectionUpgradeManager(updaters, _cosmosDataStoreConfiguration, optionsMonitor, dbLock, NullLogger <CollectionUpgradeManager> .Instance); ICosmosClientTestProvider testProvider = new CosmosClientReadWriteTestProvider(); var cosmosResponseProcessor = Substitute.For <ICosmosResponseProcessor>(); var responseProcessor = new CosmosResponseProcessor(_fhirRequestContextAccessor, mediator, Substitute.For <ICosmosQueryLogger>(), NullLogger <CosmosResponseProcessor> .Instance); var handler = new FhirCosmosResponseHandler(() => new NonDisposingScope(_container), _cosmosDataStoreConfiguration, _fhirRequestContextAccessor, responseProcessor); var retryExceptionPolicyFactory = new RetryExceptionPolicyFactory(_cosmosDataStoreConfiguration, _fhirRequestContextAccessor); var documentClientInitializer = new FhirCosmosClientInitializer(testProvider, () => new[] { handler }, retryExceptionPolicyFactory, NullLogger <FhirCosmosClientInitializer> .Instance); _cosmosClient = documentClientInitializer.CreateCosmosClient(_cosmosDataStoreConfiguration); var fhirCollectionInitializer = new CollectionInitializer(_cosmosCollectionConfiguration, _cosmosDataStoreConfiguration, upgradeManager, retryExceptionPolicyFactory, testProvider, NullLogger <CollectionInitializer> .Instance); // Cosmos DB emulators throws errors when multiple collections are initialized concurrently. // Use the semaphore to only allow one initialization at a time. await CollectionInitializationSemaphore.WaitAsync(); try { await documentClientInitializer.InitializeDataStore(_cosmosClient, _cosmosDataStoreConfiguration, new List <ICollectionInitializer> { fhirCollectionInitializer }); _container = documentClientInitializer.CreateFhirContainer(_cosmosClient, _cosmosDataStoreConfiguration.DatabaseId, _cosmosCollectionConfiguration.CollectionId); } finally { CollectionInitializationSemaphore.Release(); } var cosmosDocumentQueryFactory = new CosmosQueryFactory(cosmosResponseProcessor, NullFhirCosmosQueryLogger.Instance); var documentClient = new NonDisposingScope(_container); _searchParameterStatusDataStore = new CosmosDbSearchParameterStatusDataStore( () => documentClient, _cosmosDataStoreConfiguration, cosmosDocumentQueryFactory); IOptions <CoreFeatureConfiguration> options = Options.Create(new CoreFeatureConfiguration()); _fhirDataStore = new CosmosFhirDataStore( documentClient, _cosmosDataStoreConfiguration, optionsMonitor, cosmosDocumentQueryFactory, retryExceptionPolicyFactory, NullLogger <CosmosFhirDataStore> .Instance, options, new Lazy <ISupportedSearchParameterDefinitionManager>(_supportedSearchParameterDefinitionManager), ModelInfoProvider.Instance); _fhirOperationDataStore = new CosmosFhirOperationDataStore( documentClient, _cosmosDataStoreConfiguration, optionsMonitor, retryExceptionPolicyFactory, new CosmosQueryFactory(responseProcessor, new NullFhirCosmosQueryLogger()), NullLogger <CosmosFhirOperationDataStore> .Instance); var searchParameterExpressionParser = new SearchParameterExpressionParser(new ReferenceSearchValueParser(_fhirRequestContextAccessor)); var expressionParser = new ExpressionParser(() => searchableSearchParameterDefinitionManager, searchParameterExpressionParser); var searchOptionsFactory = new SearchOptionsFactory(expressionParser, () => searchableSearchParameterDefinitionManager, options, _fhirRequestContextAccessor, Substitute.For <ISortingValidator>(), NullLogger <SearchOptionsFactory> .Instance); ICosmosDbCollectionPhysicalPartitionInfo cosmosDbPhysicalPartitionInfo = Substitute.For <ICosmosDbCollectionPhysicalPartitionInfo>(); cosmosDbPhysicalPartitionInfo.PhysicalPartitionCount.Returns(1); _searchService = new FhirCosmosSearchService( searchOptionsFactory, _fhirDataStore, new QueryBuilder(), _fhirRequestContextAccessor, _cosmosDataStoreConfiguration, cosmosDbPhysicalPartitionInfo, new QueryPartitionStatisticsCache(), Enumerable.Empty <ICosmosExpressionRewriter>(), NullLogger <FhirCosmosSearchService> .Instance); await _searchParameterDefinitionManager.EnsureInitializedAsync(CancellationToken.None); ISearchParameterSupportResolver searchParameterSupportResolver = Substitute.For <ISearchParameterSupportResolver>(); searchParameterSupportResolver.IsSearchParameterSupported(Arg.Any <SearchParameterInfo>()).Returns((true, false)); _searchParameterStatusManager = new SearchParameterStatusManager( _searchParameterStatusDataStore, _searchParameterDefinitionManager, searchParameterSupportResolver, mediator, NullLogger <SearchParameterStatusManager> .Instance); _fhirStorageTestHelper = new CosmosDbFhirStorageTestHelper(_container); }