feat: route publishes to jetstream with puback
This commit is contained in:
@@ -1,14 +1,51 @@
|
||||
using System.Text;
|
||||
using NATS.Server.JetStream;
|
||||
using NATS.Server.JetStream.Api;
|
||||
using NATS.Server.JetStream.Publish;
|
||||
|
||||
namespace NATS.Server.Tests;
|
||||
|
||||
internal static class JetStreamApiFixture
|
||||
internal sealed class JetStreamApiFixture : IAsyncDisposable
|
||||
{
|
||||
private static readonly JetStreamApiRouter Router = new();
|
||||
private static readonly StreamManager SharedStreamManager = new();
|
||||
private static readonly JetStreamApiRouter SharedRouter = new(SharedStreamManager);
|
||||
|
||||
private readonly StreamManager _streamManager;
|
||||
private readonly JetStreamApiRouter _router;
|
||||
private readonly JetStreamPublisher _publisher;
|
||||
|
||||
private JetStreamApiFixture()
|
||||
{
|
||||
_streamManager = new StreamManager();
|
||||
_router = new JetStreamApiRouter(_streamManager);
|
||||
_publisher = new JetStreamPublisher(_streamManager);
|
||||
}
|
||||
|
||||
public static Task<JetStreamApiResponse> RequestAsync(string subject, string payload)
|
||||
{
|
||||
return Task.FromResult(Router.Route(subject, Encoding.UTF8.GetBytes(payload)));
|
||||
return Task.FromResult(SharedRouter.Route(subject, Encoding.UTF8.GetBytes(payload)));
|
||||
}
|
||||
|
||||
public static async Task<JetStreamApiFixture> StartWithStreamAsync(string streamName, string subject, int maxMsgs = 0)
|
||||
{
|
||||
var fixture = new JetStreamApiFixture();
|
||||
var payload = $"{{\"name\":\"{streamName}\",\"subjects\":[\"{subject}\"],\"max_msgs\":{maxMsgs}}}";
|
||||
_ = await fixture.RequestLocalAsync($"$JS.API.STREAM.CREATE.{streamName}", payload);
|
||||
return fixture;
|
||||
}
|
||||
|
||||
public Task<PubAck> PublishAndGetAckAsync(string subject, string payload)
|
||||
{
|
||||
if (_publisher.TryCapture(subject, Encoding.UTF8.GetBytes(payload), out var ack))
|
||||
return Task.FromResult(ack);
|
||||
|
||||
return Task.FromResult(new PubAck { ErrorCode = 404 });
|
||||
}
|
||||
|
||||
public Task<JetStreamApiResponse> RequestLocalAsync(string subject, string payload)
|
||||
{
|
||||
return Task.FromResult(_router.Route(subject, Encoding.UTF8.GetBytes(payload)));
|
||||
}
|
||||
|
||||
public ValueTask DisposeAsync() => ValueTask.CompletedTask;
|
||||
}
|
||||
|
||||
14
tests/NATS.Server.Tests/JetStreamPublishTests.cs
Normal file
14
tests/NATS.Server.Tests/JetStreamPublishTests.cs
Normal file
@@ -0,0 +1,14 @@
|
||||
namespace NATS.Server.Tests;
|
||||
|
||||
public class JetStreamPublishTests
|
||||
{
|
||||
[Fact]
|
||||
public async Task Publish_to_stream_subject_returns_puback()
|
||||
{
|
||||
await using var fixture = await JetStreamApiFixture.StartWithStreamAsync("ORDERS", "orders.*");
|
||||
var ack = await fixture.PublishAndGetAckAsync("orders.created", "{\"id\":1}");
|
||||
|
||||
ack.Stream.ShouldBe("ORDERS");
|
||||
ack.Seq.ShouldBe((ulong)1);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user