namespace GmRelay.E2E.Runner;
///
/// Automates the first step of every Telegram E2E scenario:
/// create a supergroup, invite the GmRelay bot, and verify the bot responds to /start.
///
public sealed class GroupSetupScenario
{
private readonly TelegramUserClient _client;
private readonly RunnerConfig _config;
public GroupSetupScenario(TelegramUserClient client, RunnerConfig config)
{
_client = client;
_config = config;
}
public async Task RunAsync(CancellationToken cancellationToken = default)
{
var group = await _client.CreateGroupAsync(
$"GmRelay E2E {DateTime.UtcNow:yyyyMMdd-HHmmss}",
"Automated test group for GmRelay E2E suite.",
cancellationToken);
Console.WriteLine($"[scenario] created group id={group.Id} title='{group.Title}'");
await _client.InviteBotToGroupAsync(group, _config.BotUsername, cancellationToken);
Console.WriteLine($"[scenario] invited @{_config.BotUsername}");
await _client.SendCommandAsync(group, "start", cancellationToken);
var reply = await _client.WaitForBotReplyAsync(
group,
containsText: null,
timeout: TimeSpan.FromSeconds(30),
cancellationToken);
if (reply is null)
throw new InvalidOperationException("Bot did not reply to /start in the group.");
Console.WriteLine($"[scenario] bot replied to /start (msg id={reply.id})");
return new ScenarioResult(group, reply.id);
}
public async Task CleanupAsync(ScenarioResult result, CancellationToken cancellationToken = default)
{
try
{
await _client.DeleteGroupAsync(result.Group, cancellationToken);
Console.WriteLine($"[scenario] deleted group id={result.Group.Id}");
}
catch (Exception ex)
{
Console.WriteLine($"[scenario] warning: failed to delete group id={result.Group.Id}: {ex.Message}");
}
}
}
public sealed record ScenarioResult(ChatGroup Group, int LastBotMessageId);