using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Options; namespace ScadaLink.ClusterInfrastructure.Tests; /// /// CI-002: Tests that the DI extension methods do real work rather than /// silently returning success. /// must register the so misconfiguration /// fails fast, and the unimplemented actor-registration placeholder must fail /// loudly rather than masquerade as a completed registration. /// public class ServiceCollectionExtensionsTests { [Fact] public void AddClusterInfrastructure_RegistersOptionsValidator() { var services = new ServiceCollection(); services.AddClusterInfrastructure(); var validators = services .Where(d => d.ServiceType == typeof(IValidateOptions)) .ToList(); Assert.NotEmpty(validators); using var provider = services.BuildServiceProvider(); var validator = provider.GetService>(); Assert.IsType(validator); } [Fact] public void AddClusterInfrastructure_ValidatorRejectsBadOptionsAtResolution() { var services = new ServiceCollection(); services.AddClusterInfrastructure(); // A MinNrOfMembers of 2 blocks the cluster singleton after failover. services.Configure(o => { o.SeedNodes = new List { "akka.tcp://scadalink@node1:8081" }; o.MinNrOfMembers = 2; }); using var provider = services.BuildServiceProvider(); var ex = Assert.Throws( () => provider.GetRequiredService>().Value); Assert.Contains("MinNrOfMembers", ex.Message); } [Fact] public void AddClusterInfrastructureActors_ThrowsRatherThanSilentlySucceeding() { var services = new ServiceCollection(); Assert.Throws(() => services.AddClusterInfrastructureActors()); } }