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