diff --git a/DD.Persistence.Database.Postgres.Test/DD.Persistence.Database.Postgres.Test.csproj b/DD.Persistence.Database.Postgres.Test/DD.Persistence.Database.Postgres.Test.csproj index bc83156..859acb5 100644 --- a/DD.Persistence.Database.Postgres.Test/DD.Persistence.Database.Postgres.Test.csproj +++ b/DD.Persistence.Database.Postgres.Test/DD.Persistence.Database.Postgres.Test.csproj @@ -9,6 +9,7 @@ + diff --git a/DD.Persistence.Database.Postgres.Test/DbFixture.cs b/DD.Persistence.Database.Postgres.Test/DbFixture.cs new file mode 100644 index 0000000..cb1d153 --- /dev/null +++ b/DD.Persistence.Database.Postgres.Test/DbFixture.cs @@ -0,0 +1,40 @@ +using DD.Persistence.Database.Model; +using DD.Persistence.Database.Postgres.Extensions; +using Microsoft.EntityFrameworkCore; +using Microsoft.Extensions.DependencyInjection; + +namespace DD.Persistence.Database.Postgres.Test; +public class DbFixture : IDisposable +{ + public string connectionString { get; } + public ServiceProvider serviceProvider { get; private set; } + + public DbFixture() + { + connectionString = $"Host=localhost;Port=5462;Username=postgres;Password=postgres;Database={Guid.CreateVersion7()}"; + + var serviceCollection = new ServiceCollection(); + serviceCollection + .AddDbContext(options => options.UseNpgsql(connectionString), + ServiceLifetime.Transient); + + serviceProvider = serviceCollection.BuildServiceProvider(); + + var context = serviceProvider.GetRequiredService(); + context.Database.EnsureCreated(); + context.Database.AddPartitioning(); + context.SaveChanges(); + } + + public void Dispose() + { + var dbContext = new PersistencePostgresContext( + new DbContextOptionsBuilder() + .UseNpgsql(connectionString) + .Options); + + dbContext.Database.EnsureDeleted(); + + GC.SuppressFinalize(this); + } +} diff --git a/DD.Persistence.Database.Postgres.Test/UnitTest1.cs b/DD.Persistence.Database.Postgres.Test/UnitTest1.cs index 92cbcf9..a7fe654 100644 --- a/DD.Persistence.Database.Postgres.Test/UnitTest1.cs +++ b/DD.Persistence.Database.Postgres.Test/UnitTest1.cs @@ -1,85 +1,70 @@ using DD.Persistence.Database.Entity; -using DD.Persistence.Database.Model; -using DD.Persistence.Database.Postgres.Extensions; -using Microsoft.EntityFrameworkCore; -using Microsoft.Extensions.Configuration; +using Mapster; using Microsoft.Extensions.DependencyInjection; -using Microsoft.Extensions.Hosting; +using Npgsql; namespace DD.Persistence.Database.Postgres.Test; -public class UnitTest1 +public class UnitTest1 : IClassFixture { - private string connectionString; - private IHost host; + private ServiceProvider _serviceProvider; + private string _connectionString; - public UnitTest1() + public UnitTest1(DbFixture fixture) { - connectionString = "Host=localhost;Port=5462;Username=postgres;Password=postgres;Database=persistence5"; - - - - var builder = Host.CreateApplicationBuilder(); - builder.Services.AddDbContext(options => - options.UseNpgsql(connectionString)); - - builder.Services.AddScoped(provider => provider.GetRequiredService()); - - host = builder.Build(); - using var scope = host.Services.CreateScope(); - var provider = scope.ServiceProvider; - - var context = provider.GetRequiredService(); - context.Database.EnsureCreatedAndMigrated(); - context.Database.AddPartitioning(); - context.SaveChanges(); - - - //using var scope2 = builder..CreateScope(); - //var scopedServices = scope.ServiceProvider; - - //var dbContext = scopedServices.GetRequiredService(); - //dbContext.Database.EnsureCreatedAndMigrated(); - //dbContext.SaveChanges(); + _serviceProvider = fixture.serviceProvider; + _connectionString = fixture.connectionString; } + [Fact] public void CreateHyperTable() { - var entity = new ParameterData() { + var entity = new ParameterData() + { DiscriminatorId = Guid.NewGuid(), ParameterId = 1, Timestamp = DateTime.UtcNow, Value = "123" }; - var scope = host.Services.CreateScope(); + using (var context = _serviceProvider.GetService()!) + { + context.ParameterData.Add(entity); - var context = scope.ServiceProvider.GetRequiredService(); + var entity2 = entity.Adapt(); + entity2.ParameterId = 2; + context.ParameterData.Add(entity2); - context.ParameterData.Add(entity); - context.SaveChanges(); + var entity3 = entity2.Adapt(); + entity3.ParameterId = 3; + entity3.Timestamp = DateTime.UtcNow.AddDays(2); + context.ParameterData.Add(entity3); - entity.Timestamp = DateTime.UtcNow.AddDays(1); - context.ParameterData.Add(entity); - context.SaveChanges(); + var entity4 = entity3.Adapt(); + entity4.ParameterId = 4; + context.ParameterData.Add(entity4); - entity.Timestamp = DateTime.UtcNow.AddDays(2); - context.ParameterData.Add(entity); - context.SaveChanges(); + context.SaveChanges(); + } - entity.Timestamp = DateTime.UtcNow.AddDays(3); - context.ParameterData.Add(entity); - context.SaveChanges(); + var chunksCount = 0; + using (var connection = new NpgsqlConnection(_connectionString)) + { + connection.Open(); + string sql = "select count(*) from (select show_chunks('parameter_data'));"; - entity.Timestamp = DateTime.UtcNow.AddDays(4); - context.ParameterData.Add(entity); - context.SaveChanges(); + using (var command = new NpgsqlCommand(sql, connection)) + { + using (var reader = command.ExecuteReader()) + { + while (reader.Read()) + { + chunksCount += reader.GetInt32(0); + } + } + } + } + + Assert.Equal(2, chunksCount); } - - //public static IHostBuilder CreateHostBuilder(string[] args) => - // Host.CreateDefaultBuilder(args) - // .ConfigureWebHostDefaults(webBuilder => - // { - // webBuilder.UseStartup(); - // }); }