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(); }