using ClawdDotNet.App.Services; using Shouldly; namespace ClawdDotNet.App.Tests.Services; /// /// #794: The Telegram client login through the WebUI — the question waits for the answer, /// and an answer without a question goes nowhere. /// public sealed class TelegramLoginBrokerTests { [Fact] public async Task The_code_from_the_web_reaches_the_waiting_login() { var broker = new TelegramLoginBroker(configured: true); var waiting = broker.AskForCodeAsync("code?"); broker.Status.State.ShouldBe(TelegramLoginState.NeedsCode); broker.Answer(" 12345 ").Ok.ShouldBeTrue(); (await waiting).ShouldBe("12345"); broker.Status.State.ShouldBe(TelegramLoginState.Connecting); } [Fact] public void An_answer_without_a_question_is_refused() { var broker = new TelegramLoginBroker(configured: true); broker.Answer("12345").Ok.ShouldBeFalse(); } [Fact] public async Task An_answer_is_used_once() { var broker = new TelegramLoginBroker(configured: true); var waiting = broker.AskForPasswordAsync(); broker.Answer("secret").Ok.ShouldBeTrue(); broker.Answer("again").Ok.ShouldBeFalse(); (await waiting).ShouldBe("secret"); } [Fact] public void The_status_never_carries_the_answer() { var broker = new TelegramLoginBroker(configured: true); _ = broker.AskForPasswordAsync(); broker.Answer("hunter2"); broker.Status.Message.ShouldNotContain("hunter2"); } [Fact] public async Task A_new_question_cancels_an_unanswered_one() { var broker = new TelegramLoginBroker(configured: true); var first = broker.AskForCodeAsync("code?"); var second = broker.AskForCodeAsync("code again?"); await Should.ThrowAsync(first); broker.Answer("777").Ok.ShouldBeTrue(); (await second).ShouldBe("777"); } [Fact] public void Without_a_client_the_state_says_so() => new TelegramLoginBroker(configured: false).Status.State.ShouldBe(TelegramLoginState.NotConfigured); }