using Luna.Channels.Abstractions; using Luna.Channels.Tests.Stubs; using Luna.Configuration; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Options; namespace Luna.Channels.Tests; [TestFixture] [Category("Unit")] public class DependencyInjectionTests { private ServiceCollection services = null!; [SetUp] public void SetUp() { services = []; } [Test] public void AddChannels_RegistersIChannelManager_AsSingleton() { services.AddChannels(); // var provider = services.BuildServiceProvider(); var descriptor = services.FirstOrDefault(d => d.ServiceType == typeof(IChannelManager)); Assert.That(descriptor, Is.Not.Null); Assert.That(descriptor!.Lifetime, Is.EqualTo(ServiceLifetime.Singleton)); } [Test] public void AddChannels_IChannelManager_IsResolvableFromContainer() { services.AddChannels(); var provider = services.BuildServiceProvider(); var manager = provider.GetService(); Assert.That(manager, Is.Not.Null); } [Test] public void AddChannels_TelegramOptions_IsRegistered() { services.AddChannels(); // var provider = services.BuildServiceProvider(); var descriptor = services.FirstOrDefault(d => d.ServiceType.IsGenericType && d.ServiceType.GetGenericTypeDefinition() == typeof(IOptions<>) && d.ServiceType.GetGenericArguments()[0] == typeof(TelegramOptions)); Assert.That(descriptor, Is.Not.Null, "AddChannels() must register TelegramOptions via IOptions"); } [Test] public void AddChannels_CliChannel_IsRegistered() { services.AddChannels(); var provider = services.BuildServiceProvider(); var channels = provider.GetServices().ToList(); var channelTypes = channels.Select(c => c.ChannelType).ToList(); Assert.That(channelTypes, Contains.Item("cli"), "AddChannels() must register a CliChannel with ChannelType 'cli'"); } [Test] public void AddChannels_TelegramChannel_IsRegistered() { services.AddChannels(); var provider = services.BuildServiceProvider(); var channels = provider.GetServices().ToList(); var channelTypes = channels.Select(c => c.ChannelType).ToList(); Assert.That(channelTypes, Contains.Item("telegram"), "AddChannels() must register a TelegramChannel with ChannelType 'telegram'"); } [Test] public void AddChannels_CalledTwice_DoesNotDuplicateSingletonRegistration() { services.AddChannels(); services.AddChannels(); //var provider = services.BuildServiceProvider(); var descriptors = services.Where(d => d.ServiceType == typeof(IChannelManager)).ToList(); Assert.That(descriptors, Has.Count.EqualTo(1), "Calling AddChannels() twice must not register IChannelManager twice"); } [Test] public void AddChannels_SameProviderInstance_ReturnsSameIChannelManager() { services.AddChannels(); var provider = services.BuildServiceProvider(); var first = provider.GetRequiredService(); var second = provider.GetRequiredService(); Assert.That(first, Is.SameAs(second), "IChannelManager must be registered as Singleton — same instance on every resolve"); } }