// Copyright (c) Microsoft. All rights reserved. using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using Microsoft.SemanticKernel.Connectors.CosmosMongoDB; using MongoDB.Driver; using VectorData.ConformanceTests; using Xunit; namespace CosmosMongoDB.ConformanceTests; public class CosmosMongoDependencyInjectionTests : DependencyInjectionTests.Record>, string, DependencyInjectionTests.Record> { protected const string ConnectionString = "mongodb://localhost:27017"; protected const string DatabaseName = "dbName"; protected override void PopulateConfiguration(ConfigurationManager configuration, object? serviceKey = null) => configuration.AddInMemoryCollection( [ new(CreateConfigKey("CosmosMongo", serviceKey, "ConnectionString"), ConnectionString), new(CreateConfigKey("CosmosMongo", serviceKey, "DatabaseName"), DatabaseName), ]); private static string ConnectionStringProvider(IServiceProvider sp) => sp.GetRequiredService().GetRequiredSection("CosmosMongo:ConnectionString").Value!; private static string ConnectionStringProvider(IServiceProvider sp, object serviceKey) => sp.GetRequiredService().GetRequiredSection(CreateConfigKey("CosmosMongo", serviceKey, "ConnectionString")).Value!; private static string DatabaseNameProvider(IServiceProvider sp) => sp.GetRequiredService().GetRequiredSection("CosmosMongo:DatabaseName").Value!; private static string DatabaseNameProvider(IServiceProvider sp, object serviceKey) => sp.GetRequiredService().GetRequiredSection(CreateConfigKey("CosmosMongo", serviceKey, "DatabaseName")).Value!; public override IEnumerable> CollectionDelegates { get { yield return (services, serviceKey, name, lifetime) => serviceKey is null ? services .AddSingleton(sp => new MongoClient(MongoClientSettings.FromConnectionString(ConnectionString))) .AddSingleton(sp => sp.GetRequiredService().GetDatabase(DatabaseName)) .AddCosmosMongoCollection(name, lifetime: lifetime) : services .AddSingleton(sp => new MongoClient(MongoClientSettings.FromConnectionString(ConnectionString))) .AddSingleton(sp => sp.GetRequiredService().GetDatabase(DatabaseName)) .AddKeyedCosmosMongoCollection(serviceKey, name, lifetime: lifetime); yield return (services, serviceKey, name, lifetime) => serviceKey is null ? services.AddCosmosMongoCollection( name, ConnectionString, DatabaseName, lifetime: lifetime) : services.AddKeyedCosmosMongoCollection( serviceKey, name, ConnectionString, DatabaseName, lifetime: lifetime); yield return (services, serviceKey, name, lifetime) => serviceKey is null ? services.AddCosmosMongoCollection( name, ConnectionStringProvider, DatabaseNameProvider, lifetime: lifetime) : services.AddKeyedCosmosMongoCollection( serviceKey, name, sp => ConnectionStringProvider(sp, serviceKey), sp => DatabaseNameProvider(sp, serviceKey), lifetime: lifetime); } } public override IEnumerable> StoreDelegates { get { yield return (services, serviceKey, lifetime) => serviceKey is null ? services.AddCosmosMongoVectorStore( ConnectionString, DatabaseName, lifetime: lifetime) : services.AddKeyedCosmosMongoVectorStore( serviceKey, ConnectionString, DatabaseName, lifetime: lifetime); yield return (services, serviceKey, lifetime) => serviceKey is null ? services .AddSingleton(sp => new MongoClient(MongoClientSettings.FromConnectionString(ConnectionString))) .AddSingleton(sp => sp.GetRequiredService().GetDatabase(DatabaseName)) .AddCosmosMongoVectorStore(lifetime: lifetime) : services .AddSingleton(sp => new MongoClient(MongoClientSettings.FromConnectionString(ConnectionString))) .AddSingleton(sp => sp.GetRequiredService().GetDatabase(DatabaseName)) .AddKeyedCosmosMongoVectorStore(serviceKey, lifetime: lifetime); } } [Fact] public void ConnectionStringProviderCantBeNull() { IServiceCollection services = new ServiceCollection(); Assert.Throws(() => services.AddCosmosMongoCollection( name: "notNull", connectionStringProvider: null!, databaseNameProvider: DatabaseNameProvider)); Assert.Throws(() => services.AddKeyedCosmosMongoCollection( serviceKey: "notNull", name: "notNull", connectionStringProvider: null!, databaseNameProvider: DatabaseNameProvider)); } [Fact] public void DatabaseNameProviderCantBeNull() { IServiceCollection services = new ServiceCollection(); Assert.Throws(() => services.AddCosmosMongoCollection( name: "notNull", connectionStringProvider: ConnectionStringProvider, databaseNameProvider: null!)); Assert.Throws(() => services.AddKeyedCosmosMongoCollection( serviceKey: "notNull", name: "notNull", connectionStringProvider: ConnectionStringProvider, databaseNameProvider: null!)); } [Fact] public void ConnectionStringCantBeNullOrEmpty() { IServiceCollection services = new ServiceCollection(); Assert.Throws(() => services.AddCosmosMongoVectorStore(connectionString: null!, DatabaseName)); Assert.Throws(() => services.AddKeyedCosmosMongoVectorStore(serviceKey: "notNull", connectionString: null!, DatabaseName)); Assert.Throws(() => services.AddCosmosMongoCollection( name: "notNull", connectionString: null!, DatabaseName)); Assert.Throws(() => services.AddCosmosMongoCollection( name: "notNull", connectionString: "", DatabaseName)); Assert.Throws(() => services.AddKeyedCosmosMongoCollection( serviceKey: "notNull", name: "notNull", connectionString: null!, DatabaseName)); Assert.Throws(() => services.AddKeyedCosmosMongoCollection( serviceKey: "notNull", name: "notNull", connectionString: "", DatabaseName)); } [Fact] public void DatabaseNameCantBeNullOrEmpty() { IServiceCollection services = new ServiceCollection(); Assert.Throws(() => services.AddCosmosMongoVectorStore(ConnectionString, databaseName: null!)); Assert.Throws(() => services.AddKeyedCosmosMongoVectorStore(serviceKey: "notNull", ConnectionString, databaseName: null!)); Assert.Throws(() => services.AddCosmosMongoCollection( name: "notNull", ConnectionString, databaseName: null!)); Assert.Throws(() => services.AddCosmosMongoCollection( name: "notNull", ConnectionString, databaseName: "")); Assert.Throws(() => services.AddKeyedCosmosMongoCollection( serviceKey: "notNull", name: "notNull", ConnectionString, databaseName: null!)); Assert.Throws(() => services.AddKeyedCosmosMongoCollection( serviceKey: "notNull", name: "notNull", ConnectionString, databaseName: "")); } }