using System.Reflection; using Bit.Core.Enums; using Bit.Core.Settings; using Bit.Infrastructure.Dapper; using Bit.Infrastructure.EntityFramework; using Bit.Infrastructure.EntityFramework.Repositories; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; using Xunit.Sdk; namespace Bit.Infrastructure.IntegrationTest; public class DatabaseDataAttribute : DataAttribute { public bool SelfHosted { get; set; } public override IEnumerable GetData(MethodInfo testMethod) { var parameters = testMethod.GetParameters(); var config = DatabaseTheoryAttribute.GetConfiguration(); var serviceProviders = GetDatabaseProviders(config); foreach (var provider in serviceProviders) { var objects = new object[parameters.Length]; for (var i = 0; i < parameters.Length; i++) { objects[i] = provider.GetRequiredService(parameters[i].ParameterType); } yield return objects; } } private IEnumerable GetDatabaseProviders(IConfiguration config) { var configureLogging = (ILoggingBuilder builder) => { if (!config.GetValue("Quiet")) { builder.AddConfiguration(config); builder.AddConsole(); builder.AddDebug(); } }; var databases = config.GetDatabases(); foreach (var database in databases) { if (database.Type == SupportedDatabaseProviders.SqlServer && !database.UseEf) { var dapperSqlServerCollection = new ServiceCollection(); dapperSqlServerCollection.AddLogging(configureLogging); dapperSqlServerCollection.AddDapperRepositories(SelfHosted); var globalSettings = new GlobalSettings { DatabaseProvider = "sqlServer", SqlServer = new GlobalSettings.SqlSettings { ConnectionString = database.ConnectionString, }, }; dapperSqlServerCollection.AddSingleton(globalSettings); dapperSqlServerCollection.AddSingleton(globalSettings); dapperSqlServerCollection.AddSingleton(_ => new DapperSqlServerTestDatabaseHelper(database)); dapperSqlServerCollection.AddDataProtection(); yield return dapperSqlServerCollection.BuildServiceProvider(); } else { var efCollection = new ServiceCollection(); efCollection.AddLogging(configureLogging); efCollection.SetupEntityFramework(database.ConnectionString, database.Type); efCollection.AddPasswordManagerEFRepositories(SelfHosted); efCollection.AddTransient(sp => new EfTestDatabaseHelper(sp.GetRequiredService(), database)); efCollection.AddDataProtection(); yield return efCollection.BuildServiceProvider(); } } } }