Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
122 changes: 70 additions & 52 deletions packages/autocomplete/index.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,13 @@ const noParams = {
getDatabaseCompletions: () => databases
};

const emptyConnectionInfoParams = {
topology: () => Topologies.Standalone,
connectionInfo: () => ({}),
getCollectionCompletionsForCurrentDb: () => collections,
getDatabaseCompletions: () => databases
};

describe('completer.completer', () => {
beforeEach(() => {
collections = [];
Expand All @@ -76,60 +83,65 @@ describe('completer.completer', () => {
});
});

context('when no version is passed to completer', () => {
it('matches all db completions', async() => {
const i = 'db.';
const c = await completer(noParams, i);
expect(c.length).to.equal(2);
expect(c[1]).to.equal(i);
expect(c[0]).to.include.members([
'db.getMongo',
'db.getName',
'db.getCollectionNames',
'db.getCollectionInfos',
'db.runCommand',
'db.adminCommand',
'db.aggregate',
'db.getSiblingDB',
'db.getCollection',
'db.dropDatabase',
'db.createUser',
'db.updateUser',
'db.changeUserPassword',
'db.logout',
'db.dropUser',
'db.dropAllUsers',
'db.auth',
'db.grantRolesToUser',
'db.revokeRolesFromUser',
'db.getUser',
'db.getUsers',
'db.createCollection',
'db.createView',
'db.createRole',
'db.updateRole',
'db.dropRole',
'db.dropAllRoles',
'db.grantRolesToRole',
'db.revokeRolesFromRole',
'db.grantPrivilegesToRole',
'db.revokePrivilegesFromRole',
'db.getRole',
'db.getRoles'
]);
});
[
{ params: noParams, label: 'no version' },
{ params: emptyConnectionInfoParams, label: 'empty connection info' }
].forEach(({ params, label }) => {
context(`when ${label} is passed to completer`, () => {
it('matches all db completions', async() => {
const i = 'db.';
const c = await completer(params as any, i);
expect(c.length).to.equal(2);
expect(c[1]).to.equal(i);
expect(c[0]).to.include.members([
'db.getMongo',
'db.getName',
'db.getCollectionNames',
'db.getCollectionInfos',
'db.runCommand',
'db.adminCommand',
'db.aggregate',
'db.getSiblingDB',
'db.getCollection',
'db.dropDatabase',
'db.createUser',
'db.updateUser',
'db.changeUserPassword',
'db.logout',
'db.dropUser',
'db.dropAllUsers',
'db.auth',
'db.grantRolesToUser',
'db.revokeRolesFromUser',
'db.getUser',
'db.getUsers',
'db.createCollection',
'db.createView',
'db.createRole',
'db.updateRole',
'db.dropRole',
'db.dropAllRoles',
'db.grantRolesToRole',
'db.revokeRolesFromRole',
'db.grantPrivilegesToRole',
'db.revokePrivilegesFromRole',
'db.getRole',
'db.getRoles'
]);
});

it('does not have a match', async() => {
const i = 'db.shipwrecks.aggregate([ { $so';
expect(await completer(noParams, i)).to.deep.equal([
['db.shipwrecks.aggregate([ { $sort',
'db.shipwrecks.aggregate([ { $sortByCount'], i]);
});
it('does not have a match', async() => {
const i = 'db.shipwrecks.aggregate([ { $so';
expect(await completer(noParams, i)).to.deep.equal([
['db.shipwrecks.aggregate([ { $sort',
'db.shipwrecks.aggregate([ { $sortByCount'], i]);
});

it('is an exact match to one of shell completions', async() => {
const i = 'db.bios.find({ field: { $exis';
expect(await completer(noParams, i))
.to.deep.equal([['db.bios.find({ field: { $exists'], i]);
it('is an exact match to one of shell completions', async() => {
const i = 'db.bios.find({ field: { $exis';
expect(await completer(noParams, i))
.to.deep.equal([['db.bios.find({ field: { $exists'], i]);
});
});
});

Expand Down Expand Up @@ -310,6 +322,12 @@ describe('completer.completer', () => {
expect(await completer(standalone440, i)).to.deep.equal([
[ 'db.shipwrecks.aggregate([ { $project' ], i]);
});

it('does not fail when the server_version is not specified', async() => {
const i = 'db.shipwrecks.aggregate([ { $proj';
expect(await completer(emptyConnectionInfoParams as any, i)).to.deep.equal([
[ 'db.shipwrecks.aggregate([ { $project' ], i]);
});
});

context('when context is a collection query', () => {
Expand Down
3 changes: 2 additions & 1 deletion packages/autocomplete/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -175,7 +175,8 @@ function isAcceptable(
const connectionInfo = params.connectionInfo();
const isAcceptableVersion =
!entry[versionKey] ||
!connectionInfo ||
// TODO: when https://jira.mongodb.org/browse/WRITING-8170 is done we can rely on server_version being present
!connectionInfo?.server_version ||
semver.gte(connectionInfo.server_version, entry[versionKey] as string);
const isAcceptableEnvironment =
!entry.env ||
Expand Down
1 change: 1 addition & 0 deletions packages/autocomplete/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@
"node": ">=12.4.0"
},
"scripts": {
"pretest": "npm run compile-ts",
"test": "mocha --timeout 15000 --colors -r ts-node/register \"./*.spec.ts\"",
"test-ci": "mocha --timeout 15000 -r ts-node/register \"./*.spec.ts\"",
"lint": "eslint --report-unused-disable-directives \"./*.{js,ts,tsx}\"",
Expand Down