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()));
}
}