Сгруппировать тестовые проекты по областям

Deal.Tests.Unit, Deal.Telegram.Tests, Deal.Ai.Tests, Deal.Ml.Tests
разложены по областям (Modules/<X>, Api, Infrastructure, Contracts,
Grpc, ...), общие хелперы -> Support; namespace = папка, using
между областями добавлены итеративно по ошибкам сборки.
This commit is contained in:
Rustam Khalimov
2026-09-11 13:28:26 +03:00
parent e3a2692507
commit 5bfa92a4ac
212 changed files with 1982 additions and 1686 deletions
@@ -0,0 +1,80 @@
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);
}
}