using Deal.Telegram.Sessions; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging.Abstractions; using Deal.Telegram.Tests.Support; namespace Deal.Telegram.Tests.Telegram; // Харнесс пула сессий (SessionFarm) с готовой ready-сессией тенанта для unit-тестов служб каталога // (BackfillService/RealtimeSweep/RealtimeListener ходят в сессию через SessionFarm, как в проде). // Вход — телефонный флоу на фейк-клиенте: StartPhone (код запрошен) → SendCode (код верный) → ready. internal sealed class FarmHarness : IAsyncDisposable { private const string Phone = "+79990001122"; private FarmHarness( string directory, SessionStore store, FakeClientFactory factory, SessionFarm farm) { Directory = directory; Store = store; Factory = factory; Farm = farm; } /// /// Temp-каталог хранилища сессий. /// public string Directory { get; } /// /// Файловое хранилище сессий. /// public SessionStore Store { get; } /// /// Фейковая фабрика клиентов (CreatedClients — ready-клиент тенанта). /// public FakeClientFactory Factory { get; } /// /// Пул сессий с ready-сессией тенанта. /// public SessionFarm Farm { get; } /// /// Ready-фейк-клиент тенанта (настройка диалогов/сообщений тестом). /// public FakeSessionClient Client => Factory.CreatedClients.Single(); /// /// Создаёт пул с ready-сессией тенанта (телефонный вход без сети). /// /// Id тенанта. public static async Task CreateWithReadySessionAsync(string tenantId) { string directory = TestSessionFactory.NewSessionsDirectory(); var factory = new FakeClientFactory(); SessionStore store = TestSessionFactory.Store(directory); var farm = new SessionFarm( factory, store, NullLoggerFactory.Instance, NullLogger.Instance); await farm.StartPhoneAsync(tenantId, SessionHarness.ApiId, SessionHarness.ApiHash, Phone, CancellationToken.None).ConfigureAwait(false); await farm.SendCodeAsync(tenantId, "11111", CancellationToken.None).ConfigureAwait(false); return new FarmHarness(directory, store, factory, farm); } /// /// Останавливает пул (сохранение/освобождение сессий) и удаляет temp-каталог. /// public async ValueTask DisposeAsync() { await Farm.ShutdownAsync(CancellationToken.None).ConfigureAwait(false); TestSessionFactory.Cleanup(Directory); } }