@@ -180,6 +180,64 @@ public async Task Publish_test(NatsRequestReplyMode mode)
180180 }
181181 }
182182
183+ [ SkipIfNatsServer ( versionEarlierThan : "2.12" ) ]
184+ public async Task Publish_expected_last_subject_sequence_subject_test ( )
185+ {
186+ await using var nats = new NatsConnection ( new NatsOpts
187+ {
188+ Url = _server . Url ,
189+ ConnectTimeout = TimeSpan . FromSeconds ( 10 ) ,
190+ } ) ;
191+ await nats . ConnectRetryAsync ( ) ;
192+ var prefix = _server . GetNextId ( ) ;
193+
194+ var js = new NatsJSContext ( nats ) ;
195+
196+ var cts = new CancellationTokenSource ( TimeSpan . FromSeconds ( 10 ) ) ;
197+
198+ await js . CreateStreamAsync ( $ "{ prefix } s1", new [ ] { $ "{ prefix } s1.>" } , cts . Token ) ;
199+
200+ // Publish to subject1
201+ var ack1 = await js . PublishAsync (
202+ subject : $ "{ prefix } s1.filter.subject1",
203+ data : 1 ,
204+ cancellationToken : cts . Token ) ;
205+ Assert . Null ( ack1 . Error ) ;
206+
207+ // Publish to subject2
208+ var ack2 = await js . PublishAsync (
209+ subject : $ "{ prefix } s1.filter.subject2",
210+ data : 2 ,
211+ cancellationToken : cts . Token ) ;
212+ Assert . Null ( ack2 . Error ) ;
213+
214+ // Publish to subject1 again, using ExpectedLastSubjectSequenceSubject to check against subject2's last sequence
215+ var ack3 = await js . PublishAsync (
216+ subject : $ "{ prefix } s1.filter.subject1",
217+ data : 3 ,
218+ opts : new NatsJSPubOpts
219+ {
220+ ExpectedLastSubjectSequence = ack2 . Seq ,
221+ ExpectedLastSubjectSequenceSubject = $ "{ prefix } s1.filter.subject2",
222+ } ,
223+ cancellationToken : cts . Token ) ;
224+ Assert . Null ( ack3 . Error ) ;
225+
226+ // Publish with stale sequence for subject2 should fail
227+ var ack4 = await js . PublishAsync (
228+ subject : $ "{ prefix } s1.filter.subject1",
229+ data : 4 ,
230+ opts : new NatsJSPubOpts
231+ {
232+ ExpectedLastSubjectSequence = ack1 . Seq , // stale sequence
233+ ExpectedLastSubjectSequenceSubject = $ "{ prefix } s1.filter.subject2",
234+ } ,
235+ cancellationToken : cts . Token ) ;
236+ Assert . Equal ( 400 , ack4 . Error ? . Code ) ;
237+ Assert . Equal ( 10071 , ack4 . Error ? . ErrCode ) ;
238+ Assert . Matches ( @"wrong last sequence: \d+" , ack4 . Error ? . Description ) ;
239+ }
240+
183241 [ Theory ]
184242 [ InlineData ( NatsRequestReplyMode . Direct ) ]
185243 [ InlineData ( NatsRequestReplyMode . SharedInbox ) ]
0 commit comments