using Akka.Actor; using Akka.TestKit.Xunit2; using Microsoft.Extensions.DependencyInjection; using NSubstitute; using Xunit; using ZB.MOM.WW.ScadaBridge.Commons.Entities.Sites; using ZB.MOM.WW.ScadaBridge.Commons.Interfaces.Repositories; using ZB.MOM.WW.ScadaBridge.Communication.Actors; using ZB.MOM.WW.ScadaBridge.HealthMonitoring; namespace ZB.MOM.WW.ScadaBridge.Communication.Tests; /// /// Transport-agnostic refresh behaviour of : the periodic /// DB refresh evicts deleted sites from the health aggregator. The two former tests here — /// per-site ClusterClient recreate-without-restart-loop and factory-throw resilience — asserted /// Akka AkkaSiteTransport internals (InvalidActorNameException, "No ClusterClient for site") /// and were removed with that transport in the ClusterClient→gRPC migration's Phase 4; the /// equivalent gRPC channel reconcile is covered by the GrpcSiteTransport suites. /// public class CentralCommunicationActorClientLifecycleTests : TestKit { [Fact] public void PeriodicRefresh_PrunesDeletedSites_FromHealthAggregator() { // PLAN-01 Task 18: the periodic site refresh feeds the currently-configured // site ids to the aggregator so a deleted site is evicted within one // refresh interval. Repo returns only "site-a". var siteRepo = Substitute.For(); siteRepo.GetAllSitesAsync(Arg.Any()) .Returns(new List { new("Site A", "site-a") }); var aggregator = Substitute.For(); var services = new ServiceCollection(); services.AddScoped(_ => siteRepo); services.AddSingleton(aggregator); var provider = services.BuildServiceProvider(); var transport = Substitute.For(); var actor = Sys.ActorOf(Props.Create(() => new CentralCommunicationActor( provider, transport, (TimeSpan?)null))); // Trigger the refresh (also fires at PreStart, but drive it explicitly so // the assertion is deterministic). The load runs on a detached task and // pipes SiteAddressCacheLoaded back to the actor, which then prunes. actor.Tell(new RefreshSiteAddresses()); AwaitAssert( () => aggregator.Received().PruneUnknownSites( Arg.Is>(ids => ids.Contains("site-a"))), TimeSpan.FromSeconds(3)); } }