From a25b052195ccc260426427667098efd7e1cc0a3b Mon Sep 17 00:00:00 2001 From: Michael Rose Date: Wed, 9 Jun 2021 10:16:17 +0200 Subject: [PATCH] fix(autocomplete): allow missing server_version MONGOSH-818 --- packages/autocomplete/index.spec.ts | 122 ++++++++++++++++------------ packages/autocomplete/index.ts | 3 +- packages/autocomplete/package.json | 1 + 3 files changed, 73 insertions(+), 53 deletions(-) diff --git a/packages/autocomplete/index.spec.ts b/packages/autocomplete/index.spec.ts index 127c954942..af48df22b9 100644 --- a/packages/autocomplete/index.spec.ts +++ b/packages/autocomplete/index.spec.ts @@ -54,6 +54,13 @@ const noParams = { getDatabaseCompletions: () => databases }; +const emptyConnectionInfoParams = { + topology: () => Topologies.Standalone, + connectionInfo: () => ({}), + getCollectionCompletionsForCurrentDb: () => collections, + getDatabaseCompletions: () => databases +}; + describe('completer.completer', () => { beforeEach(() => { collections = []; @@ -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]); + }); }); }); @@ -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', () => { diff --git a/packages/autocomplete/index.ts b/packages/autocomplete/index.ts index 1735dad66e..f908310528 100644 --- a/packages/autocomplete/index.ts +++ b/packages/autocomplete/index.ts @@ -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 || diff --git a/packages/autocomplete/package.json b/packages/autocomplete/package.json index 72378e0d06..05af798cc6 100644 --- a/packages/autocomplete/package.json +++ b/packages/autocomplete/package.json @@ -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}\"",