using FluentValidation; using Microsoft.Extensions.DependencyInjection; using Svrnty.CQRS.Abstractions; using Svrnty.CQRS.Abstractions.Discovery; namespace Svrnty.CQRS.Tests; // Validator for CreatePersonCommand public class CreatePersonCommandValidator : AbstractValidator { public CreatePersonCommandValidator() { RuleFor(x => x.FirstName).NotEmpty().WithMessage("FirstName is required"); RuleFor(x => x.LastName).NotEmpty().WithMessage("LastName is required"); } } // Validator for PersonQuery public class PersonQueryValidator : AbstractValidator { public PersonQueryValidator() { RuleFor(x => x.NameFilter).MaximumLength(100).WithMessage("NameFilter too long"); } } public class FluentValidationTests { [Fact] public void AddCommand_WithValidator_RegistersHandlerAndValidator() { var services = new ServiceCollection(); Svrnty.CQRS.FluentValidation.ServiceCollectionExtensions .AddCommand(services); var provider = services.BuildServiceProvider(); var handler = provider.GetService>(); var validator = provider.GetService>(); Assert.NotNull(handler); Assert.NotNull(validator); Assert.IsType(handler); Assert.IsType(validator); } [Fact] public void AddCommand_WithResultAndValidator_RegistersHandlerAndValidator() { var services = new ServiceCollection(); Svrnty.CQRS.FluentValidation.ServiceCollectionExtensions .AddCommand(services); var provider = services.BuildServiceProvider(); var handler = provider.GetService>(); var validator = provider.GetService>(); Assert.NotNull(handler); Assert.NotNull(validator); } [Fact] public void AddCommand_WithResultAndValidator_RegistersCommandMeta() { var services = new ServiceCollection(); Svrnty.CQRS.FluentValidation.ServiceCollectionExtensions .AddCommand(services); 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 AddQuery_WithValidator_RegistersHandlerAndValidator() { var services = new ServiceCollection(); Svrnty.CQRS.FluentValidation.ServiceCollectionExtensions .AddQuery, PersonQueryHandler, PersonQueryValidator>(services); var provider = services.BuildServiceProvider(); var handler = provider.GetService>>(); var validator = provider.GetService>(); Assert.NotNull(handler); Assert.NotNull(validator); Assert.IsType(handler); Assert.IsType(validator); } [Fact] public async Task Validator_RejectsInvalidCommand() { var validator = new CreatePersonCommandValidator(); var command = new CreatePersonCommand { FirstName = "", LastName = "" }; var result = await validator.ValidateAsync(command); Assert.False(result.IsValid); Assert.Equal(2, result.Errors.Count); } [Fact] public async Task Validator_AcceptsValidCommand() { var validator = new CreatePersonCommandValidator(); var command = new CreatePersonCommand { FirstName = "John", LastName = "Doe" }; var result = await validator.ValidateAsync(command); Assert.True(result.IsValid); Assert.Empty(result.Errors); } [Fact] public async Task Validator_ResolvedFromDI_WorksCorrectly() { var services = new ServiceCollection(); Svrnty.CQRS.FluentValidation.ServiceCollectionExtensions .AddCommand(services); var provider = services.BuildServiceProvider(); var validator = provider.GetRequiredService>(); var invalidResult = await validator.ValidateAsync(new CreatePersonCommand { FirstName = "", LastName = "" }); Assert.False(invalidResult.IsValid); var validResult = await validator.ValidateAsync(new CreatePersonCommand { FirstName = "Jane", LastName = "Doe" }); Assert.True(validResult.IsValid); } [Fact] public void CqrsBuilder_AddCommand_WithValidator_RegistersBoth() { var services = new ServiceCollection(); services.AddSvrntyCqrs(builder => { Svrnty.CQRS.FluentValidation.CqrsBuilderExtensions .AddCommand(builder); }); var provider = services.BuildServiceProvider(); Assert.NotNull(provider.GetService>()); Assert.NotNull(provider.GetService>()); } [Fact] public void CqrsBuilder_AddCommand_WithResultAndValidator_RegistersBoth() { var services = new ServiceCollection(); services.AddSvrntyCqrs(builder => { Svrnty.CQRS.FluentValidation.CqrsBuilderExtensions .AddCommand(builder); }); var provider = services.BuildServiceProvider(); Assert.NotNull(provider.GetService>()); Assert.NotNull(provider.GetService>()); } [Fact] public void CqrsBuilder_AddQuery_WithValidator_RegistersBoth() { var services = new ServiceCollection(); services.AddSvrntyCqrs(builder => { Svrnty.CQRS.FluentValidation.CqrsBuilderExtensions .AddQuery, PersonQueryHandler, PersonQueryValidator>(builder); }); var provider = services.BuildServiceProvider(); Assert.NotNull(provider.GetService>>()); Assert.NotNull(provider.GetService>()); } }