-
Notifications
You must be signed in to change notification settings - Fork 1.8k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
feat!: adds async iterator for custom promises
- Loading branch information
Thomas Reggi
authored
Oct 20, 2020
1 parent
8aad134
commit 16d6572
Showing
3 changed files
with
127 additions
and
73 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,91 +1,134 @@ | ||
'use strict'; | ||
|
||
const { expect } = require('chai'); | ||
const Sinon = require('sinon'); | ||
|
||
// TODO: unskip as part of NODE-2590 | ||
describe.skip('Cursor Async Iterator Tests', function () { | ||
let client, collection; | ||
before(async function () { | ||
client = this.configuration.newClient(); | ||
describe('Cursor Async Iterator Tests', function () { | ||
context('default promise library', function () { | ||
let client, collection; | ||
before(async function () { | ||
client = this.configuration.newClient(); | ||
|
||
await client.connect(); | ||
const docs = Array.from({ length: 1000 }).map((_, index) => ({ foo: index, bar: 1 })); | ||
await client.connect(); | ||
const docs = Array.from({ length: 1000 }).map((_, index) => ({ foo: index, bar: 1 })); | ||
|
||
collection = client.db(this.configuration.db).collection('async_cursor_tests'); | ||
collection = client.db(this.configuration.db).collection('async_cursor_tests'); | ||
|
||
await collection.deleteMany({}); | ||
await collection.insertMany(docs); | ||
await client.close(); | ||
}); | ||
await collection.deleteMany({}); | ||
await collection.insertMany(docs); | ||
await client.close(); | ||
}); | ||
|
||
beforeEach(async function () { | ||
client = this.configuration.newClient(); | ||
await client.connect(); | ||
collection = client.db(this.configuration.db).collection('async_cursor_tests'); | ||
}); | ||
beforeEach(async function () { | ||
client = this.configuration.newClient(); | ||
await client.connect(); | ||
collection = client.db(this.configuration.db).collection('async_cursor_tests'); | ||
}); | ||
|
||
afterEach(() => client.close()); | ||
|
||
afterEach(() => client.close()); | ||
it('should be able to use a for-await loop on a find command cursor', { | ||
metadata: { requires: { node: '>=10.5.0' } }, | ||
test: async function () { | ||
const cursor = collection.find({ bar: 1 }); | ||
|
||
it('should be able to use a for-await loop on a find command cursor', { | ||
metadata: { requires: { node: '>=10.5.0' } }, | ||
test: async function () { | ||
const cursor = collection.find({ bar: 1 }); | ||
let counter = 0; | ||
for await (const doc of cursor) { | ||
expect(doc).to.have.property('bar', 1); | ||
counter += 1; | ||
} | ||
|
||
let counter = 0; | ||
for await (const doc of cursor) { | ||
expect(doc).to.have.property('bar', 1); | ||
counter += 1; | ||
expect(counter).to.equal(1000); | ||
} | ||
}); | ||
|
||
expect(counter).to.equal(1000); | ||
} | ||
}); | ||
it('should be able to use a for-await loop on an aggregation cursor', { | ||
metadata: { requires: { node: '>=10.5.0' } }, | ||
test: async function () { | ||
const cursor = collection.aggregate([{ $match: { bar: 1 } }]); | ||
|
||
it('should be able to use a for-await loop on an aggregation cursor', { | ||
metadata: { requires: { node: '>=10.5.0' } }, | ||
test: async function () { | ||
const cursor = collection.aggregate([{ $match: { bar: 1 } }]); | ||
let counter = 0; | ||
for await (const doc of cursor) { | ||
expect(doc).to.have.property('bar', 1); | ||
counter += 1; | ||
} | ||
|
||
let counter = 0; | ||
for await (const doc of cursor) { | ||
expect(doc).to.have.property('bar', 1); | ||
counter += 1; | ||
expect(counter).to.equal(1000); | ||
} | ||
|
||
expect(counter).to.equal(1000); | ||
} | ||
}); | ||
|
||
it('should be able to use a for-await loop on a command cursor', { | ||
metadata: { requires: { node: '>=10.5.0', mongodb: '>=3.0.0' } }, | ||
test: async function () { | ||
const cursor1 = collection.listIndexes(); | ||
const cursor2 = collection.listIndexes(); | ||
|
||
const indexes = await cursor1.toArray(); | ||
let counter = 0; | ||
for await (const doc of cursor2) { | ||
expect(doc).to.exist; | ||
counter += 1; | ||
}); | ||
|
||
it('should be able to use a for-await loop on a command cursor', { | ||
metadata: { requires: { node: '>=10.5.0', mongodb: '>=3.0.0' } }, | ||
test: async function () { | ||
const cursor1 = collection.listIndexes(); | ||
const cursor2 = collection.listIndexes(); | ||
|
||
const indexes = await cursor1.toArray(); | ||
let counter = 0; | ||
for await (const doc of cursor2) { | ||
expect(doc).to.exist; | ||
counter += 1; | ||
} | ||
|
||
expect(counter).to.equal(indexes.length); | ||
} | ||
}); | ||
|
||
expect(counter).to.equal(indexes.length); | ||
} | ||
}); | ||
it('should properly stop when cursor is closed', { | ||
metadata: { requires: { node: '>=10.5.0' } }, | ||
test: async function () { | ||
const cursor = collection.find(); | ||
|
||
it('should properly stop when cursor is closed', { | ||
metadata: { requires: { node: '>=10.5.0' } }, | ||
test: async function () { | ||
const cursor = collection.find(); | ||
let count = 0; | ||
for await (const doc of cursor) { | ||
expect(doc).to.exist; | ||
count++; | ||
await cursor.close(); | ||
} | ||
|
||
let count = 0; | ||
for await (const doc of cursor) { | ||
expect(doc).to.exist; | ||
count++; | ||
await cursor.close(); | ||
expect(count).to.equal(1); | ||
} | ||
|
||
expect(count).to.equal(1); | ||
} | ||
}); | ||
}); | ||
context('custom promise library', () => { | ||
let client, collection, promiseSpy; | ||
before(async function () { | ||
class CustomPromise extends Promise {} | ||
promiseSpy = Sinon.spy(CustomPromise.prototype, 'then'); | ||
client = this.configuration.newClient({}, { promiseLibrary: CustomPromise }); | ||
|
||
await client.connect(); | ||
const docs = Array.from({ length: 1 }).map((_, index) => ({ foo: index, bar: 1 })); | ||
|
||
collection = client.db(this.configuration.db).collection('async_cursor_tests'); | ||
|
||
await collection.deleteMany({}); | ||
await collection.insertMany(docs); | ||
await client.close(); | ||
}); | ||
|
||
beforeEach(async function () { | ||
client = this.configuration.newClient(); | ||
await client.connect(); | ||
collection = client.db(this.configuration.db).collection('async_cursor_tests'); | ||
}); | ||
|
||
afterEach(() => { | ||
promiseSpy.restore(); | ||
return client.close(); | ||
}); | ||
|
||
it('should properly use custom promise', { | ||
metadata: { requires: { node: '>=10.5.0' } }, | ||
test: async function () { | ||
const cursor = collection.find(); | ||
const countBeforeIteration = promiseSpy.callCount; | ||
for await (const doc of cursor) { | ||
expect(doc).to.exist; | ||
} | ||
expect(countBeforeIteration).to.not.equal(promiseSpy.callCount); | ||
expect(promiseSpy.called).to.equal(true); | ||
} | ||
}); | ||
}); | ||
}); |