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);