1
0
mirror of https://github.com/bitwarden/server.git synced 2025-06-30 07:36:14 -05:00

[PM-21079] Add support to integration tests for using sqlserver (#5823)

Adds a SqlServerApiApplicationFactory which allows you to run api tests using SqlServer. Currently a new database is create and destroyed for each test. In the future we'd like a more optimized way to do this.

The database logic is abstracted away in a ITestDatabase interface which handles the configuration, migration and teardown.
This commit is contained in:
Oscar Hinton
2025-06-02 11:06:16 +02:00
committed by GitHub
parent 20105b85aa
commit d7d90e7f3e
9 changed files with 236 additions and 93 deletions

View File

@ -1,11 +1,11 @@
using Bit.Core;
using Bit.Core.Auth.Models.Api.Request.Accounts;
using Bit.Core.Enums;
using Bit.IntegrationTestCommon;
using Bit.IntegrationTestCommon.Factories;
using Microsoft.AspNetCore.Authentication.JwtBearer;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.TestHost;
using Microsoft.Data.Sqlite;
using Microsoft.Extensions.DependencyInjection;
namespace Bit.Events.IntegrationTest;
@ -13,15 +13,18 @@ namespace Bit.Events.IntegrationTest;
public class EventsApplicationFactory : WebApplicationFactoryBase<Startup>
{
private readonly IdentityApplicationFactory _identityApplicationFactory;
private const string _connectionString = "DataSource=:memory:";
public EventsApplicationFactory()
public EventsApplicationFactory() : this(new SqliteTestDatabase())
{
SqliteConnection = new SqliteConnection(_connectionString);
SqliteConnection.Open();
}
protected EventsApplicationFactory(ITestDatabase db)
{
TestDatabase = db;
_identityApplicationFactory = new IdentityApplicationFactory();
_identityApplicationFactory.SqliteConnection = SqliteConnection;
_identityApplicationFactory.TestDatabase = TestDatabase;
_identityApplicationFactory.ManagesDatabase = false;
}
protected override void ConfigureWebHost(IWebHostBuilder builder)
@ -42,6 +45,10 @@ public class EventsApplicationFactory : WebApplicationFactoryBase<Startup>
/// </summary>
public async Task<(string Token, string RefreshToken)> LoginWithNewAccount(string email = "integration-test@bitwarden.com", string masterPasswordHash = "master_password_hash")
{
// This might be the first action in a test and since it forwards to the Identity server, we need to ensure that
// this server is initialized since it's responsible for seeding the database.
Assert.NotNull(Services);
await _identityApplicationFactory.RegisterNewIdentityFactoryUserAsync(
new RegisterFinishRequestModel
{
@ -59,10 +66,4 @@ public class EventsApplicationFactory : WebApplicationFactoryBase<Startup>
return await _identityApplicationFactory.TokenFromPasswordAsync(email, masterPasswordHash);
}
protected override void Dispose(bool disposing)
{
base.Dispose(disposing);
SqliteConnection!.Dispose();
}
}