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