Browse Source

Replace DatabaseCreator+SqlDialectInitializer with DatabaseMigrator in test fixtures

- Test fixtures now use the same code path as production (MigrateAsync)
- DatabaseCreator and SqlDialectInitializer are no longer needed and deleted
- Functions are created via the AddJsonFunctions migration, not at every startup
pull/1313/head
Joe de Ronde 5 months ago
parent
commit
8613d62b84
  1. 42
      backend/src/Squidex.Data.EntityFramework/Infrastructure/Migrations/DatabaseCreator.cs
  2. 26
      backend/src/Squidex.Data.EntityFramework/Infrastructure/Queries/SqlDialectInitializer.cs
  3. 7
      backend/tests/Squidex.Data.Tests/EntityFramework/TestHelpers/MySqlFixture.cs
  4. 7
      backend/tests/Squidex.Data.Tests/EntityFramework/TestHelpers/PostgresFixture.cs
  5. 7
      backend/tests/Squidex.Data.Tests/EntityFramework/TestHelpers/SqlServerFixture.cs

42
backend/src/Squidex.Data.EntityFramework/Infrastructure/Migrations/DatabaseCreator.cs

@ -1,42 +0,0 @@
// ==========================================================================
// Squidex Headless CMS
// ==========================================================================
// Copyright (c) Squidex UG (haftungsbeschraenkt)
// All rights reserved. Licensed under the MIT license.
// ==========================================================================
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Infrastructure;
using Microsoft.EntityFrameworkCore.Storage;
using Squidex.Hosting;
#pragma warning disable RECS0108 // Warns about static fields in generic types
namespace Squidex.Infrastructure.Migrations;
public sealed class DatabaseCreator<TContext>(IDbContextFactory<TContext> dbContextFactory) : IInitializable
where TContext : DbContext
{
private static readonly TimeSpan WaitTime = TimeSpan.FromSeconds(30);
public int Order => -1000;
public async Task InitializeAsync(
CancellationToken ct)
{
await using var dbContext = await dbContextFactory.CreateDbContextAsync(ct);
using var cts = new CancellationTokenSource(WaitTime);
while (!await dbContext.Database.CanConnectAsync(cts.Token))
{
await Task.Delay(100, cts.Token);
}
if (dbContext.Database.GetService<IDatabaseCreator>() is not RelationalDatabaseCreator relationalDatabaseCreator)
{
return;
}
await relationalDatabaseCreator.EnsureCreatedAsync(ct);
}
}

26
backend/src/Squidex.Data.EntityFramework/Infrastructure/Queries/SqlDialectInitializer.cs

@ -1,26 +0,0 @@
// ==========================================================================
// Squidex Headless CMS
// ==========================================================================
// Copyright (c) Squidex UG (haftungsbeschraenkt)
// All rights reserved. Licensed under the MIT license.
// ==========================================================================
using Microsoft.EntityFrameworkCore;
using Squidex.Hosting;
namespace Squidex.Infrastructure.Queries;
public sealed class SqlDialectInitializer<TContext>(IDbContextFactory<TContext> dbContextFactory)
: IInitializable where TContext : DbContext
{
public async Task InitializeAsync(CancellationToken ct)
{
await using var dbContext = await dbContextFactory.CreateDbContextAsync(ct);
if (dbContext is not IDbContextWithDialect withDialect)
{
return;
}
await withDialect.Dialect.InitializeAsync(dbContext, ct);
}
}

7
backend/tests/Squidex.Data.Tests/EntityFramework/TestHelpers/MySqlFixture.cs

