Files
Deal/src/telegram-service/Deal.Telegram.Tests/Telegram/FarmHarness.cs
T
Rustam Khalimov 5bfa92a4ac Сгруппировать тестовые проекты по областям
Deal.Tests.Unit, Deal.Telegram.Tests, Deal.Ai.Tests, Deal.Ml.Tests
разложены по областям (Modules/<X>, Api, Infrastructure, Contracts,
Grpc, ...), общие хелперы -> Support; namespace = папка, using
между областями добавлены итеративно по ошибкам сборки.
2026-09-11 13:28:26 +03:00

81 lines
3.2 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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;
}
/// <summary>
/// Temp-каталог хранилища сессий.
/// </summary>
public string Directory { get; }
/// <summary>
/// Файловое хранилище сессий.
/// </summary>
public SessionStore Store { get; }
/// <summary>
/// Фейковая фабрика клиентов (CreatedClients — ready-клиент тенанта).
/// </summary>
public FakeClientFactory Factory { get; }
/// <summary>
/// Пул сессий с ready-сессией тенанта.
/// </summary>
public SessionFarm Farm { get; }
/// <summary>
/// Ready-фейк-клиент тенанта (настройка диалогов/сообщений тестом).
/// </summary>
public FakeSessionClient Client => Factory.CreatedClients.Single();
/// <summary>
/// Создаёт пул с ready-сессией тенанта (телефонный вход без сети).
/// </summary>
/// <param name="tenantId">Id тенанта.</param>
public static async Task<FarmHarness> 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<SessionFarm>.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);
}
/// <summary>
/// Останавливает пул (сохранение/освобождение сессий) и удаляет temp-каталог.
/// </summary>
public async ValueTask DisposeAsync()
{
await Farm.ShutdownAsync(CancellationToken.None).ConfigureAwait(false);
TestSessionFactory.Cleanup(Directory);
}
}