feat: add jetstream publish preconditions and dedupe
This commit is contained in:
@@ -35,12 +35,15 @@ internal sealed class JetStreamApiFixture : IAsyncDisposable
|
||||
return fixture;
|
||||
}
|
||||
|
||||
public Task<PubAck> PublishAndGetAckAsync(string subject, string payload)
|
||||
public Task<PubAck> PublishAndGetAckAsync(string subject, string payload, string? msgId = null, bool expectError = false)
|
||||
{
|
||||
if (_publisher.TryCapture(subject, Encoding.UTF8.GetBytes(payload), out var ack))
|
||||
if (_publisher.TryCapture(subject, Encoding.UTF8.GetBytes(payload), msgId, out var ack))
|
||||
return Task.FromResult(ack);
|
||||
|
||||
return Task.FromResult(new PubAck { ErrorCode = 404 });
|
||||
if (expectError)
|
||||
return Task.FromResult(new PubAck { ErrorCode = 404 });
|
||||
|
||||
throw new InvalidOperationException($"No stream matched subject '{subject}'.");
|
||||
}
|
||||
|
||||
public Task<JetStreamApiResponse> RequestLocalAsync(string subject, string payload)
|
||||
|
||||
15
tests/NATS.Server.Tests/JetStreamPublishPreconditionTests.cs
Normal file
15
tests/NATS.Server.Tests/JetStreamPublishPreconditionTests.cs
Normal file
@@ -0,0 +1,15 @@
|
||||
namespace NATS.Server.Tests;
|
||||
|
||||
public class JetStreamPublishPreconditionTests
|
||||
{
|
||||
[Fact]
|
||||
public async Task Duplicate_msg_id_is_rejected_with_expected_error()
|
||||
{
|
||||
await using var fixture = await JetStreamApiFixture.StartWithStreamAsync("D", "d.*");
|
||||
|
||||
await fixture.PublishAndGetAckAsync("d.a", "x", msgId: "id-1");
|
||||
var second = await fixture.PublishAndGetAckAsync("d.a", "x", msgId: "id-1", expectError: true);
|
||||
|
||||
second.ErrorCode.ShouldBe(10071);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user