@ -11,9 +11,7 @@ using Microsoft.Extensions.DependencyInjection;
using PhenX.EntityFrameworkCore.BulkInsert.MySql;
using Squidex.Domain.Apps.Core.TestHelpers;
using Squidex.Hosting;
using Squidex.Infrastructure;
using Squidex.Infrastructure.Migrations;
using Squidex.Infrastructure.Queries;
using Squidex.Providers.MySql;
using Squidex.Providers.MySql.Content;
using Testcontainers.MySql;
@ -66,15 +64,16 @@ public class MySqlFixture(string? reuseId = null) : IAsyncLifetime, ISqlContentF
w.Ignore(RelationalEventId.PendingModelChangesWarning));
})
.AddSingleton<ConnectionStringParser, MySqlConnectionStringParser>()
.AddSingletonAs<DatabaseCreator<TestDbContextMySql>>().Done()
.AddSingleton<DatabaseMigrator<TestDbContextMySql>>()
.AddSingleton(TestUtils.DefaultSerializer)
.AddSingleton<IInitializable, SqlDialectInitializer<TestDbContextMySql>>()
.BuildServiceProvider();
foreach (var service in services.GetRequiredService<IEnumerable<IInitializable>>())
{
await service.InitializeAsync(default);
}
await services.GetRequiredService<DatabaseMigrator<TestDbContextMySql>>().InitializeAsync(default);
}
public async ValueTask DisposeAsync()

7
backend/tests/Squidex.Data.Tests/EntityFramework/TestHelpers/PostgresFixture.cs

@ -11,9 +11,7 @@ using Microsoft.Extensions.DependencyInjection;
using PhenX.EntityFrameworkCore.BulkInsert.PostgreSql;
using Squidex.Domain.Apps.Core.TestHelpers;
using Squidex.Hosting;
using Squidex.Infrastructure;
using Squidex.Infrastructure.Migrations;
using Squidex.Infrastructure.Queries;
using Squidex.Providers.Postgres;
using Squidex.Providers.Postgres.Content;
using Testcontainers.PostgreSql;
@ -61,15 +59,16 @@ public class PostgresFixture(string? reuseId) : IAsyncLifetime, ISqlContentFixtu
w.Ignore(RelationalEventId.PendingModelChangesWarning));
})
.AddSingleton<ConnectionStringParser, PostgresConnectionStringParser>()
.AddSingletonAs<DatabaseCreator<TestDbContextPostgres>>().Done()
.AddSingleton<DatabaseMigrator<TestDbContextPostgres>>()
.AddSingleton(TestUtils.DefaultSerializer)
.AddSingleton<IInitializable, SqlDialectInitializer<TestDbContextPostgres>>()
.BuildServiceProvider();
foreach (var service in services.GetRequiredService<IEnumerable<IInitializable>>())
{
await service.InitializeAsync(default);
}
await services.GetRequiredService<DatabaseMigrator<TestDbContextPostgres>>().InitializeAsync(default);
}
public async ValueTask DisposeAsync()

7
backend/tests/Squidex.Data.Tests/EntityFramework/TestHelpers/SqlServerFixture.cs

@ -12,9 +12,7 @@ using Microsoft.Extensions.DependencyInjection;
using PhenX.EntityFrameworkCore.BulkInsert.SqlServer;
using Squidex.Domain.Apps.Core.TestHelpers;
using Squidex.Hosting;
using Squidex.Infrastructure;
using Squidex.Infrastructure.Migrations;
using Squidex.Infrastructure.Queries;
using Squidex.Providers.SqlServer;
using Squidex.Providers.SqlServer.Content;
using Testcontainers.MsSql;
@ -63,15 +61,16 @@ public class SqlServerFixture(string? reuseId = null) : IAsyncLifetime, ISqlCont
w.Ignore(RelationalEventId.PendingModelChangesWarning));
})
.AddSingleton<ConnectionStringParser, SqlServerConnectionStringParser>()
.AddSingletonAs<DatabaseCreator<TestDbContextSqlServer>>().Done()
.AddSingleton<DatabaseMigrator<TestDbContextSqlServer>>()
.AddSingleton(TestUtils.DefaultSerializer)
.AddSingleton<IInitializable, SqlDialectInitializer<TestDbContextSqlServer>>()
.BuildServiceProvider();
foreach (var service in services.GetRequiredService<IEnumerable<IInitializable>>())
{
await service.InitializeAsync(default);
}
await services.GetRequiredService<DatabaseMigrator<TestDbContextSqlServer>>().InitializeAsync(default);
}
public async ValueTask DisposeAsync()

Loading…
Cancel
Save