feat(notification-outbox): add CommunicationService outbox methods
This commit is contained in:
@@ -3,6 +3,7 @@ using Akka.TestKit.Xunit2;
|
||||
using Microsoft.Extensions.Logging.Abstractions;
|
||||
using Microsoft.Extensions.Options;
|
||||
using ScadaLink.Commons.Messages.Deployment;
|
||||
using ScadaLink.Commons.Messages.Notification;
|
||||
|
||||
namespace ScadaLink.Communication.Tests;
|
||||
|
||||
@@ -72,6 +73,142 @@ public class CommunicationServiceTests : TestKit
|
||||
Assert.Equal("sha256:applied", response.AppliedRevisionHash);
|
||||
}
|
||||
|
||||
// ── Notification Outbox: central-side outbox actor calls ──
|
||||
|
||||
[Fact]
|
||||
public async Task QueryNotificationOutboxAsync_BeforeOutboxSet_Throws()
|
||||
{
|
||||
var service = new CommunicationService(
|
||||
Options.Create(new CommunicationOptions()),
|
||||
NullLogger<CommunicationService>.Instance);
|
||||
|
||||
await Assert.ThrowsAsync<InvalidOperationException>(() =>
|
||||
service.QueryNotificationOutboxAsync(
|
||||
new NotificationOutboxQueryRequest(
|
||||
"corr-1", null, null, null, null, false, null, null, null, 1, 50)));
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public async Task RetryNotificationAsync_BeforeOutboxSet_Throws()
|
||||
{
|
||||
var service = new CommunicationService(
|
||||
Options.Create(new CommunicationOptions()),
|
||||
NullLogger<CommunicationService>.Instance);
|
||||
|
||||
await Assert.ThrowsAsync<InvalidOperationException>(() =>
|
||||
service.RetryNotificationAsync(new RetryNotificationRequest("corr-1", "n1")));
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public async Task DiscardNotificationAsync_BeforeOutboxSet_Throws()
|
||||
{
|
||||
var service = new CommunicationService(
|
||||
Options.Create(new CommunicationOptions()),
|
||||
NullLogger<CommunicationService>.Instance);
|
||||
|
||||
await Assert.ThrowsAsync<InvalidOperationException>(() =>
|
||||
service.DiscardNotificationAsync(new DiscardNotificationRequest("corr-1", "n1")));
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public async Task GetNotificationKpisAsync_BeforeOutboxSet_Throws()
|
||||
{
|
||||
var service = new CommunicationService(
|
||||
Options.Create(new CommunicationOptions()),
|
||||
NullLogger<CommunicationService>.Instance);
|
||||
|
||||
await Assert.ThrowsAsync<InvalidOperationException>(() =>
|
||||
service.GetNotificationKpisAsync(new NotificationKpiRequest("corr-1")));
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public async Task QueryNotificationOutboxAsync_AsksOutboxProxyDirectly()
|
||||
{
|
||||
// The outbox actor is central-local: the request must be Asked directly
|
||||
// to the outbox proxy (no SiteEnvelope wrapping).
|
||||
var service = new CommunicationService(
|
||||
Options.Create(new CommunicationOptions()),
|
||||
NullLogger<CommunicationService>.Instance);
|
||||
var probe = CreateTestProbe();
|
||||
service.SetNotificationOutbox(probe.Ref);
|
||||
|
||||
var request = new NotificationOutboxQueryRequest(
|
||||
"corr-q", "Pending", null, null, null, true, "alarm", null, null, 2, 25);
|
||||
var task = service.QueryNotificationOutboxAsync(request);
|
||||
|
||||
var received = probe.ExpectMsg<NotificationOutboxQueryRequest>();
|
||||
Assert.Same(request, received);
|
||||
var reply = new NotificationOutboxQueryResponse(
|
||||
"corr-q", true, null, Array.Empty<NotificationSummary>(), 0);
|
||||
probe.Reply(reply);
|
||||
|
||||
Assert.Same(reply, await task);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public async Task RetryNotificationAsync_AsksOutboxProxyDirectly()
|
||||
{
|
||||
var service = new CommunicationService(
|
||||
Options.Create(new CommunicationOptions()),
|
||||
NullLogger<CommunicationService>.Instance);
|
||||
var probe = CreateTestProbe();
|
||||
service.SetNotificationOutbox(probe.Ref);
|
||||
|
||||
var request = new RetryNotificationRequest("corr-r", "n-7");
|
||||
var task = service.RetryNotificationAsync(request);
|
||||
|
||||
var received = probe.ExpectMsg<RetryNotificationRequest>();
|
||||
Assert.Same(request, received);
|
||||
var reply = new RetryNotificationResponse("corr-r", true, null);
|
||||
probe.Reply(reply);
|
||||
|
||||
Assert.Same(reply, await task);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public async Task DiscardNotificationAsync_AsksOutboxProxyDirectly()
|
||||
{
|
||||
var service = new CommunicationService(
|
||||
Options.Create(new CommunicationOptions()),
|
||||
NullLogger<CommunicationService>.Instance);
|
||||
var probe = CreateTestProbe();
|
||||
service.SetNotificationOutbox(probe.Ref);
|
||||
|
||||
var request = new DiscardNotificationRequest("corr-d", "n-9");
|
||||
var task = service.DiscardNotificationAsync(request);
|
||||
|
||||
var received = probe.ExpectMsg<DiscardNotificationRequest>();
|
||||
Assert.Same(request, received);
|
||||
var reply = new DiscardNotificationResponse("corr-d", false, "already delivered");
|
||||
probe.Reply(reply);
|
||||
|
||||
var result = await task;
|
||||
Assert.Same(reply, result);
|
||||
Assert.False(result.Success);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public async Task GetNotificationKpisAsync_AsksOutboxProxyDirectly()
|
||||
{
|
||||
var service = new CommunicationService(
|
||||
Options.Create(new CommunicationOptions()),
|
||||
NullLogger<CommunicationService>.Instance);
|
||||
var probe = CreateTestProbe();
|
||||
service.SetNotificationOutbox(probe.Ref);
|
||||
|
||||
var request = new NotificationKpiRequest("corr-k");
|
||||
var task = service.GetNotificationKpisAsync(request);
|
||||
|
||||
var received = probe.ExpectMsg<NotificationKpiRequest>();
|
||||
Assert.Same(request, received);
|
||||
var reply = new NotificationKpiResponse("corr-k", true, null, 3, 1, 0, 12, TimeSpan.FromMinutes(5));
|
||||
probe.Reply(reply);
|
||||
|
||||
var result = await task;
|
||||
Assert.Same(reply, result);
|
||||
Assert.Equal(3, result.QueueDepth);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Stand-in for CentralCommunicationActor: verifies the message is wrapped
|
||||
/// in a SiteEnvelope targeting the requested site and replies with a typed
|
||||
|
||||
Reference in New Issue
Block a user