@@ -425,6 +425,56 @@ public async Task GetSubscriptionToPublish_SelectsHighestPriorityAndOldest()
425425 Assert . That ( result3 , Is . SameAs ( sub1 . Object ) ) ;
426426 }
427427
428+ [ Test ]
429+ public async Task PublishAsync_RequeueTrue_AddsToFrontOfQueue ( )
430+ {
431+ using var queue = new SessionPublishQueue ( m_serverMock . Object , m_sessionMock . Object , MaxPublishRequests ) ;
432+
433+ var subMock = new Mock < ISubscription > ( ) ;
434+ subMock . Setup ( s => s . Id ) . Returns ( 1 ) ;
435+ queue . Add ( subMock . Object ) ;
436+
437+ var taskA = queue . PublishAsync ( "channel1" , DateTime . MaxValue , false , CancellationToken . None ) ;
438+ var taskB = queue . PublishAsync ( "channel1" , DateTime . MaxValue , true , CancellationToken . None ) ;
439+ var taskC = queue . PublishAsync ( "channel1" , DateTime . MaxValue , false , CancellationToken . None ) ;
440+
441+ subMock . Setup ( s => s . PublishTimerExpired ( ) ) . Returns ( PublishingState . NotificationsAvailable ) ;
442+
443+ // First expiration should complete taskB because it was requeued (added to front)
444+ queue . PublishTimerExpired ( ) ;
445+ var resultB = await taskB . ConfigureAwait ( false ) ;
446+ Assert . That ( resultB , Is . SameAs ( subMock . Object ) ) ;
447+ Assert . That ( taskA . IsCompleted , Is . False ) ;
448+ Assert . That ( taskC . IsCompleted , Is . False ) ;
449+
450+ queue . Remove ( subMock . Object , false ) ;
451+
452+ // Need another subscription to fulfill the next request
453+ var subMock2 = new Mock < ISubscription > ( ) ;
454+ subMock2 . Setup ( s => s . Id ) . Returns ( 2 ) ;
455+ subMock2 . Setup ( s => s . PublishTimerExpired ( ) ) . Returns ( PublishingState . NotificationsAvailable ) ;
456+ queue . Add ( subMock2 . Object ) ;
457+
458+ // Second expiration should complete taskA (it was the first added with requeue=false)
459+ queue . PublishTimerExpired ( ) ;
460+ var resultA = await taskA . ConfigureAwait ( false ) ;
461+ Assert . That ( resultA , Is . SameAs ( subMock2 . Object ) ) ;
462+ Assert . That ( taskC . IsCompleted , Is . False ) ;
463+
464+ queue . Remove ( subMock2 . Object , false ) ;
465+
466+ // Need a third subscription to fulfill the last request
467+ var subMock3 = new Mock < ISubscription > ( ) ;
468+ subMock3 . Setup ( s => s . Id ) . Returns ( 3 ) ;
469+ subMock3 . Setup ( s => s . PublishTimerExpired ( ) ) . Returns ( PublishingState . NotificationsAvailable ) ;
470+ queue . Add ( subMock3 . Object ) ;
471+
472+ // Third expiration should complete taskC
473+ queue . PublishTimerExpired ( ) ;
474+ var resultC = await taskC . ConfigureAwait ( false ) ;
475+ Assert . That ( resultC , Is . SameAs ( subMock3 . Object ) ) ;
476+ }
477+
428478 [ Test ]
429479 public async Task Concurrency_MultipleRequestsAndSubscriptions ( )
430480 {
0 commit comments