Files
VolcanicCore/tests/VolcanicCore.Tests/NatsPublishNodeTests.cs

51 lines
1.9 KiB
C#

using System.Text.Json;
using Microsoft.Extensions.Logging.Abstractions;
using VolcanicCore.Api.Engine;
using VolcanicCore.Core;
using VolcanicCore.Nodes;
// ImplicitUsings pulls System.Threading → collision with our ExecutionContext.
using ExecutionContext = VolcanicCore.Api.Engine.ExecutionContext;
namespace VolcanicCore.Tests;
public class NatsPublishNodeTests
{
private sealed class FakePublisher : NatsPublishNode.INatsPublisher
{
public List<(string subject, byte[] payload)> Sent { get; } = new();
public Task PublishAsync(string subject, byte[] payload, CancellationToken ct)
{ Sent.Add((subject, payload)); return Task.CompletedTask; }
}
private sealed class FakeReg : IConnectionInstanceRegistry
{
private readonly object _h;
public FakeReg(object h) => _h = h;
public Task<object> GetAsync(string id, CancellationToken ct) => Task.FromResult(_h);
}
[Fact]
public async Task Publishes_each_item_as_its_json_bytes()
{
var pub = new FakePublisher();
var reg = new FakeReg(pub);
var node = new NatsPublishNode();
var ctx = new ExecutionContext("e", "wf", "n",
JsonDocument.Parse("""{"subject":"out"}""").RootElement,
null, NullLogger.Instance, "c1", reg);
var input = new IReadOnlyList<Item>[]
{
new [] {
new Item(JsonDocument.Parse("""{"a":1}""").RootElement.Clone()),
new Item(JsonDocument.Parse("""{"a":2}""").RootElement.Clone()),
}
};
var outputs = await node.ExecuteAsync(ctx, input, CancellationToken.None);
Assert.Empty(outputs);
Assert.Equal(2, pub.Sent.Count);
Assert.All(pub.Sent, s => Assert.Equal("out", s.subject));
Assert.Equal("""{"a":1}""", System.Text.Encoding.UTF8.GetString(pub.Sent[0].payload));
}
}