Co-authored-by: gorbenko.pavel <gorbenko.pavel@tansu.kz> Reviewed-on: http://git.tnsu.kz/gorbenko.pavel/tnsu-approval-route/pulls/2 Co-authored-by: gorbenko.pavel <gorbenko.pavel@tnsu.kz> Co-committed-by: gorbenko.pavel <gorbenko.pavel@tnsu.kz>
This commit was merged in pull request #2.
This commit is contained in:
+57
@@ -0,0 +1,57 @@
|
||||
using Microsoft.EntityFrameworkCore;
|
||||
using Npgsql;
|
||||
using Tnsu.ApprovalRoute.Infrastructure.Persistence;
|
||||
using Xunit;
|
||||
|
||||
namespace Tnsu.ApprovalRoute.IntegrationTests.Infrastructure;
|
||||
|
||||
public sealed class PostgresDatabaseFixture : IAsyncLifetime
|
||||
{
|
||||
private readonly string _databaseName = $"tnsu_test_{Guid.NewGuid():N}";
|
||||
private readonly NpgsqlConnectionStringBuilder _adminConnectionBuilder = new(TestSettings.BaseConnectionString);
|
||||
|
||||
public string ConnectionString { get; private set; } = string.Empty;
|
||||
|
||||
public async Task InitializeAsync()
|
||||
{
|
||||
await using (var adminConnection = new NpgsqlConnection(_adminConnectionBuilder.ConnectionString))
|
||||
{
|
||||
await adminConnection.OpenAsync();
|
||||
await using var createCommand = new NpgsqlCommand($"CREATE DATABASE \"{_databaseName}\"", adminConnection);
|
||||
await createCommand.ExecuteNonQueryAsync();
|
||||
}
|
||||
|
||||
ConnectionString = new NpgsqlConnectionStringBuilder(_adminConnectionBuilder.ConnectionString)
|
||||
{
|
||||
Database = _databaseName
|
||||
}.ConnectionString;
|
||||
|
||||
var options = new DbContextOptionsBuilder<ApprovalRouteDbContext>()
|
||||
.UseNpgsql(ConnectionString)
|
||||
.UseSnakeCaseNamingConvention()
|
||||
.Options;
|
||||
|
||||
await using var db = new ApprovalRouteDbContext(options);
|
||||
await db.Database.MigrateAsync();
|
||||
}
|
||||
|
||||
public async Task DisposeAsync()
|
||||
{
|
||||
await using var adminConnection = new NpgsqlConnection(_adminConnectionBuilder.ConnectionString);
|
||||
await adminConnection.OpenAsync();
|
||||
|
||||
await using (var terminateCommand = new NpgsqlCommand(
|
||||
"""
|
||||
SELECT pg_terminate_backend(pid) FROM pg_stat_activity
|
||||
WHERE datname = @databaseName AND pid <> pg_backend_pid();
|
||||
""",
|
||||
adminConnection))
|
||||
{
|
||||
terminateCommand.Parameters.AddWithValue("databaseName", _databaseName);
|
||||
await terminateCommand.ExecuteNonQueryAsync();
|
||||
}
|
||||
|
||||
await using var dropCommand = new NpgsqlCommand($"DROP DATABASE IF EXISTS \"{_databaseName}\"", adminConnection);
|
||||
await dropCommand.ExecuteNonQueryAsync();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,8 @@
|
||||
using Tnsu.ApprovalRoute.Application.Common.Interfaces;
|
||||
|
||||
namespace Tnsu.ApprovalRoute.IntegrationTests.Infrastructure;
|
||||
|
||||
internal sealed class TestCurrentUser(string? email = null) : ICurrentUser
|
||||
{
|
||||
public string? Email { get; } = email;
|
||||
}
|
||||
+34
@@ -0,0 +1,34 @@
|
||||
using Microsoft.Extensions.Configuration;
|
||||
using Microsoft.Extensions.DependencyInjection;
|
||||
using Tnsu.ApprovalRoute.Application;
|
||||
using Tnsu.ApprovalRoute.Application.Common.Interfaces;
|
||||
using Tnsu.ApprovalRoute.Infrastructure;
|
||||
using Tnsu.ApprovalRoute.Infrastructure.TnsuPortal;
|
||||
|
||||
namespace Tnsu.ApprovalRoute.IntegrationTests.Infrastructure;
|
||||
|
||||
internal static class TestServiceProviderFactory
|
||||
{
|
||||
public static ServiceProvider Build(
|
||||
string connectionString,
|
||||
string? currentUserEmail = "initiator@tnsu.kz",
|
||||
ITnsuPortalClient? portalClient = null)
|
||||
{
|
||||
var configuration = new ConfigurationBuilder()
|
||||
.AddInMemoryCollection(new Dictionary<string, string?>
|
||||
{
|
||||
["ConnectionStrings:Postgres"] = connectionString
|
||||
})
|
||||
.Build();
|
||||
|
||||
var services = new ServiceCollection();
|
||||
services.AddApprovalRouteInfrastructure(configuration);
|
||||
services.AddApprovalRouteApplication();
|
||||
services.AddSingleton<ICurrentUser>(new TestCurrentUser(currentUserEmail));
|
||||
|
||||
if (portalClient is not null)
|
||||
services.AddSingleton(portalClient);
|
||||
|
||||
return services.BuildServiceProvider();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,8 @@
|
||||
namespace Tnsu.ApprovalRoute.IntegrationTests.Infrastructure;
|
||||
|
||||
internal static class TestSettings
|
||||
{
|
||||
public static string BaseConnectionString =>
|
||||
Environment.GetEnvironmentVariable("TEST_POSTGRES_CONNECTION")
|
||||
?? "Host=localhost;Port=5435;Database=tnsu_approval_route;Username=tnsu_approval_route;Password=tnsu_approval_route";
|
||||
}
|
||||
Reference in New Issue
Block a user