Skip to content

Commit 534df95

Browse files
committed
test(NODE-5788): rework change stream close rejection test
1 parent 833eaa4 commit 534df95

File tree

1 file changed

+16
-107
lines changed

1 file changed

+16
-107
lines changed

test/integration/change-streams/change_stream.test.ts

Lines changed: 16 additions & 107 deletions
Original file line numberDiff line numberDiff line change
@@ -780,115 +780,24 @@ describe('Change Streams', function () {
780780
});
781781
});
782782

783-
describe('should properly handle a changeStream event being processed mid-close', function () {
784-
let client, coll, changeStream;
785-
786-
function write() {
787-
return Promise.resolve()
788-
.then(() => coll.insertOne({ a: 1 }))
789-
.then(() => coll.insertOne({ b: 2 }));
790-
}
791-
792-
function lastWrite() {
793-
return coll.insertOne({ c: 3 });
794-
}
795-
796-
beforeEach(function () {
797-
client = this.configuration.newClient();
798-
return client.connect().then(_client => {
799-
client = _client;
800-
coll = client.db(this.configuration.db).collection('tester');
801-
changeStream = coll.watch();
802-
});
803-
});
804-
805-
afterEach(async function () {
806-
await changeStream?.close();
807-
await client?.close();
808-
coll = undefined;
809-
changeStream = undefined;
810-
client = undefined;
811-
});
812-
813-
it('when invoked with promises', {
814-
metadata: { requires: { topology: 'replicaset' } },
815-
test: function () {
816-
const read = () => {
817-
return Promise.resolve()
818-
.then(() => changeStream.next())
819-
.then(() => changeStream.next())
820-
.then(() => {
821-
this.defer(lastWrite());
822-
const nextP = changeStream.next();
823-
return changeStream.close().then(() => nextP);
824-
});
825-
};
826-
827-
return Promise.all([read(), write()]).then(
828-
() => Promise.reject(new Error('Expected operation to fail with error')),
829-
err => expect(err.message).to.equal('ChangeStream is closed')
830-
);
831-
}
832-
});
833-
834-
it('when invoked with callbacks', {
835-
metadata: { requires: { topology: 'replicaset' } },
836-
test: function (done) {
837-
const ops = [];
838-
changeStream.next(() => {
839-
changeStream.next(() => {
840-
ops.push(lastWrite());
841-
842-
// explicitly close the change stream after the write has begun
843-
ops.push(changeStream.close());
844-
845-
changeStream.next(err => {
846-
try {
847-
expect(err)
848-
.property('message')
849-
.to.match(/ChangeStream is closed/);
850-
Promise.all(ops).then(() => done(), done);
851-
} catch (e) {
852-
done(e);
853-
}
854-
});
855-
});
856-
});
857-
858-
ops.push(
859-
write().catch(() => {
860-
// ignore
861-
})
862-
);
863-
}
864-
});
865-
866-
it.skip('when invoked using eventEmitter API', {
867-
metadata: {
868-
requires: { topology: 'replicaset' }
869-
},
870-
async test() {
871-
const changes = on(changeStream, 'change');
872-
await once(changeStream.cursor, 'init');
873-
874-
await write();
875-
await lastWrite().catch(() => null);
876-
877-
let counter = 0;
878-
879-
for await (const _ of changes) {
880-
counter += 1;
881-
if (counter === 2) {
882-
await changeStream.close();
883-
break;
884-
}
783+
describe('when close is called while changes are pending', function () {
784+
it(
785+
'rejects promises already returned by next',
786+
{ requires: { topology: 'replicaset' } },
787+
async function () {
788+
const changes = Array.from({ length: 20 }, () => changeStream.next());
789+
await changeStream.close();
790+
const results = await Promise.allSettled(changes);
791+
792+
for (const i of changes.keys()) {
793+
expect(results)
794+
.to.have.nested.property(`[${i}].reason`)
795+
.that.is.instanceOf(MongoAPIError);
796+
const message = /ChangeStream is closed/i;
797+
expect(results).nested.property(`[${i}].reason`).to.match(message);
885798
}
886-
887-
const result = await Promise.race([changes.next(), sleep(800).then(() => 42)]);
888-
expect(result, 'should not have recieved a third event').to.equal(42);
889799
}
890-
}).skipReason =
891-
'This test only worked because of timing, changeStream.close does not remove the change listener';
800+
);
892801
});
893802

894803
describe('iterator api', function () {

0 commit comments

Comments
 (0)