1
1
/* eslint-disable @typescript-eslint/no-non-null-assertion */
2
+ import { once } from 'node:events' ;
3
+
2
4
import { expect } from 'chai' ;
3
5
import * as sinon from 'sinon' ;
4
6
@@ -304,22 +306,10 @@ describe('Retryable Writes Spec Prose', () => {
304
306
'emits a command succeeded event for write concern errors with ok: 1' ,
305
307
{ requires : { topology : 'replicaset' , mongodb : '>=4.2.9' } } ,
306
308
async ( ) => {
307
- const successListener = event => {
308
- if ( event . commandName === 'insert' && event . reply . writeConcernError ) {
309
- expect ( event . reply . writeConcernError . code ) . to . equal ( 91 ) ;
310
- }
311
- } ;
312
-
313
- const failureListener = event => {
314
- if ( event . commandName === 'insert' ) {
315
- expect . fail ( 'the insert must be retried after the first suceeded event' ) ;
316
- }
317
- } ;
318
-
319
309
// Generate a write concern error to assert that we get a command
320
310
// suceeded event but the operation will retry because it was an
321
311
// actual write concern error.
322
- client . db ( 'admin' ) . command ( {
312
+ await client . db ( 'admin' ) . command ( {
323
313
configureFailPoint : 'failCommand' ,
324
314
mode : { times : 1 } ,
325
315
data : {
@@ -331,15 +321,21 @@ describe('Retryable Writes Spec Prose', () => {
331
321
}
332
322
} ) ;
333
323
334
- client . addListener ( 'commandSucceeded' , successListener ) ;
335
- client . addListener ( 'commandFailed' , failureListener ) ;
324
+ const willBeCommandSucceeded = once ( client , 'commandSucceeded' ) . catch ( error => error ) ;
325
+ const willBeCommandFailed = once ( client , 'commandFailed' , {
326
+ signal : AbortSignal . timeout ( 1000 )
327
+ } ) . catch ( error => error ) ;
336
328
337
329
const insertResult = await collection . insertOne ( { _id : 1 } ) . catch ( error => error ) ;
338
330
339
- // sinon.restore();
340
- client . removeListener ( 'commandSucceeded' , successListener ) ;
341
- client . removeListener ( 'commandFailed' , failureListener ) ;
342
-
331
+ const [ commandSucceeded ] = await willBeCommandSucceeded ;
332
+ expect ( commandSucceeded . commandName ) . to . equal ( 'insert' ) ;
333
+ expect ( commandSucceeded . reply ) . to . have . nested . property ( 'writeConcernError.code' , 91 ) ;
334
+ const noCommandFailedEvent = await willBeCommandFailed ;
335
+ expect (
336
+ noCommandFailedEvent . message ,
337
+ 'expected timeout, since no failure event should emit'
338
+ ) . to . include ( 'operation was aborted' ) ;
343
339
expect ( insertResult ) . to . deep . equal ( { acknowledged : true , insertedId : 1 } ) ;
344
340
}
345
341
) ;
0 commit comments