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> loggerMock = new(); [Test] public void RegisterChannel_And_GetChannel_Returns_It() { var sessionManagerMock = new Mock(); var stub = new ChannelManager(sessionManagerMock.Object, loggerMock.Object); var mockChannel = new Mock(); 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(); var stub = new ChannelManager(sessionManagerMock.Object, loggerMock.Object); var mockChannel = new Mock(); mockChannel.Setup(c => c.ChannelId).Returns("dup-1"); stub.RegisterChannel(mockChannel.Object); Assert.That(() => stub.RegisterChannel(mockChannel.Object), Throws.TypeOf()); } [Test] public void UnregisterChannel_Removes_Channel() { var sessionManagerMock = new Mock(); var stub = new ChannelManager(sessionManagerMock.Object, loggerMock.Object); var mockChannel = new Mock(); 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(); 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(); var stub = new ChannelManager(sessionManagerMock.Object, loggerMock.Object); for (int i = 0; i < 3; i++) { var mockChannel = new Mock(); 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(); var stub = new ChannelManager(sessionManagerMock.Object, loggerMock.Object); var mockChannel = new Mock(); 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); } }