Code und 2FA-Passwort wurden nur im Desktop-Dialog abgefragt; eine Instanz ohne Fenster liess die Anmeldung aus. Jetzt haelt die Instanz die Frage (TelegramLoginBroker), die Einstellungsseite beantwortet sie. Die Anmeldung laeuft im Hintergrund, damit die HTTP-Flaeche, ueber die der Code kommt, nicht auf ihn wartet. Eine offene Frage verfaellt nach 15 Minuten. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
72 lines
2.1 KiB
C#
72 lines
2.1 KiB
C#
using ClawdDotNet.App.Services;
|
|
using Shouldly;
|
|
|
|
namespace ClawdDotNet.App.Tests.Services;
|
|
|
|
/// <summary>
|
|
/// #794: The Telegram client login through the WebUI — the question waits for the answer,
|
|
/// and an answer without a question goes nowhere.
|
|
/// </summary>
|
|
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<TaskCanceledException>(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);
|
|
}
|