// Copyright (c) The Geekeey Authors // SPDX-License-Identifier: EUPL-1.2 using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Options; namespace Geekeey.Request.Tests; internal sealed class RequestDispatcherBuilderExtensionsTests { [Test] public async Task I_can_add_a_type_and_register_the_options() { // Arrange var services = new ServiceCollection(); var builder = services.AddRequestDispatcher(); var type = typeof(TestHandler); // Act builder.Add(type); // Assert var provider = services.BuildServiceProvider(); var options = provider.GetRequiredService>().Value; var handlers = options.GetRequestHandlers>(provider); await Assert.That(handlers).Count().IsEqualTo(1); await Assert.That(handlers.First()).IsTypeOf(); } [Test] public async Task I_can_add_a_type_with_a_lifetime_and_register_the_options_and_service() { // Arrange var services = new ServiceCollection(); var builder = services.AddRequestDispatcher(); var type = typeof(TestHandler); var lifetime = ServiceLifetime.Scoped; // Act builder.Add(type, lifetime); // Assert var serviceDescriptor = services.FirstOrDefault(sd => sd.ServiceType == type); await Assert.That(serviceDescriptor).IsNotNull(); await Assert.That(serviceDescriptor.Lifetime).IsEqualTo(lifetime); await Assert.That(serviceDescriptor.ImplementationType).IsEqualTo(type); var provider = services.BuildServiceProvider(); var options = provider.GetRequiredService>().Value; var handlers = options.GetRequestHandlers>(provider); await Assert.That(handlers).Count().IsEqualTo(1); } [Test] public async Task I_can_add_an_enumerable_of_types_and_register_the_options() { // Arrange var services = new ServiceCollection(); var builder = services.AddRequestDispatcher(); var types = new[] { typeof(TestHandler), typeof(AnotherTestHandler) }; // Act builder.Add(types); // Assert var provider = services.BuildServiceProvider(); var options = provider.GetRequiredService>().Value; var handlers1 = options.GetRequestHandlers>(provider); await Assert.That(handlers1).Count().IsEqualTo(1); await Assert.That(handlers1.First()).IsTypeOf(); var handlers2 = options.GetRequestHandlers>(provider); await Assert.That(handlers2).Count().IsEqualTo(1); await Assert.That(handlers2.First()).IsTypeOf(); } [Test] public async Task I_can_add_an_enumerable_of_types_with_a_lifetime_and_register_the_options_and_services() { // Arrange var services = new ServiceCollection(); var builder = services.AddRequestDispatcher(); var types = new[] { typeof(TestHandler), typeof(AnotherTestHandler) }; var lifetime = ServiceLifetime.Singleton; // Act builder.Add(types, lifetime); // Assert foreach (var type in types) { var serviceDescriptor = services.FirstOrDefault(sd => sd.ServiceType == type); await Assert.That(serviceDescriptor).IsNotNull(); await Assert.That(serviceDescriptor.Lifetime).IsEqualTo(lifetime); } var provider = services.BuildServiceProvider(); var options = provider.GetRequiredService>().Value; await Assert.That(options.GetRequestHandlers>(provider)).Count().IsEqualTo(1); await Assert.That(options.GetRequestHandlers>(provider)).Count().IsEqualTo(1); } [Test] public async Task I_can_see_it_throw_when_the_builder_is_null() { IRequestDispatcherBuilder builder = null!; using (Assert.Multiple()) { await Assert.That(() => builder.Add(typeof(TestHandler))).Throws(); await Assert.That(() => builder.Add(typeof(TestHandler), ServiceLifetime.Transient)).Throws(); await Assert.That(() => builder.Add([typeof(TestHandler)])).Throws(); await Assert.That(() => builder.Add([typeof(TestHandler)], ServiceLifetime.Transient)).Throws(); } } }