using foodmarket.Application.Common.Tenancy;
using foodmarket.Infrastructure.Persistence;
using Microsoft.Data.Sqlite;
using Microsoft.EntityFrameworkCore;
namespace foodmarket.UnitTests.Support;
/// SQLite in-memory БД для тестов, использующих реальный AppDbContext
/// (query-фильтр мультитенантности, StockService). Соединение держим открытым —
/// in-memory БД живёт, пока открыт коннект; разные DbContext'ы на одном коннекте
/// видят одни данные. EnsureCreated строит схему по реальной модели (включая
/// tenant query-filter).
public sealed class SqliteDb : IDisposable
{
private readonly SqliteConnection _connection;
/// false — отключить проверку FK (для фокусных
/// тестов логики, где не хотим засевать все родительские строки).
public SqliteDb(bool foreignKeys = true)
{
_connection = new SqliteConnection($"DataSource=:memory:;Foreign Keys={foreignKeys}");
_connection.Open();
// Схему создаём контекстом-сидером с правами SuperAdmin (фильтр на запись
// не влияет, но единообразно). EnsureCreated идемпотентен в рамках коннекта.
using var db = Create(new FakeTenantContext { IsSuperAdmin = true });
db.Database.EnsureCreated();
}
public AppDbContext Create(ITenantContext tenant)
{
var options = new DbContextOptionsBuilder()
.UseSqlite(_connection)
.Options;
return new AppDbContext(options, tenant);
}
public void Dispose() => _connection.Dispose();
}