using Deal.Telegram.Sessions;
using Microsoft.Extensions.Logging.Abstractions;
namespace Deal.Telegram.Tests.Telegram;
// Фабрика компонентов хранилища сессий для unit-тестов: уникальный temp-каталог на сценарий,
// тестовый ключ AES-256 и реальные SessionFileCipher/SessionStore (без сети).
internal static class TestSessionFactory
{
///
/// Тестовый ключ AES-256
///
public static byte[] TestKey { get; } = Enumerable.Range(1, 32).Select(index => (byte)index).ToArray();
///
/// Создаёт уникальный temp-каталог для сценария теста.
///
public static string NewSessionsDirectory()
=> Path.Combine(Path.GetTempPath(), "deal-tg-sessions", Guid.NewGuid().ToString("N"));
///
/// Опции хранилища над temp-каталогом.
///
/// Каталог сессий (NewSessionsDirectory).
/// Ключ шифрования (по умолчанию ).
public static TgOptions Options(string sessionsDirectory, byte[]? key = null)
=> TgOptions.Create(key ?? TestKey, sessionsDirectory);
///
/// Шифр сессий над каталогом.
///
/// Каталог сессий.
/// Ключ шифрования.
public static SessionFileCipher Cipher(string sessionsDirectory, byte[]? key = null)
=> new(Options(sessionsDirectory, key));
///
/// Реальное файловое хранилище над temp-каталогом
///
/// Каталог сессий.
/// Ключ шифрования.
public static SessionStore Store(string sessionsDirectory, byte[]? key = null)
=> new(Options(sessionsDirectory, key), Cipher(sessionsDirectory, key), NullLogger.Instance);
///
/// Удаляет temp-каталог после сценария
///
/// Каталог сессий.
public static void Cleanup(string sessionsDirectory)
{
try
{
Directory.Delete(sessionsDirectory, recursive: true);
}
catch (IOException)
{
// Занятый файл — тестовый мусор в temp допустим.
}
}
}