using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using ZB.MOM.WW.Secrets.Abstractions; using ZB.MOM.WW.Secrets.DependencyInjection; using ZB.MOM.WW.Secrets.Replication; using ZB.MOM.WW.Secrets.Replicator.AkkaDotNet.DependencyInjection; namespace ZB.MOM.WW.Secrets.Replicator.AkkaDotNet.Tests.DependencyInjection; /// /// scadaproj#30 (Secrets-001), Akka half: the package must bind its own replicator and decorator /// whether the application calls AddZbSecrets before or after it. Until 0.6.6 the package /// TryAdd-ed its replicator ahead of its internal AddZbSecrets, which fixed the 0.2.0 order /// bug only for the package's own call — an application that called AddZbSecrets FIRST still /// got NoOpSecretReplicator. Builds the real container against a joined cluster and resolves. /// public sealed class RegistrationOrderTests(SingleNodeClusterFixture cluster) : IClassFixture { public enum Order { CoreFirst, ExtensionFirst, } [Theory] [InlineData(Order.CoreFirst)] [InlineData(Order.ExtensionFirst)] public void Replication_is_bound_in_either_order(Order order) { string dbPath = Path.Combine(Path.GetTempPath(), $"zb-akka-order-{Guid.NewGuid():N}.db"); IConfigurationRoot config = new ConfigurationBuilder() .AddInMemoryCollection(new Dictionary { ["Secrets:SqlitePath"] = dbPath, ["Secrets:RunMigrationsOnStartup"] = "false", ["Secrets:Replication:AnnounceInterval"] = "00:00:30", ["Secrets:Replication:ActorName"] = $"zb-secret-replication-{order}", }) .Build(); var services = new ServiceCollection(); services.AddLogging(); services.AddSingleton(cluster.System); if (order == Order.CoreFirst) { services.AddZbSecrets(config, "Secrets"); services.AddZbSecretsAkkaReplication(config, "Secrets", "Secrets:Replication"); } else { services.AddZbSecretsAkkaReplication(config, "Secrets", "Secrets:Replication"); services.AddZbSecrets(config, "Secrets"); } using ServiceProvider provider = services.BuildServiceProvider(); Assert.IsType(provider.GetRequiredService()); Assert.IsType(Assert.Single(provider.GetServices())); } }