Deal.Tests.Unit, Deal.Telegram.Tests, Deal.Ai.Tests, Deal.Ml.Tests разложены по областям (Modules/<X>, Api, Infrastructure, Contracts, Grpc, ...), общие хелперы -> Support; namespace = папка, using между областями добавлены итеративно по ошибкам сборки.
81 lines
3.2 KiB
C#
81 lines
3.2 KiB
C#
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);
|
||
}
|
||
}
|