using Microsoft.Extensions.DependencyInjection; using Svrnty.CQRS.Abstractions; using Svrnty.CQRS.Abstractions.Discovery; using Svrnty.CQRS.Discovery; namespace Svrnty.CQRS.Tests; public class ServiceRegistrationTests { [Fact] public void AddCommand_WithResult_RegistersHandlerInDI() { var services = new ServiceCollection(); services.AddCommand(); var provider = services.BuildServiceProvider(); var handler = provider.GetService>(); Assert.NotNull(handler); Assert.IsType(handler); } [Fact] public void AddCommand_WithResult_RegistersCommandMeta() { var services = new ServiceCollection(); services.AddCommand(); var provider = services.BuildServiceProvider(); var metas = provider.GetServices().ToList(); Assert.Single(metas); Assert.Equal(typeof(CreatePersonCommand), metas[0].CommandType); Assert.Equal(typeof(CreatePersonResult), metas[0].CommandResultType); } [Fact] public void AddCommand_WithoutResult_RegistersHandlerInDI() { var services = new ServiceCollection(); services.AddCommand(); var provider = services.BuildServiceProvider(); var handler = provider.GetService>(); Assert.NotNull(handler); Assert.IsType(handler); } [Fact] public void AddCommand_WithoutResult_RegistersCommandMeta() { var services = new ServiceCollection(); services.AddCommand(); var provider = services.BuildServiceProvider(); var metas = provider.GetServices().ToList(); Assert.Single(metas); Assert.Equal(typeof(DeletePersonCommand), metas[0].CommandType); Assert.Null(metas[0].CommandResultType); } [Fact] public void AddQuery_RegistersHandlerInDI() { var services = new ServiceCollection(); services.AddQuery, PersonQueryHandler>(); var provider = services.BuildServiceProvider(); var handler = provider.GetService>>(); Assert.NotNull(handler); Assert.IsType(handler); } [Fact] public void AddQuery_RegistersQueryMeta() { var services = new ServiceCollection(); services.AddQuery, PersonQueryHandler>(); var provider = services.BuildServiceProvider(); var metas = provider.GetServices().ToList(); Assert.Single(metas); Assert.Equal(typeof(PersonQuery), metas[0].QueryType); Assert.Equal(typeof(IEnumerable), metas[0].QueryResultType); } [Fact] public void AddDefaultCommandDiscovery_RegistersCommandDiscovery() { var services = new ServiceCollection(); services.AddDefaultCommandDiscovery(); var provider = services.BuildServiceProvider(); var discovery = provider.GetService(); Assert.NotNull(discovery); Assert.IsType(discovery); } [Fact] public void AddDefaultQueryDiscovery_RegistersQueryDiscovery() { var services = new ServiceCollection(); services.AddDefaultQueryDiscovery(); var provider = services.BuildServiceProvider(); var discovery = provider.GetService(); Assert.NotNull(discovery); Assert.IsType(discovery); } [Fact] public void FullPipeline_DiscoveryFindsRegisteredCommands() { var services = new ServiceCollection(); services.AddCommand(); services.AddCommand(); services.AddDefaultCommandDiscovery(); var provider = services.BuildServiceProvider(); var discovery = provider.GetRequiredService(); Assert.Equal(2, discovery.GetCommands().Count()); Assert.True(discovery.CommandExists("CreatePerson")); Assert.True(discovery.CommandExists("DeletePerson")); } [Fact] public void FullPipeline_DiscoveryFindsRegisteredQueries() { var services = new ServiceCollection(); services.AddQuery, PersonQueryHandler>(); services.AddQuery(); services.AddDefaultQueryDiscovery(); var provider = services.BuildServiceProvider(); var discovery = provider.GetRequiredService(); Assert.Equal(2, discovery.GetQueries().Count()); Assert.True(discovery.QueryExists("Person")); Assert.True(discovery.QueryExists("customPersonLookup")); } [Fact] public void AddSvrntyCqrs_RegistersDiscoveryServices() { var services = new ServiceCollection(); services.AddSvrntyCqrs(); var provider = services.BuildServiceProvider(); Assert.NotNull(provider.GetService()); Assert.NotNull(provider.GetService()); } [Fact] public void AddSvrntyCqrs_WithFluentBuilder_RegistersCommandsAndQueries() { var services = new ServiceCollection(); services.AddSvrntyCqrs(builder => { builder .AddCommand() .AddCommand() .AddQuery, PersonQueryHandler>(); }); var provider = services.BuildServiceProvider(); var cmdDiscovery = provider.GetRequiredService(); var qryDiscovery = provider.GetRequiredService(); Assert.Equal(2, cmdDiscovery.GetCommands().Count()); Assert.Single(qryDiscovery.GetQueries()); } }