Files
darman ec78c0cdf5 Add user identity system with channel pairing and web /link command
Introduce Luna.Identity project with user identity service, pairing code
generation, and channel linking. Channels (Telegram, CLI) now verify link
status before routing messages and prompt users to pair via the web
interface. WebChannel handles /link <channel-type> <code> commands to
complete the pairing flow.

Fix inverted expiration check in IsPairingCodeExpired that caused codes
to be treated as expired immediately after creation.
2026-04-04 16:09:10 +02:00

111 lines
3.6 KiB
C#

// using Luna.Channels.Abstractions;
// using Luna.Channels.Cli;
// using Luna.Core.Abstractions;
// using Luna.Shared;
// using Moq;
//
// namespace Luna.Channels.Tests;
//
// [TestFixture]
// [Category("Unit")]
// public class CliChannelTests
// {
// [Test]
// public void ChannelType_Returns_Cli()
// {
// var hubMock = new Mock<IChatHubContext>();
// var channel = new CliChannel("test-1", hubMock.Object);
//
// Assert.That(channel.ChannelType, Is.EqualTo("cli"));
// }
//
// [Test]
// public void ChannelId_IsUnique_PerInstance()
// {
// var hubMock = new Mock<IChatHubContext>();
// var channel1 = new CliChannel("test-1", hubMock.Object);
// var channel2 = new CliChannel("test-2", hubMock.Object);
//
// Assert.That(channel1.ChannelId, Is.Not.EqualTo(channel2.ChannelId));
// }
//
// [Test]
// public void DisplayName_Returns_HumanReadable()
// {
// var hubMock = new Mock<IChatHubContext>();
// var channel = new CliChannel("test-1", hubMock.Object);
//
// Assert.That(channel.DisplayName, Is.Not.Null.And.Not.Empty);
// }
//
// [Test]
// public async Task SendMessageAsync_Sends_ChannelMessage()
// {
// var hubMock = new Mock<IChatHubContext>();
// var channel = new CliChannel("test-1", hubMock.Object);
// var message = new ChannelMessage(
// Guid.NewGuid().ToString(),
// Guid.NewGuid().ToString(),
// "cli-user-1",
// "CLI User",
// "Hello from CLI",
// DateTimeOffset.UtcNow);
//
// await channel.SendMessageAsync(message);
// }
//
// [Test]
// public async Task SendStreamingMessageAsync_Consumes_Stream()
// {
// var hubMock = new Mock<IChatHubContext>();
// var channel = new CliChannel("test-1", hubMock.Object);
//
// async IAsyncEnumerable<ChatStreamUpdate> TestStream()
// {
// yield return new ChatStreamUpdate(ChatStreamUpdateType.Text, "Hello", "assistant", false);
// yield return new ChatStreamUpdate(ChatStreamUpdateType.Text, " world", "assistant", false);
// yield return new ChatStreamUpdate(ChatStreamUpdateType.Complete, null, "assistant", true);
// await Task.CompletedTask;
// }
//
// await channel.SendStreamingMessageAsync(TestStream());
// }
//
// [Test]
// public void Dispose_CleansUp()
// {
// var hubMock = new Mock<IChatHubContext>();
// var channel = new CliChannel("test-1", hubMock.Object);
//
// Assert.That(() => channel.Dispose(), Throws.Nothing);
// }
//
// [Test]
// public void MessageReceived_Event_Fires_On_RaiseMessageReceived()
// {
// var hubMock = new Mock<IChatHubContext>();
// var channel = new CliChannel("test-1", hubMock.Object);
// ChannelMessageReceivedEventArgs? capturedArgs = null;
//
// channel.MessageReceived += (_, args) =>
// {
// capturedArgs = args;
// return Task.CompletedTask;
// };
//
// var message = new ChannelMessage(
// Guid.NewGuid().ToString(),
// Guid.NewGuid().ToString(),
// "cli-user-1",
// "CLI User",
// "Hello from CLI",
// DateTimeOffset.UtcNow);
//
// channel.RaiseMessageReceived(null, message);
//
// Assert.That(capturedArgs, Is.Not.Null,
// "MessageReceived event must fire when RaiseMessageReceived is called.");
// Assert.That(capturedArgs!.Message.Content, Is.EqualTo("Hello from CLI"));
// }
// }