using System.Text; using Bit.Core; using Bit.Core.Test.Helpers.Factories; using Bit.Infrastructure.EntityFramework.Repositories; using Microsoft.AspNetCore.DataProtection; using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.DependencyInjection; using Moq; namespace Bit.Infrastructure.EFIntegration.Test.Helpers; public static class DatabaseOptionsFactory { public static List> Options { get; } = new(); static DatabaseOptionsFactory() { var services = new ServiceCollection() .AddSingleton(sp => { var dataProtector = new Mock(); dataProtector .Setup(d => d.Unprotect(It.IsAny())) .Returns(data => Encoding.UTF8.GetBytes(Constants.DatabaseFieldProtectedPrefix + Encoding.UTF8.GetString(data))); var dataProtectionProvider = new Mock(); dataProtectionProvider .Setup(x => x.CreateProtector(Constants.DatabaseFieldProtectorPurpose)) .Returns(dataProtector.Object); return dataProtectionProvider.Object; }) .BuildServiceProvider(); var globalSettings = GlobalSettingsFactory.GlobalSettings; if (!string.IsNullOrWhiteSpace(GlobalSettingsFactory.GlobalSettings.PostgreSql?.ConnectionString)) { AppContext.SetSwitch("Npgsql.EnableLegacyTimestampBehavior", true); Options.Add(new DbContextOptionsBuilder() .UseNpgsql(globalSettings.PostgreSql.ConnectionString) .UseApplicationServiceProvider(services) .Options); } if (!string.IsNullOrWhiteSpace(GlobalSettingsFactory.GlobalSettings.MySql?.ConnectionString)) { var mySqlConnectionString = globalSettings.MySql.ConnectionString; Options.Add(new DbContextOptionsBuilder() .UseMySql(mySqlConnectionString, ServerVersion.AutoDetect(mySqlConnectionString)) .UseApplicationServiceProvider(services) .Options); } } }