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 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[] { 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)); } }