Add channel system unit and integration tests

Comprehensive NUnit test suite covering ChannelManager, CliChannel,
TelegramChannel, DI registration, and integration scenarios. Uses
Moq for mocking with test stubs for isolated unit testing.
This commit is contained in:
2026-04-04 04:12:24 +02:00
parent 9a05bae4a9
commit f21d55d87d
12 changed files with 1300 additions and 0 deletions
@@ -0,0 +1,114 @@
using Luna.Channels.Abstractions;
using Luna.Channels.Tests.Stubs;
using Luna.Core.Abstractions;
using Luna.Shared;
using Microsoft.Extensions.Logging;
using Moq;
namespace Luna.Channels.Tests;
[TestFixture]
[Category("Unit")]
public class ChannelManagerInterfaceTests
{
private readonly Mock<ILogger<ChannelManager>> loggerMock = new();
[Test]
public void RegisterChannel_And_GetChannel_Returns_It()
{
var sessionManagerMock = new Mock<ISessionManager>();
var stub = new ChannelManager(sessionManagerMock.Object, loggerMock.Object);
var mockChannel = new Mock<IChannel>();
mockChannel.Setup(c => c.ChannelId).Returns("test-1");
stub.RegisterChannel(mockChannel.Object);
var result = stub.GetChannel("test-1");
Assert.That(result, Is.EqualTo(mockChannel.Object));
}
[Test]
public void RegisterChannel_Duplicate_Id_Throws()
{
var sessionManagerMock = new Mock<ISessionManager>();
var stub = new ChannelManager(sessionManagerMock.Object, loggerMock.Object);
var mockChannel = new Mock<IChannel>();
mockChannel.Setup(c => c.ChannelId).Returns("dup-1");
stub.RegisterChannel(mockChannel.Object);
Assert.That(() => stub.RegisterChannel(mockChannel.Object),
Throws.TypeOf<InvalidOperationException>());
}
[Test]
public void UnregisterChannel_Removes_Channel()
{
var sessionManagerMock = new Mock<ISessionManager>();
var stub = new ChannelManager(sessionManagerMock.Object, loggerMock.Object);
var mockChannel = new Mock<IChannel>();
mockChannel.Setup(c => c.ChannelId).Returns("rem-1");
stub.RegisterChannel(mockChannel.Object);
stub.UnregisterChannel("rem-1");
var result = stub.GetChannel("rem-1");
Assert.That(result, Is.Null);
}
[Test]
public void UnregisterChannel_Unknown_Id_No_Exception()
{
var sessionManagerMock = new Mock<ISessionManager>();
var stub = new ChannelManager(sessionManagerMock.Object, loggerMock.Object);
Assert.That(() => stub.UnregisterChannel("nonexistent-id"), Throws.Nothing);
}
[Test]
public void GetAllChannels_Returns_All_Registered()
{
var sessionManagerMock = new Mock<ISessionManager>();
var stub = new ChannelManager(sessionManagerMock.Object, loggerMock.Object);
for (int i = 0; i < 3; i++)
{
var mockChannel = new Mock<IChannel>();
mockChannel.Setup(c => c.ChannelId).Returns($"ch-{i}");
stub.RegisterChannel(mockChannel.Object);
}
var all = stub.GetAllChannels();
Assert.That(all.Count, Is.EqualTo(3));
}
[Test]
public void MessageRouted_Event_Fires_When_Message_Is_Routed()
{
var sessionManagerMock = new Mock<ISessionManager>();
var stub = new ChannelManager(sessionManagerMock.Object, loggerMock.Object);
var mockChannel = new Mock<IChannel>();
mockChannel.Setup(c => c.ChannelId).Returns("event-ch-1");
ChannelMessageReceivedEventArgs? capturedArgs = null;
stub.MessageRouted += (_, args) => capturedArgs = args;
stub.RegisterChannel(mockChannel.Object);
var message = new ChannelMessage(
Guid.NewGuid().ToString(),
Guid.NewGuid().ToString(),
"sender-1",
"Sender Name",
"Hello",
DateTimeOffset.UtcNow);
var eventArgs = new ChannelMessageReceivedEventArgs
{
Message = message,
Channel = mockChannel.Object
};
Assert.That(capturedArgs, Is.Not.Null);
}
}