@@ -375,6 +375,113 @@ describe("RunQueue", () => {
375375 }
376376 ) ;
377377
378+ redisTest (
379+ "Dequeue a message when another message on the same queue is acked" ,
380+ async ( { redisContainer } ) => {
381+ const queue = new RunQueue ( {
382+ ...testOptions ,
383+ masterQueueConsumersDisabled : true ,
384+ processWorkerQueueDebounceMs : 50 ,
385+ queueSelectionStrategy : new FairQueueSelectionStrategy ( {
386+ redis : {
387+ keyPrefix : "runqueue:test:" ,
388+ host : redisContainer . getHost ( ) ,
389+ port : redisContainer . getPort ( ) ,
390+ } ,
391+ keys : testOptions . keys ,
392+ } ) ,
393+ redis : {
394+ keyPrefix : "runqueue:test:" ,
395+ host : redisContainer . getHost ( ) ,
396+ port : redisContainer . getPort ( ) ,
397+ } ,
398+ } ) ;
399+
400+ try {
401+ // Set queue concurrency limit to 1
402+ await queue . updateQueueConcurrencyLimits ( authenticatedEnvProd , messageProd . queue , 1 ) ;
403+
404+ //initial queue length
405+ const result = await queue . lengthOfQueue ( authenticatedEnvProd , messageProd . queue ) ;
406+ expect ( result ) . toBe ( 0 ) ;
407+ const envQueueLength = await queue . lengthOfEnvQueue ( authenticatedEnvProd ) ;
408+ expect ( envQueueLength ) . toBe ( 0 ) ;
409+
410+ //initial oldest message
411+ const oldestScore = await queue . oldestMessageInQueue (
412+ authenticatedEnvProd ,
413+ messageProd . queue
414+ ) ;
415+ expect ( oldestScore ) . toBe ( undefined ) ;
416+
417+ //enqueue message
418+ await queue . enqueueMessage ( {
419+ env : authenticatedEnvProd ,
420+ message : messageProd ,
421+ workerQueue : "main" ,
422+ skipDequeueProcessing : true ,
423+ } ) ;
424+
425+ // Enqueue another message
426+ await queue . enqueueMessage ( {
427+ env : authenticatedEnvProd ,
428+ message : { ...messageProd , runId : "r4322" } ,
429+ workerQueue : "main" ,
430+ skipDequeueProcessing : true ,
431+ } ) ;
432+
433+ //queue length
434+ const queueLength = await queue . lengthOfQueue ( authenticatedEnvProd , messageProd . queue ) ;
435+ expect ( queueLength ) . toBe ( 2 ) ;
436+ const envLength = await queue . lengthOfEnvQueue ( authenticatedEnvProd ) ;
437+ expect ( envLength ) . toBe ( 2 ) ;
438+
439+ //oldest message
440+ const oldestScore2 = await queue . oldestMessageInQueue (
441+ authenticatedEnvProd ,
442+ messageProd . queue
443+ ) ;
444+ expect ( oldestScore2 ) . toBe ( messageProd . timestamp ) ;
445+
446+ //concurrencies
447+ const queueConcurrency = await queue . currentConcurrencyOfQueue (
448+ authenticatedEnvProd ,
449+ messageProd . queue
450+ ) ;
451+ expect ( queueConcurrency ) . toBe ( 0 ) ;
452+ const envConcurrency = await queue . currentConcurrencyOfEnvironment ( authenticatedEnvProd ) ;
453+ expect ( envConcurrency ) . toBe ( 0 ) ;
454+
455+ // Process the message so it can be dequeued
456+ await queue . processMasterQueueForEnvironment ( authenticatedEnvProd . id , 1 ) ;
457+
458+ //dequeue
459+ const dequeued = await queue . dequeueMessageFromWorkerQueue ( "test_12345" , "main" ) ;
460+
461+ assertNonNullable ( dequeued ) ;
462+ expect ( dequeued ) . toBeDefined ( ) ;
463+ expect ( dequeued ! . messageId ) . toEqual ( messageProd . runId ) ;
464+ expect ( dequeued ! . message . orgId ) . toEqual ( messageProd . orgId ) ;
465+ expect ( dequeued ! . message . version ) . toEqual ( "2" ) ;
466+
467+ // Now lets ack the message
468+ await queue . acknowledgeMessage ( messageProd . orgId , messageProd . runId ) ;
469+
470+ await setTimeout ( 1000 ) ;
471+
472+ // Now we can dequeue the other message
473+ const dequeued2 = await queue . dequeueMessageFromWorkerQueue ( "test_12345" , "main" ) ;
474+ assertNonNullable ( dequeued2 ) ;
475+ expect ( dequeued2 ) . toBeDefined ( ) ;
476+ expect ( dequeued2 ! . messageId ) . toEqual ( "r4322" ) ;
477+ expect ( dequeued2 ! . message . orgId ) . toEqual ( messageProd . orgId ) ;
478+ expect ( dequeued2 ! . message . version ) . toEqual ( "2" ) ;
479+ } finally {
480+ await queue . quit ( ) ;
481+ }
482+ }
483+ ) ;
484+
378485 redisTest ( "Enqueue/Dequeue a 8 shards" , async ( { redisContainer } ) => {
379486 const queue = new RunQueue ( {
380487 ...testOptions ,
0 commit comments