diff --git a/EconDataLens.Tests/EconDataLens.Tests.csproj b/EconDataLens.Tests/EconDataLens.Tests.csproj index 905a09e..731065a 100644 --- a/EconDataLens.Tests/EconDataLens.Tests.csproj +++ b/EconDataLens.Tests/EconDataLens.Tests.csproj @@ -15,9 +15,11 @@ runtime; build; native; contentfiles; analyzers; buildtransitive + + @@ -31,9 +33,9 @@ - + PreserveNewest - + diff --git a/EconDataLens.Tests/Services/CpiAreaParserTests.cs b/EconDataLens.Tests/EtlParserTests/CpiAreaParserTests.cs similarity index 94% rename from EconDataLens.Tests/Services/CpiAreaParserTests.cs rename to EconDataLens.Tests/EtlParserTests/CpiAreaParserTests.cs index eff0ade..928d32a 100644 --- a/EconDataLens.Tests/Services/CpiAreaParserTests.cs +++ b/EconDataLens.Tests/EtlParserTests/CpiAreaParserTests.cs @@ -4,7 +4,7 @@ using EconDataLens.Services; using Microsoft.Extensions.Options; -namespace EconDataLens.Tests.Services; +namespace EconDataLens.Tests.EtlParserTests; public class CpiAreaParserTests { @@ -35,7 +35,7 @@ public void SetUp() [Test] public async Task ParseCpiAreaAsync_HeaderOnly_YieldsNoResults() { - var path = Path.Combine(TestContext.CurrentContext.TestDirectory, "Fixtures", "cu.area.empty"); + var path = Path.Combine(TestContext.CurrentContext.TestDirectory, "TestData", "cu.area.empty"); var rows = new List(); @@ -48,7 +48,7 @@ public async Task ParseCpiAreaAsync_HeaderOnly_YieldsNoResults() [Test] public async Task ParseCpiAreaAsync_FileWithRecords_YieldsResults() { - var path = Path.Combine(TestContext.CurrentContext.TestDirectory, "Fixtures", "cu.area.sample"); + var path = Path.Combine(TestContext.CurrentContext.TestDirectory, "TestData", "cu.area.sample"); var rows = new List(); diff --git a/EconDataLens.Tests/Services/CpiDataParserTests.cs b/EconDataLens.Tests/EtlParserTests/CpiDataParserTests.cs similarity index 94% rename from EconDataLens.Tests/Services/CpiDataParserTests.cs rename to EconDataLens.Tests/EtlParserTests/CpiDataParserTests.cs index ca60037..da64df1 100644 --- a/EconDataLens.Tests/Services/CpiDataParserTests.cs +++ b/EconDataLens.Tests/EtlParserTests/CpiDataParserTests.cs @@ -5,7 +5,7 @@ using Microsoft.Extensions.Options; -namespace EconDataLens.Tests.Services; +namespace EconDataLens.Tests.EtlParserTests; public class CpiDataParserTests { @@ -36,7 +36,7 @@ public void SetUp() [Test] public async Task ParseCpiFootnoteAsync_HeaderOnly_YieldsNoResults() { - var path = Path.Combine(TestContext.CurrentContext.TestDirectory, "Fixtures", "cu.data.0.Current.empty"); + var path = Path.Combine(TestContext.CurrentContext.TestDirectory, "TestData", "cu.data.0.Current.empty"); var rows = new List(); await foreach (var row in _parser.ParseCpiDataAsync(path)) @@ -49,7 +49,7 @@ public async Task ParseCpiFootnoteAsync_HeaderOnly_YieldsNoResults() [Test] public async Task ParseCpiDataAsync_FileWithRecords_YieldsResults() { - var path = Path.Combine(TestContext.CurrentContext.TestDirectory, "Fixtures", "cu.data.0.Current.sample"); + var path = Path.Combine(TestContext.CurrentContext.TestDirectory, "TestData", "cu.data.0.Current.sample"); var rows = new List(); await foreach (var row in _parser.ParseCpiDataAsync(path)) diff --git a/EconDataLens.Tests/Services/CpiFootnoteParserTests.cs b/EconDataLens.Tests/EtlParserTests/CpiFootnoteParserTests.cs similarity index 94% rename from EconDataLens.Tests/Services/CpiFootnoteParserTests.cs rename to EconDataLens.Tests/EtlParserTests/CpiFootnoteParserTests.cs index dc1960a..099c673 100644 --- a/EconDataLens.Tests/Services/CpiFootnoteParserTests.cs +++ b/EconDataLens.Tests/EtlParserTests/CpiFootnoteParserTests.cs @@ -4,7 +4,7 @@ using EconDataLens.Services; using Microsoft.Extensions.Options; -namespace EconDataLens.Tests.Services; +namespace EconDataLens.Tests.EtlParserTests; [TestFixture] public class CpiFootnoteParserTests @@ -37,7 +37,7 @@ public void SetUp() public async Task ParseCpiFootnoteAsync_HeaderOnly_YieldsNoResults() { // Arrange - var path = Path.Combine(TestContext.CurrentContext.TestDirectory, "Fixtures", "cu.footnote.empty"); + var path = Path.Combine(TestContext.CurrentContext.TestDirectory, "TestData", "cu.footnote.empty"); // Act var rows = new List(); @@ -53,7 +53,7 @@ public async Task ParseCpiFootnoteAsync_HeaderOnly_YieldsNoResults() public async Task ParseCpiFootnoteAsync_FileWithRecords_YieldsResults() { // Arrange - var path = Path.Combine(TestContext.CurrentContext.TestDirectory, "Fixtures", "cu.footnote.sample"); + var path = Path.Combine(TestContext.CurrentContext.TestDirectory, "TestData", "cu.footnote.sample"); // Act var rows = new List(); diff --git a/EconDataLens.Tests/Services/CpiItemParserTests.cs b/EconDataLens.Tests/EtlParserTests/CpiItemParserTests.cs similarity index 94% rename from EconDataLens.Tests/Services/CpiItemParserTests.cs rename to EconDataLens.Tests/EtlParserTests/CpiItemParserTests.cs index 4ae1f37..b223acc 100644 --- a/EconDataLens.Tests/Services/CpiItemParserTests.cs +++ b/EconDataLens.Tests/EtlParserTests/CpiItemParserTests.cs @@ -4,7 +4,7 @@ using EconDataLens.Services; using Microsoft.Extensions.Options; -namespace EconDataLens.Tests.Services; +namespace EconDataLens.Tests.EtlParserTests; public class CpiItemParserTests { @@ -35,7 +35,7 @@ public void SetUp() [Test] public async Task ParseCpiItemAsync_HeaderOnly_YieldsNoResults() { - var path = Path.Combine(TestContext.CurrentContext.TestDirectory, "Fixtures", "cu.item.empty"); + var path = Path.Combine(TestContext.CurrentContext.TestDirectory, "TestData", "cu.item.empty"); var rows = new List(); await foreach (var row in _parser.ParseCpiItemsAsync(path)) @@ -47,7 +47,7 @@ public async Task ParseCpiItemAsync_HeaderOnly_YieldsNoResults() [Test] public async Task ParseCpiItemAsync_FileWithRecords_YieldsResults() { - var path = Path.Combine(TestContext.CurrentContext.TestDirectory, "Fixtures", "cu.item.sample"); + var path = Path.Combine(TestContext.CurrentContext.TestDirectory, "TestData", "cu.item.sample"); var rows = new List(); await foreach (var row in _parser.ParseCpiItemsAsync(path)) diff --git a/EconDataLens.Tests/Services/CpiPeriodParserTests.cs b/EconDataLens.Tests/EtlParserTests/CpiPeriodParserTests.cs similarity index 94% rename from EconDataLens.Tests/Services/CpiPeriodParserTests.cs rename to EconDataLens.Tests/EtlParserTests/CpiPeriodParserTests.cs index 026e67d..af53c7b 100644 --- a/EconDataLens.Tests/Services/CpiPeriodParserTests.cs +++ b/EconDataLens.Tests/EtlParserTests/CpiPeriodParserTests.cs @@ -4,7 +4,7 @@ using EconDataLens.Services; using Microsoft.Extensions.Options; -namespace EconDataLens.Tests.Services; +namespace EconDataLens.Tests.EtlParserTests; public class CpiPeriodParserTests { @@ -35,7 +35,7 @@ public void SetUp() [Test] public async Task ParseCpiPeriodAsync_HeaderOnly_YieldsNoResults() { - var path = Path.Combine(TestContext.CurrentContext.TestDirectory, "Fixtures", "cu.period.empty"); + var path = Path.Combine(TestContext.CurrentContext.TestDirectory, "TestData", "cu.period.empty"); var rows = new List(); await foreach (var row in _parser.ParseCpiPeriodsAsync(path)) @@ -47,7 +47,7 @@ public async Task ParseCpiPeriodAsync_HeaderOnly_YieldsNoResults() [Test] public async Task ParseCpiPeriodAsync_FileWithRecords_YieldsResults() { - var path = Path.Combine(TestContext.CurrentContext.TestDirectory, "Fixtures", "cu.period.sample"); + var path = Path.Combine(TestContext.CurrentContext.TestDirectory, "TestData", "cu.period.sample"); var rows = new List(); await foreach (var row in _parser.ParseCpiPeriodsAsync(path)) diff --git a/EconDataLens.Tests/Services/CpiSeriesParserTests.cs b/EconDataLens.Tests/EtlParserTests/CpiSeriesParserTests.cs similarity index 96% rename from EconDataLens.Tests/Services/CpiSeriesParserTests.cs rename to EconDataLens.Tests/EtlParserTests/CpiSeriesParserTests.cs index 1700b1c..cf735de 100644 --- a/EconDataLens.Tests/Services/CpiSeriesParserTests.cs +++ b/EconDataLens.Tests/EtlParserTests/CpiSeriesParserTests.cs @@ -4,7 +4,7 @@ using EconDataLens.Services; using Microsoft.Extensions.Options; -namespace EconDataLens.Tests.Services; +namespace EconDataLens.Tests.EtlParserTests; public class CpiSeriesParserTests { @@ -35,7 +35,7 @@ public void SetUp() [Test] public async Task ParseCpiSeriesAsync_HeaderOnly_YieldsNoResults() { - var path = Path.Combine(TestContext.CurrentContext.TestDirectory, "Fixtures", "cu.series.empty"); + var path = Path.Combine(TestContext.CurrentContext.TestDirectory, "TestData", "cu.series.empty"); var rows = new List(); await foreach (var row in _parser.ParseCpiSeriesAsync(path)) @@ -47,7 +47,7 @@ public async Task ParseCpiSeriesAsync_HeaderOnly_YieldsNoResults() [Test] public async Task ParseCpiSeriesAsync_FileWithRecords_YieldsResults() { - var path = Path.Combine(TestContext.CurrentContext.TestDirectory, "Fixtures", "cu.series.sample"); + var path = Path.Combine(TestContext.CurrentContext.TestDirectory, "TestData", "cu.series.sample"); var rows = new List(); await foreach (var row in _parser.ParseCpiSeriesAsync(path)) diff --git a/EconDataLens.Tests/PostgresFixture.cs b/EconDataLens.Tests/PostgresFixture.cs new file mode 100644 index 0000000..f03e959 --- /dev/null +++ b/EconDataLens.Tests/PostgresFixture.cs @@ -0,0 +1,40 @@ +using EconDataLens.Data; +using Microsoft.EntityFrameworkCore; +using Testcontainers.PostgreSql; + +namespace EconDataLens.Tests; + +[SetUpFixture] +public class PostgresFixture +{ + private PostgreSqlContainer _container = default!; + public static string ConnectionString { get; private set; } = string.Empty; + + [OneTimeSetUp] + public async Task OneTimeSetUp() + { + _container = new PostgreSqlBuilder() + .WithImage("postgres:17-alpine") + .WithDatabase("econ_test") + .WithUsername("postgres") + .WithPassword("postgres") + .WithCleanUp(true) + .Build(); + + await _container.StartAsync(); + ConnectionString = _container.GetConnectionString(); + + var options = new DbContextOptionsBuilder() + .UseNpgsql(ConnectionString) + .Options; + + await using var ctx = new EconDataLensDbContext(options); + await ctx.Database.MigrateAsync(); + } + + [OneTimeTearDown] + public async Task OneTimeTearDown() + { + await _container.DisposeAsync(); + } +} \ No newline at end of file diff --git a/EconDataLens.Tests/Smoke/DbSmokeTest.cs b/EconDataLens.Tests/Smoke/DbSmokeTest.cs new file mode 100644 index 0000000..12b22c3 --- /dev/null +++ b/EconDataLens.Tests/Smoke/DbSmokeTest.cs @@ -0,0 +1,36 @@ +using Microsoft.EntityFrameworkCore; +using EconDataLens.Core.Entities.Cpi; +using EconDataLens.Data; + +namespace EconDataLens.Tests.Smoke; + +public class DbSmokeTests +{ + private static EconDataLensDbContext CreateDb() + { + var opts = new DbContextOptionsBuilder() + .UseNpgsql(PostgresFixture.ConnectionString) + .UseSnakeCaseNamingConvention() + .Options; + + return new EconDataLensDbContext(opts); + } + + [Test] + public async Task Can_Migrate_And_Do_Basic_CRUD() + { + await using var db = CreateDb(); + + // Insert + db.CpiArea.Add(new CpiArea { AreaCode = "ZZZ0", AreaName = "Test Area" }); + await db.SaveChangesAsync(); + + // Query + var found = await db.CpiArea.AsNoTracking().CountAsync(a => a.AreaCode == "ZZZ0"); + Assert.That(found, Is.EqualTo(1)); + + // Cleanup (optional) + db.CpiArea.RemoveRange(db.CpiArea.Where(a => a.AreaCode == "ZZZ0")); + await db.SaveChangesAsync(); + } +} \ No newline at end of file diff --git a/EconDataLens.Tests/Fixtures/cu.area.empty b/EconDataLens.Tests/TestData/cu.area.empty similarity index 100% rename from EconDataLens.Tests/Fixtures/cu.area.empty rename to EconDataLens.Tests/TestData/cu.area.empty diff --git a/EconDataLens.Tests/Fixtures/cu.area.sample b/EconDataLens.Tests/TestData/cu.area.sample similarity index 100% rename from EconDataLens.Tests/Fixtures/cu.area.sample rename to EconDataLens.Tests/TestData/cu.area.sample diff --git a/EconDataLens.Tests/Fixtures/cu.data.0.Current.empty b/EconDataLens.Tests/TestData/cu.data.0.Current.empty similarity index 100% rename from EconDataLens.Tests/Fixtures/cu.data.0.Current.empty rename to EconDataLens.Tests/TestData/cu.data.0.Current.empty diff --git a/EconDataLens.Tests/Fixtures/cu.data.0.Current.sample b/EconDataLens.Tests/TestData/cu.data.0.Current.sample similarity index 100% rename from EconDataLens.Tests/Fixtures/cu.data.0.Current.sample rename to EconDataLens.Tests/TestData/cu.data.0.Current.sample diff --git a/EconDataLens.Tests/Fixtures/cu.footnote.empty b/EconDataLens.Tests/TestData/cu.footnote.empty similarity index 100% rename from EconDataLens.Tests/Fixtures/cu.footnote.empty rename to EconDataLens.Tests/TestData/cu.footnote.empty diff --git a/EconDataLens.Tests/Fixtures/cu.footnote.sample b/EconDataLens.Tests/TestData/cu.footnote.sample similarity index 100% rename from EconDataLens.Tests/Fixtures/cu.footnote.sample rename to EconDataLens.Tests/TestData/cu.footnote.sample diff --git a/EconDataLens.Tests/Fixtures/cu.item.empty b/EconDataLens.Tests/TestData/cu.item.empty similarity index 100% rename from EconDataLens.Tests/Fixtures/cu.item.empty rename to EconDataLens.Tests/TestData/cu.item.empty diff --git a/EconDataLens.Tests/Fixtures/cu.item.sample b/EconDataLens.Tests/TestData/cu.item.sample similarity index 100% rename from EconDataLens.Tests/Fixtures/cu.item.sample rename to EconDataLens.Tests/TestData/cu.item.sample diff --git a/EconDataLens.Tests/Fixtures/cu.period.empty b/EconDataLens.Tests/TestData/cu.period.empty similarity index 100% rename from EconDataLens.Tests/Fixtures/cu.period.empty rename to EconDataLens.Tests/TestData/cu.period.empty diff --git a/EconDataLens.Tests/Fixtures/cu.period.sample b/EconDataLens.Tests/TestData/cu.period.sample similarity index 100% rename from EconDataLens.Tests/Fixtures/cu.period.sample rename to EconDataLens.Tests/TestData/cu.period.sample diff --git a/EconDataLens.Tests/Fixtures/cu.series.empty b/EconDataLens.Tests/TestData/cu.series.empty similarity index 100% rename from EconDataLens.Tests/Fixtures/cu.series.empty rename to EconDataLens.Tests/TestData/cu.series.empty diff --git a/EconDataLens.Tests/Fixtures/cu.series.sample b/EconDataLens.Tests/TestData/cu.series.sample similarity index 100% rename from EconDataLens.Tests/Fixtures/cu.series.sample rename to EconDataLens.Tests/TestData/cu.series.sample