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