@@ -214,4 +214,65 @@ describe("RunQueue.nackMessage", () => {
214214 }
215215 }
216216 ) ;
217+
218+ redisTest (
219+ "nacking a message with retryAt sets the correct requeue time" ,
220+ async ( { redisContainer } ) => {
221+ const queue = new RunQueue ( {
222+ ...testOptions ,
223+ queueSelectionStrategy : new FairQueueSelectionStrategy ( {
224+ redis : {
225+ keyPrefix : "runqueue:test:" ,
226+ host : redisContainer . getHost ( ) ,
227+ port : redisContainer . getPort ( ) ,
228+ } ,
229+ keys : testOptions . keys ,
230+ } ) ,
231+ redis : {
232+ keyPrefix : "runqueue:test:" ,
233+ host : redisContainer . getHost ( ) ,
234+ port : redisContainer . getPort ( ) ,
235+ } ,
236+ } ) ;
237+
238+ try {
239+ const envMasterQueue = `env:${ authenticatedEnvDev . id } ` ;
240+
241+ // Enqueue message
242+ await queue . enqueueMessage ( {
243+ env : authenticatedEnvDev ,
244+ message : messageDev ,
245+ masterQueues : [ "main" , envMasterQueue ] ,
246+ } ) ;
247+
248+ // Dequeue message
249+ const dequeued = await queue . dequeueMessageFromMasterQueue (
250+ "test_12345" ,
251+ envMasterQueue ,
252+ 10
253+ ) ;
254+ expect ( dequeued . length ) . toBe ( 1 ) ;
255+
256+ // Set retryAt to 5 seconds in the future
257+ const retryAt = Date . now ( ) + 5000 ;
258+ await queue . nackMessage ( {
259+ orgId : messageDev . orgId ,
260+ messageId : messageDev . runId ,
261+ retryAt,
262+ } ) ;
263+
264+ // Check the score of the message in the queue
265+ const queueKey = queue . keys . queueKey ( authenticatedEnvDev , messageDev . queue ) ;
266+ const score = await queue . oldestMessageInQueue ( authenticatedEnvDev , messageDev . queue ) ;
267+ expect ( typeof score ) . toBe ( "number" ) ;
268+ if ( typeof score !== "number" ) {
269+ throw new Error ( "Expected score to be a number, but got undefined" ) ;
270+ }
271+ // Should be within 100ms of retryAt
272+ expect ( Math . abs ( score - retryAt ) ) . toBeLessThanOrEqual ( 100 ) ;
273+ } finally {
274+ await queue . quit ( ) ;
275+ }
276+ }
277+ ) ;
217278} ) ;
0 commit comments