using Akka.Actor; using Akka.TestKit.Xunit2; using ScadaLink.Commons.Messages.Deployment; using ScadaLink.Commons.Messages.Lifecycle; using ScadaLink.Commons.Messages.Integration; using ScadaLink.Commons.Messages.RemoteQuery; using ScadaLink.Communication.Actors; namespace ScadaLink.Communication.Tests; /// /// WP-4: Tests for SiteCommunicationActor message routing to local actors. /// public class SiteCommunicationActorTests : TestKit { private readonly CommunicationOptions _options = new(); public SiteCommunicationActorTests() : base(@"akka.loglevel = DEBUG") { } [Fact] public void DeployCommand_ForwardedToDeploymentManager() { var dmProbe = CreateTestProbe(); var siteActor = Sys.ActorOf(Props.Create(() => new SiteCommunicationActor("site1", _options, dmProbe.Ref))); var command = new DeployInstanceCommand( "dep1", "inst1", "hash1", "{}", "admin", DateTimeOffset.UtcNow); siteActor.Tell(command); dmProbe.ExpectMsg(msg => msg.DeploymentId == "dep1"); } [Fact] public void LifecycleCommands_ForwardedToDeploymentManager() { var dmProbe = CreateTestProbe(); var siteActor = Sys.ActorOf(Props.Create(() => new SiteCommunicationActor("site1", _options, dmProbe.Ref))); siteActor.Tell(new DisableInstanceCommand("cmd1", "inst1", DateTimeOffset.UtcNow)); dmProbe.ExpectMsg(); siteActor.Tell(new EnableInstanceCommand("cmd2", "inst1", DateTimeOffset.UtcNow)); dmProbe.ExpectMsg(); siteActor.Tell(new DeleteInstanceCommand("cmd3", "inst1", DateTimeOffset.UtcNow)); dmProbe.ExpectMsg(); } [Fact] public void IntegrationCall_WithoutHandler_ReturnsFailure() { var dmProbe = CreateTestProbe(); var siteActor = Sys.ActorOf(Props.Create(() => new SiteCommunicationActor("site1", _options, dmProbe.Ref))); var request = new IntegrationCallRequest( "corr1", "site1", "inst1", "ExtSys1", "GetData", new Dictionary(), DateTimeOffset.UtcNow); siteActor.Tell(request); ExpectMsg(msg => !msg.Success && msg.ErrorMessage == "Integration handler not available"); } [Fact] public void IntegrationCall_WithHandler_ForwardedToHandler() { var dmProbe = CreateTestProbe(); var handlerProbe = CreateTestProbe(); var siteActor = Sys.ActorOf(Props.Create(() => new SiteCommunicationActor("site1", _options, dmProbe.Ref))); // Register integration handler siteActor.Tell(new RegisterLocalHandler(LocalHandlerType.Integration, handlerProbe.Ref)); var request = new IntegrationCallRequest( "corr1", "site1", "inst1", "ExtSys1", "GetData", new Dictionary(), DateTimeOffset.UtcNow); siteActor.Tell(request); handlerProbe.ExpectMsg(msg => msg.CorrelationId == "corr1"); } [Fact] public void EventLogQuery_WithoutHandler_ReturnsFailure() { var dmProbe = CreateTestProbe(); var siteActor = Sys.ActorOf(Props.Create(() => new SiteCommunicationActor("site1", _options, dmProbe.Ref))); var request = new EventLogQueryRequest( "corr1", "site1", null, null, null, null, null, null, null, 25, DateTimeOffset.UtcNow); siteActor.Tell(request); ExpectMsg(msg => !msg.Success); } }