1
0
mirror of https://github.com/bitwarden/server.git synced 2025-06-02 09:10:33 -05:00

Dynamically build connection string

This commit is contained in:
Hinton 2025-05-26 16:49:20 +02:00
parent e844c9c773
commit 3b52c59cf9
No known key found for this signature in database
GPG Key ID: 5F7295599C5D965C
3 changed files with 25 additions and 12 deletions

View File

@ -21,7 +21,7 @@ public class ApiApplicationFactory : WebApplicationFactoryBase<Startup>
public ApiApplicationFactory(ITestDatabase db)
{
TestDatabase = db;
_handleDbDisposal = true;
HandleDbDisposal = true;
_identityApplicationFactory = new IdentityApplicationFactory();
_identityApplicationFactory.TestDatabase = TestDatabase;

View File

@ -41,7 +41,7 @@ public abstract class WebApplicationFactoryBase<T> : WebApplicationFactory<T>
private readonly List<Action<IServiceCollection>> _configureTestServices = new();
private readonly List<Action<IConfigurationBuilder>> _configureAppConfiguration = new();
private bool _handleDbDisposal { get; set; }
public bool HandleDbDisposal { get; set; }
public void SubstituteService<TService>(Action<TService> mockService)
@ -121,7 +121,7 @@ public abstract class WebApplicationFactoryBase<T> : WebApplicationFactory<T>
if (TestDatabase == null)
{
TestDatabase = new SqliteTestDatabase();
_handleDbDisposal = true;
HandleDbDisposal = true;
}
var config = new Dictionary<string, string?>
@ -185,7 +185,7 @@ public abstract class WebApplicationFactoryBase<T> : WebApplicationFactory<T>
// Add database to the service collection
TestDatabase.AddDatabase(services);
if (_handleDbDisposal)
if (HandleDbDisposal)
{
TestDatabase.Migrate(services);
}
@ -287,9 +287,9 @@ public abstract class WebApplicationFactoryBase<T> : WebApplicationFactory<T>
protected override void Dispose(bool disposing)
{
base.Dispose(disposing);
if (_handleDbDisposal)
if (HandleDbDisposal)
{
_handleDbDisposal = false;
HandleDbDisposal = false;
if (TestDatabase != null)
{

View File

@ -3,6 +3,7 @@ using Bit.Infrastructure.EntityFramework.Repositories;
using Bit.Migrator;
using Microsoft.Data.SqlClient;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
@ -10,23 +11,35 @@ namespace Bit.IntegrationTestCommon;
public class SqlServerTestDatabase : ITestDatabase
{
public string SqlServerConnection { get; set; }
private string _sqlServerConnection { get; set; }
public SqlServerTestDatabase()
{
SqlServerConnection = "Server=localhost;Database=vault_test;User Id=SA;Password=SET_A_PASSWORD_HERE_123;Encrypt=True;TrustServerCertificate=True;";
// Grab the connection string from the Identity project user secrets
var identityBuilder = new ConfigurationBuilder();
identityBuilder.AddUserSecrets(typeof(Identity.Startup).Assembly, optional: true);
var identityConfig = identityBuilder.Build();
var identityConnectionString = identityConfig.GetSection("globalSettings:sqlServer:connectionString").Value;
// Replace the database name in the connection string to use a test database
var testConnectionString = new SqlConnectionStringBuilder(identityConnectionString)
{
InitialCatalog = "vault_test"
}.ConnectionString;
_sqlServerConnection = testConnectionString;
}
public void ModifyGlobalSettings(Dictionary<string, string> config)
{
config["globalSettings:databaseProvider"] = "sqlserver";
config["globalSettings:sqlServer:connectionString"] = SqlServerConnection;
config["globalSettings:sqlServer:connectionString"] = _sqlServerConnection;
}
public void AddDatabase(IServiceCollection serviceCollection)
{
serviceCollection.AddScoped(s => new DbContextOptionsBuilder<DatabaseContext>()
.UseSqlServer(SqlServerConnection)
.UseSqlServer(_sqlServerConnection)
.UseApplicationServiceProvider(s)
.Options);
}
@ -45,13 +58,13 @@ public class SqlServerTestDatabase : ITestDatabase
public void Dispose()
{
var masterConnectionString = new SqlConnectionStringBuilder(SqlServerConnection)
var masterConnectionString = new SqlConnectionStringBuilder(_sqlServerConnection)
{
InitialCatalog = "master"
}.ConnectionString;
using var connection = new SqlConnection(masterConnectionString);
var databaseName = new SqlConnectionStringBuilder(SqlServerConnection).InitialCatalog;
var databaseName = new SqlConnectionStringBuilder(_sqlServerConnection).InitialCatalog;
connection.Open();