From a71726985581f219b7ed136df96dbb2281e1891e Mon Sep 17 00:00:00 2001 From: Rhys Howell Date: Thu, 3 Sep 2020 12:52:03 +0200 Subject: [PATCH 1/8] Add buttons for links --- package.json | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/package.json b/package.json index 2558c219f..69de45165 100644 --- a/package.json +++ b/package.json @@ -97,6 +97,11 @@ "id": "mongoDBPlaygroundsExplorer", "name": "Playgrounds", "when": "config.mdb.showMongoDBPlaygrounds == true" + }, + { + "id": "helpAndInfo", + "name": "Resources & Information", + "when": "config.mdb.showMongoDBHelpAndInformationPanel == true" } ] }, @@ -108,6 +113,10 @@ { "view": "mongoDBPlaygroundsExplorer", "contents": "No '.mongodb' playground files found in the workspace.\n[Create New Playground](command:mdb.createNewPlaygroundFromPlaygroundExplorer)" + }, + { + "view": "helpAndInfo", + "contents": "[MongoDB Documentation](https://docs.mongodb.com/manual/)\n[Extension Documentation](https://docs.mongodb.com/mongodb-vscode/)\n[Feedback](https://feedback.mongodb.com/forums/929236-mongodb-for-vs-code/)\n[Submit a bug](https://github.com/mongodb-js/vscode/issues)" } ], "languages": [ @@ -702,6 +711,11 @@ "default": true, "description": "Show or hide the MongoDB playgrounds view." }, + "mdb.showMongoDBHelpAndInformationPanel": { + "type": "boolean", + "default": true, + "description": "Show or hide the resources and information view." + }, "mdb.excludeFromPlaygroundsSearch": { "type": "array", "items": { From 9742c3141cedc30a43c037030b84d083fa24338a Mon Sep 17 00:00:00 2001 From: Rhys Howell Date: Thu, 3 Sep 2020 16:22:53 +0200 Subject: [PATCH 2/8] Add help explorer and tree items with first pass links and text --- package.json | 10 +-- src/explorer/helpExplorer.ts | 38 ++++++++++ src/explorer/helpTree.ts | 108 ++++++++++++++++++++++++++++ src/explorer/index.ts | 8 ++- src/explorer/playgroundsExplorer.ts | 2 +- src/explorer/playgroundsTree.ts | 26 +++---- src/mdbExtensionController.ts | 5 ++ 7 files changed, 175 insertions(+), 22 deletions(-) create mode 100644 src/explorer/helpExplorer.ts create mode 100644 src/explorer/helpTree.ts diff --git a/package.json b/package.json index 69de45165..3a4057d22 100644 --- a/package.json +++ b/package.json @@ -99,9 +99,9 @@ "when": "config.mdb.showMongoDBPlaygrounds == true" }, { - "id": "helpAndInfo", - "name": "Resources & Information", - "when": "config.mdb.showMongoDBHelpAndInformationPanel == true" + "id": "mongoDBHelpExplorer", + "name": "Help and Feedback", + "when": "config.mdb.showMongoDBHelpExplorer == true" } ] }, @@ -711,10 +711,10 @@ "default": true, "description": "Show or hide the MongoDB playgrounds view." }, - "mdb.showMongoDBHelpAndInformationPanel": { + "mdb.showMongoDBHelpExplorer": { "type": "boolean", "default": true, - "description": "Show or hide the resources and information view." + "description": "Show or hide the help and feedback view." }, "mdb.excludeFromPlaygroundsSearch": { "type": "array", diff --git a/src/explorer/helpExplorer.ts b/src/explorer/helpExplorer.ts new file mode 100644 index 000000000..bfd5137cd --- /dev/null +++ b/src/explorer/helpExplorer.ts @@ -0,0 +1,38 @@ +import * as vscode from 'vscode'; +import HelpTree from './helpTree'; +import { createLogger } from '../logging'; + +const log = createLogger('help and info explorer controller'); + +export default class HelpExplorer { + private _treeController: HelpTree; + private _treeView?: vscode.TreeView; + + constructor() { + log.info('activate help explorer'); + this._treeController = new HelpTree(); + } + + public activateHelpTreeView(): void { + if (!this._treeView) { + this._treeView = vscode.window.createTreeView( + 'mongoDBHelpExplorer', + { + treeDataProvider: this._treeController + } + ); + this._treeController.activateTreeViewEventHandlers(this._treeView); + } + } + + public deactivate(): void { + if (this._treeView) { + this._treeView.dispose(); + delete this._treeView; + } + } + + public getTreeController(): HelpTree { + return this._treeController; + } +} diff --git a/src/explorer/helpTree.ts b/src/explorer/helpTree.ts new file mode 100644 index 000000000..186f33131 --- /dev/null +++ b/src/explorer/helpTree.ts @@ -0,0 +1,108 @@ +import * as vscode from 'vscode'; +const path = require('path'); + +import { getImagesPath } from '../extensionConstants'; + +const HELP_LINK_CONTEXT_VALUE = 'HELP_LINK'; + +export class HelpLinkTreeItem extends vscode.TreeItem { + iconName?: string; + contextValue = HELP_LINK_CONTEXT_VALUE; + url: string; + + constructor(title: string, url: string, iconName?: string) { + super(title, vscode.TreeItemCollapsibleState.None); + + this.iconName = iconName; + this.url = url; + } + + get iconPath(): + | string + | vscode.Uri + | { light: string | vscode.Uri; dark: string | vscode.Uri } { + if (!this.iconName || this.iconName === '') { + return ''; + } + + const LIGHT = path.join(getImagesPath(), 'light'); + const DARK = path.join(getImagesPath(), 'dark'); + + return { + light: path.join(LIGHT, 'index', `${this.iconName}.svg`), + dark: path.join(DARK, 'index', `${this.iconName}.svg`) + }; + } +} + +export default class HelpTree +implements vscode.TreeDataProvider { + contextValue = 'helpTree'; + + getTreeItem(element: vscode.TreeItem): vscode.TreeItem { + return element; + } + + public activateTreeViewEventHandlers = ( + treeView: vscode.TreeView + ): void => { + treeView.onDidChangeSelection(async (event: any) => { + if (event.selection && event.selection.length === 1) { + const selectedItem = event.selection[0]; + + if (selectedItem.contextValue === HELP_LINK_CONTEXT_VALUE) { + await vscode.commands.executeCommand( + 'vscode.open', + vscode.Uri.parse(selectedItem.url) + ); + } + } + }); + }; + + public async getChildren(element?: any): Promise { + // When no element is present we are at the root. + if (!element) { + const extensionDocs = new HelpLinkTreeItem( + 'Extension Documentation', + 'https://docs.mongodb.com/mongodb-vscode/', + '' + ); + + const feedback = new HelpLinkTreeItem( + 'Feedback', + 'https://feedback.mongodb.com/forums/929236-mongodb-for-vs-code/', + '' + ); + + const submitABug = new HelpLinkTreeItem( + 'Submit a Bug', + 'https://github.com/mongodb-js/vscode/issues', + '' + ); + + // https://www.mongodb.com/cloud/atlas/register?utm_source=vscode&utm_medium=product&utm_campaign=VS%20code%20extension + const atlas = new HelpLinkTreeItem( + 'MongoDB Atlas', + 'https://www.mongodb.com/cloud/atlas', + '' + ); + + const mdbDocs = new HelpLinkTreeItem( + 'MongoDB Documentation', + 'https://docs.mongodb.com/manual/', + '' + ); + + return Promise.resolve([ + extensionDocs, + feedback, + submitABug, + atlas, + mdbDocs + ]); + } + + return element.getChildren(); + } +} diff --git a/src/explorer/index.ts b/src/explorer/index.ts index cb72b20fe..46c0f7877 100644 --- a/src/explorer/index.ts +++ b/src/explorer/index.ts @@ -4,6 +4,7 @@ import ConnectionTreeItem from './connectionTreeItem'; import DatabaseTreeItem from './databaseTreeItem'; import { CollectionTypes } from './documentListTreeItem'; import DocumentTreeItem from './documentTreeItem'; +import HelpExplorer from './helpExplorer'; import SchemaTreeItem from './schemaTreeItem'; import PlaygroundsExplorer from './playgroundsExplorer'; @@ -12,8 +13,9 @@ export { CollectionTypes, ConnectionTreeItem, DatabaseTreeItem, - ExplorerController, DocumentTreeItem, - SchemaTreeItem, - PlaygroundsExplorer + ExplorerController, + HelpExplorer, + PlaygroundsExplorer, + SchemaTreeItem }; diff --git a/src/explorer/playgroundsExplorer.ts b/src/explorer/playgroundsExplorer.ts index 3c19bb49b..c56f51aec 100644 --- a/src/explorer/playgroundsExplorer.ts +++ b/src/explorer/playgroundsExplorer.ts @@ -25,7 +25,7 @@ export default class PlaygroundsExplorer { } }; - public async activatePlaygroundsTreeView(): Promise { + public activatePlaygroundsTreeView(): void { this.createPlaygroundsTreeView(); } diff --git a/src/explorer/playgroundsTree.ts b/src/explorer/playgroundsTree.ts index 7181f443a..f458376a4 100644 --- a/src/explorer/playgroundsTree.ts +++ b/src/explorer/playgroundsTree.ts @@ -7,7 +7,7 @@ import { createLogger } from '../logging'; import PlaygroundsTreeItem from './playgroundsTreeItem'; const micromatch = require('micromatch'); -const log = createLogger('explorer controller'); +const log = createLogger('playgrounds tree controller'); export class FileStat implements vscode.FileStat { constructor(private fsStat: fs.Stats) {} @@ -16,10 +16,10 @@ export class FileStat implements vscode.FileStat { return this.fsStat.isFile() ? vscode.FileType.File : this.fsStat.isDirectory() - ? vscode.FileType.Directory - : this.fsStat.isSymbolicLink() - ? vscode.FileType.SymbolicLink - : vscode.FileType.Unknown; + ? vscode.FileType.Directory + : this.fsStat.isSymbolicLink() + ? vscode.FileType.SymbolicLink + : vscode.FileType.Unknown; } get isFile(): boolean | undefined { @@ -48,7 +48,7 @@ export class FileStat implements vscode.FileStat { } export default class PlaygroundsTree - implements vscode.TreeDataProvider { +implements vscode.TreeDataProvider { public excludeFromPlaygroundsSearch: string[]; private _playgroundsTreeHeaders: PlaygroundsTreeHeader[]; private _onDidChangeTreeData: vscode.EventEmitter; @@ -149,9 +149,9 @@ export default class PlaygroundsTree return element; } - private getFileNames(path: string): Promise { + private getFileNames(filePath: string): Promise { return new Promise((resolve, reject) => { - fs.readdir(path, (error, files) => { + fs.readdir(filePath, (error, files) => { if (error) { reject(error); } else { @@ -161,9 +161,9 @@ export default class PlaygroundsTree }); } - private stat(path: string): Promise { + private stat(filePath: string): Promise { return new Promise((resolve, reject) => { - fs.stat(path, (error, stat) => { + fs.stat(filePath, (error, stat) => { if (error) { reject(error); } else { @@ -173,8 +173,8 @@ export default class PlaygroundsTree }); } - private async getStat(path: string): Promise { - return new FileStat(await this.stat(path)); + private async getStat(filePath: string): Promise { + return new FileStat(await this.stat(filePath)); } public async readDirectory(uri: vscode.Uri): Promise { @@ -203,7 +203,7 @@ export default class PlaygroundsTree ) { await this.readDirectory(fileUri); } - } catch (error) {} + } catch (error) { /* */ } } } diff --git a/src/mdbExtensionController.ts b/src/mdbExtensionController.ts index 304bdd395..66dcef003 100644 --- a/src/mdbExtensionController.ts +++ b/src/mdbExtensionController.ts @@ -11,6 +11,7 @@ import { EditorsController, PlaygroundController } from './editors'; import { ExplorerController, PlaygroundsExplorer, + HelpExplorer, CollectionTreeItem } from './explorer'; import { LanguageServerController } from './language'; @@ -89,8 +90,12 @@ export default class MDBExtensionController implements vscode.Disposable { } activate(): void { + const helpTree = new HelpExplorer(); + + helpTree.activateHelpTreeView(); this._explorerController.activateConnectionsTreeView(); this._playgroundsExplorer.activatePlaygroundsTreeView(); + this._connectionController.loadSavedConnections(); this._telemetryController.activateSegmentAnalytics(); this._languageServerController.startLanguageServer(); From 42500ec7710d510ec09bf2a7f4f272b9237c4687 Mon Sep 17 00:00:00 2001 From: Rhys Howell Date: Thu, 3 Sep 2020 17:30:02 +0200 Subject: [PATCH 3/8] Update ordering and add atlas link --- src/explorer/helpTree.ts | 23 +++++++++++------------ 1 file changed, 11 insertions(+), 12 deletions(-) diff --git a/src/explorer/helpTree.ts b/src/explorer/helpTree.ts index 186f33131..02cdbef33 100644 --- a/src/explorer/helpTree.ts +++ b/src/explorer/helpTree.ts @@ -63,9 +63,9 @@ implements vscode.TreeDataProvider { public async getChildren(element?: any): Promise { // When no element is present we are at the root. if (!element) { - const extensionDocs = new HelpLinkTreeItem( - 'Extension Documentation', - 'https://docs.mongodb.com/mongodb-vscode/', + const atlas = new HelpLinkTreeItem( + 'Create Free Atlas Cluster', + 'https://www.mongodb.com/cloud/atlas/register?utm_source=vscode&utm_medium=product&utm_campaign=VS%20code%20extension', '' ); @@ -75,16 +75,15 @@ implements vscode.TreeDataProvider { '' ); - const submitABug = new HelpLinkTreeItem( - 'Submit a Bug', + const reportBug = new HelpLinkTreeItem( + 'Report a Bug', 'https://github.com/mongodb-js/vscode/issues', '' ); - // https://www.mongodb.com/cloud/atlas/register?utm_source=vscode&utm_medium=product&utm_campaign=VS%20code%20extension - const atlas = new HelpLinkTreeItem( - 'MongoDB Atlas', - 'https://www.mongodb.com/cloud/atlas', + const extensionDocs = new HelpLinkTreeItem( + 'Extension Documentation', + 'https://docs.mongodb.com/mongodb-vscode/', '' ); @@ -95,10 +94,10 @@ implements vscode.TreeDataProvider { ); return Promise.resolve([ - extensionDocs, - feedback, - submitABug, atlas, + feedback, + reportBug, + extensionDocs, mdbDocs ]); } From 076aa65c0daddaeaf8c7f705a18d65d0cdba0c06 Mon Sep 17 00:00:00 2001 From: Rhys Howell Date: Thu, 3 Sep 2020 18:37:52 +0200 Subject: [PATCH 4/8] Add telemetry events to help panel clicks --- src/explorer/helpExplorer.ts | 15 ++++++++------- src/explorer/helpTree.ts | 23 ++++++++++++++++------- 2 files changed, 24 insertions(+), 14 deletions(-) diff --git a/src/explorer/helpExplorer.ts b/src/explorer/helpExplorer.ts index bfd5137cd..cd8991c32 100644 --- a/src/explorer/helpExplorer.ts +++ b/src/explorer/helpExplorer.ts @@ -1,6 +1,7 @@ import * as vscode from 'vscode'; import HelpTree from './helpTree'; import { createLogger } from '../logging'; +import { TelemetryController } from '../telemetry'; const log = createLogger('help and info explorer controller'); @@ -13,15 +14,15 @@ export default class HelpExplorer { this._treeController = new HelpTree(); } - public activateHelpTreeView(): void { + public activateHelpTreeView(telemetryController: TelemetryController): void { if (!this._treeView) { - this._treeView = vscode.window.createTreeView( - 'mongoDBHelpExplorer', - { - treeDataProvider: this._treeController - } + this._treeView = vscode.window.createTreeView('mongoDBHelpExplorer', { + treeDataProvider: this._treeController, + }); + this._treeController.activateTreeViewEventHandlers( + this._treeView, + telemetryController ); - this._treeController.activateTreeViewEventHandlers(this._treeView); } } diff --git a/src/explorer/helpTree.ts b/src/explorer/helpTree.ts index 02cdbef33..cdf0ae73c 100644 --- a/src/explorer/helpTree.ts +++ b/src/explorer/helpTree.ts @@ -2,17 +2,20 @@ import * as vscode from 'vscode'; const path = require('path'); import { getImagesPath } from '../extensionConstants'; +import { TelemetryController } from '../telemetry'; const HELP_LINK_CONTEXT_VALUE = 'HELP_LINK'; export class HelpLinkTreeItem extends vscode.TreeItem { iconName?: string; contextValue = HELP_LINK_CONTEXT_VALUE; + linkId: string; url: string; - constructor(title: string, url: string, iconName?: string) { + constructor(title: string, url: string, linkId: string, iconName?: string) { super(title, vscode.TreeItemCollapsibleState.None); + this.linkId = linkId; this.iconName = iconName; this.url = url; } @@ -44,13 +47,19 @@ implements vscode.TreeDataProvider { } public activateTreeViewEventHandlers = ( - treeView: vscode.TreeView + treeView: vscode.TreeView, + telemetryController: TelemetryController ): void => { treeView.onDidChangeSelection(async (event: any) => { if (event.selection && event.selection.length === 1) { const selectedItem = event.selection[0]; if (selectedItem.contextValue === HELP_LINK_CONTEXT_VALUE) { + telemetryController.trackLinkClicked( + 'helpPanel', + selectedItem.linkId + ); + await vscode.commands.executeCommand( 'vscode.open', vscode.Uri.parse(selectedItem.url) @@ -66,31 +75,31 @@ implements vscode.TreeDataProvider { const atlas = new HelpLinkTreeItem( 'Create Free Atlas Cluster', 'https://www.mongodb.com/cloud/atlas/register?utm_source=vscode&utm_medium=product&utm_campaign=VS%20code%20extension', - '' + 'freeClusterCTA' ); const feedback = new HelpLinkTreeItem( 'Feedback', 'https://feedback.mongodb.com/forums/929236-mongodb-for-vs-code/', - '' + 'feedback' ); const reportBug = new HelpLinkTreeItem( 'Report a Bug', 'https://github.com/mongodb-js/vscode/issues', - '' + 'reportABug' ); const extensionDocs = new HelpLinkTreeItem( 'Extension Documentation', 'https://docs.mongodb.com/mongodb-vscode/', - '' + 'extensionDocumentation' ); const mdbDocs = new HelpLinkTreeItem( 'MongoDB Documentation', 'https://docs.mongodb.com/manual/', - '' + 'mongoDBDocumentation' ); return Promise.resolve([ From d2d15ccfbdb8f1ec181a140fb13566ded57f56c6 Mon Sep 17 00:00:00 2001 From: Rhys Howell Date: Tue, 8 Sep 2020 15:25:50 +0200 Subject: [PATCH 5/8] Add icons for help items and tests for telemetry clicks --- images/dark/help/book.svg | 3 + images/dark/help/leaf.svg | 12 ++ images/dark/help/lightbulb.svg | 3 + images/dark/help/megaphone.svg | 3 + images/dark/help/report.svg | 3 + images/light/help/book.svg | 3 + images/light/help/leaf.svg | 12 ++ images/light/help/lightbulb.svg | 3 + images/light/help/megaphone.svg | 3 + images/light/help/report.svg | 3 + src/explorer/helpExplorer.ts | 14 +- src/explorer/helpTree.ts | 86 ++++++----- src/mdbExtensionController.ts | 6 +- .../suite/explorer/explorerController.test.ts | 57 +++----- src/test/suite/explorer/helpExplorer.test.ts | 133 ++++++++++++++++++ src/test/suite/extension.test.ts | 10 ++ 16 files changed, 272 insertions(+), 82 deletions(-) create mode 100644 images/dark/help/book.svg create mode 100644 images/dark/help/leaf.svg create mode 100644 images/dark/help/lightbulb.svg create mode 100644 images/dark/help/megaphone.svg create mode 100644 images/dark/help/report.svg create mode 100644 images/light/help/book.svg create mode 100644 images/light/help/leaf.svg create mode 100644 images/light/help/lightbulb.svg create mode 100644 images/light/help/megaphone.svg create mode 100644 images/light/help/report.svg create mode 100644 src/test/suite/explorer/helpExplorer.test.ts diff --git a/images/dark/help/book.svg b/images/dark/help/book.svg new file mode 100644 index 000000000..fc2ab9a2c --- /dev/null +++ b/images/dark/help/book.svg @@ -0,0 +1,3 @@ + + + diff --git a/images/dark/help/leaf.svg b/images/dark/help/leaf.svg new file mode 100644 index 000000000..9ccffb045 --- /dev/null +++ b/images/dark/help/leaf.svg @@ -0,0 +1,12 @@ + + + + + + + diff --git a/images/dark/help/lightbulb.svg b/images/dark/help/lightbulb.svg new file mode 100644 index 000000000..48f43a504 --- /dev/null +++ b/images/dark/help/lightbulb.svg @@ -0,0 +1,3 @@ + + + diff --git a/images/dark/help/megaphone.svg b/images/dark/help/megaphone.svg new file mode 100644 index 000000000..36e579b78 --- /dev/null +++ b/images/dark/help/megaphone.svg @@ -0,0 +1,3 @@ + + + diff --git a/images/dark/help/report.svg b/images/dark/help/report.svg new file mode 100644 index 000000000..4aeeb4e09 --- /dev/null +++ b/images/dark/help/report.svg @@ -0,0 +1,3 @@ + + + diff --git a/images/light/help/book.svg b/images/light/help/book.svg new file mode 100644 index 000000000..daa624811 --- /dev/null +++ b/images/light/help/book.svg @@ -0,0 +1,3 @@ + + + diff --git a/images/light/help/leaf.svg b/images/light/help/leaf.svg new file mode 100644 index 000000000..4101ea118 --- /dev/null +++ b/images/light/help/leaf.svg @@ -0,0 +1,12 @@ + + + + + + + diff --git a/images/light/help/lightbulb.svg b/images/light/help/lightbulb.svg new file mode 100644 index 000000000..2d342a9f7 --- /dev/null +++ b/images/light/help/lightbulb.svg @@ -0,0 +1,3 @@ + + + diff --git a/images/light/help/megaphone.svg b/images/light/help/megaphone.svg new file mode 100644 index 000000000..da23e9454 --- /dev/null +++ b/images/light/help/megaphone.svg @@ -0,0 +1,3 @@ + + + diff --git a/images/light/help/report.svg b/images/light/help/report.svg new file mode 100644 index 000000000..8b25f267c --- /dev/null +++ b/images/light/help/report.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/explorer/helpExplorer.ts b/src/explorer/helpExplorer.ts index cd8991c32..6e25d6a22 100644 --- a/src/explorer/helpExplorer.ts +++ b/src/explorer/helpExplorer.ts @@ -6,18 +6,18 @@ import { TelemetryController } from '../telemetry'; const log = createLogger('help and info explorer controller'); export default class HelpExplorer { - private _treeController: HelpTree; - private _treeView?: vscode.TreeView; + _treeController: HelpTree; + _treeView?: vscode.TreeView; constructor() { log.info('activate help explorer'); this._treeController = new HelpTree(); } - public activateHelpTreeView(telemetryController: TelemetryController): void { + activateHelpTreeView(telemetryController: TelemetryController): void { if (!this._treeView) { this._treeView = vscode.window.createTreeView('mongoDBHelpExplorer', { - treeDataProvider: this._treeController, + treeDataProvider: this._treeController }); this._treeController.activateTreeViewEventHandlers( this._treeView, @@ -26,14 +26,10 @@ export default class HelpExplorer { } } - public deactivate(): void { + deactivate(): void { if (this._treeView) { this._treeView.dispose(); delete this._treeView; } } - - public getTreeController(): HelpTree { - return this._treeController; - } } diff --git a/src/explorer/helpTree.ts b/src/explorer/helpTree.ts index cdf0ae73c..a787e9ae0 100644 --- a/src/explorer/helpTree.ts +++ b/src/explorer/helpTree.ts @@ -32,8 +32,8 @@ export class HelpLinkTreeItem extends vscode.TreeItem { const DARK = path.join(getImagesPath(), 'dark'); return { - light: path.join(LIGHT, 'index', `${this.iconName}.svg`), - dark: path.join(DARK, 'index', `${this.iconName}.svg`) + light: path.join(LIGHT, 'help', `${this.iconName}.svg`), + dark: path.join(DARK, 'help', `${this.iconName}.svg`) }; } } @@ -46,7 +46,7 @@ implements vscode.TreeDataProvider { return element; } - public activateTreeViewEventHandlers = ( + activateTreeViewEventHandlers = ( treeView: vscode.TreeView, telemetryController: TelemetryController ): void => { @@ -54,63 +54,79 @@ implements vscode.TreeDataProvider { if (event.selection && event.selection.length === 1) { const selectedItem = event.selection[0]; - if (selectedItem.contextValue === HELP_LINK_CONTEXT_VALUE) { - telemetryController.trackLinkClicked( - 'helpPanel', - selectedItem.linkId - ); - - await vscode.commands.executeCommand( - 'vscode.open', - vscode.Uri.parse(selectedItem.url) - ); - } + await this.onClickHelpItem(selectedItem, telemetryController); } }); }; - public async getChildren(element?: any): Promise { + async getChildren(element?: any): Promise { // When no element is present we are at the root. if (!element) { - const atlas = new HelpLinkTreeItem( - 'Create Free Atlas Cluster', - 'https://www.mongodb.com/cloud/atlas/register?utm_source=vscode&utm_medium=product&utm_campaign=VS%20code%20extension', - 'freeClusterCTA' + const whatsNew = new HelpLinkTreeItem( + 'What\'s New', + 'https://github.com/mongodb-js/vscode/blob/master/CHANGELOG.md', + 'whatsNew', + 'megaphone' + ); + + const extensionDocs = new HelpLinkTreeItem( + 'Extension Documentation', + 'https://docs.mongodb.com/mongodb-vscode/', + 'extensionDocumentation', + 'book' + ); + + const mdbDocs = new HelpLinkTreeItem( + 'MongoDB Documentation', + 'https://docs.mongodb.com/manual/', + 'mongoDBDocumentation', + 'leaf' ); const feedback = new HelpLinkTreeItem( - 'Feedback', + 'Suggest a Feature', 'https://feedback.mongodb.com/forums/929236-mongodb-for-vs-code/', - 'feedback' + 'feedback', + 'lightbulb' ); const reportBug = new HelpLinkTreeItem( 'Report a Bug', 'https://github.com/mongodb-js/vscode/issues', - 'reportABug' - ); - - const extensionDocs = new HelpLinkTreeItem( - 'Extension Documentation', - 'https://docs.mongodb.com/mongodb-vscode/', - 'extensionDocumentation' + 'reportABug', + 'report' ); - const mdbDocs = new HelpLinkTreeItem( - 'MongoDB Documentation', - 'https://docs.mongodb.com/manual/', - 'mongoDBDocumentation' + const atlas = new HelpLinkTreeItem( + 'Create Free Atlas Cluster', + 'https://www.mongodb.com/cloud/atlas/register?utm_source=vscode&utm_medium=product&utm_campaign=VS%20code%20extension', + 'freeClusterCTA' ); return Promise.resolve([ - atlas, + whatsNew, + extensionDocs, + mdbDocs, feedback, reportBug, - extensionDocs, - mdbDocs + atlas ]); } return element.getChildren(); } + + async onClickHelpItem(helpItem: HelpLinkTreeItem, telemetryController: TelemetryController): Promise { + if (helpItem.contextValue === HELP_LINK_CONTEXT_VALUE) { + telemetryController.trackLinkClicked( + 'helpPanel', + helpItem.linkId + ); + + await vscode.commands.executeCommand( + 'vscode.open', + vscode.Uri.parse(helpItem.url) + ); + } + } } diff --git a/src/mdbExtensionController.ts b/src/mdbExtensionController.ts index 66dcef003..ad7b37308 100644 --- a/src/mdbExtensionController.ts +++ b/src/mdbExtensionController.ts @@ -39,6 +39,7 @@ export default class MDBExtensionController implements vscode.Disposable { _editorsController: EditorsController; _playgroundController: PlaygroundController; _explorerController: ExplorerController; + _helpExplorer: HelpExplorer; _playgroundsExplorer: PlaygroundsExplorer; _statusView: StatusView; _storageController: StorageController; @@ -76,6 +77,7 @@ export default class MDBExtensionController implements vscode.Disposable { this._explorerController = new ExplorerController( this._connectionController ); + this._helpExplorer = new HelpExplorer(); this._playgroundsExplorer = new PlaygroundsExplorer(); this._playgroundController = new PlaygroundController( context, @@ -90,10 +92,8 @@ export default class MDBExtensionController implements vscode.Disposable { } activate(): void { - const helpTree = new HelpExplorer(); - - helpTree.activateHelpTreeView(); this._explorerController.activateConnectionsTreeView(); + this._helpExplorer.activateHelpTreeView(this._telemetryController); this._playgroundsExplorer.activatePlaygroundsTreeView(); this._connectionController.loadSavedConnections(); diff --git a/src/test/suite/explorer/explorerController.test.ts b/src/test/suite/explorer/explorerController.test.ts index 5bf8f4bd0..693fae250 100644 --- a/src/test/suite/explorer/explorerController.test.ts +++ b/src/test/suite/explorer/explorerController.test.ts @@ -44,6 +44,7 @@ suite('Explorer Controller Test Suite', function () { await mdbTestExtension.testExtensionController._connectionController.disconnect(); mdbTestExtension.testExtensionController._connectionController.clearAllConnections(); sinon.restore(); + mdbTestExtension.testExtensionController._explorerController.deactivate(); }); test('it updates the connections to account for a change in the connection controller', async () => { @@ -54,34 +55,28 @@ suite('Explorer Controller Test Suite', function () { const treeController = testExplorerController.getTreeController(); const mockConnectionId = 'testConnectionId'; - try { - testConnectionController._connections = { - testConnectionId: { - id: 'testConnectionId', - connectionModel: new Connection(), - name: 'testConnectionName', - driverUrl: 'url', - storageLocation: StorageScope.NONE - } - }; - testConnectionController.setConnnectingConnectionId(mockConnectionId); - testConnectionController.setConnnecting(true); - - const connectionsItems = await treeController.getChildren(); - - assert( - connectionsItems.length === 1, - `Expected there to be 1 connection tree item, found ${connectionsItems.length}` - ); - assert( - connectionsItems[0].label === 'testConnectionName', - 'There should be a connection tree item with the label "testConnectionName"' - ); + testConnectionController._connections = { + testConnectionId: { + id: 'testConnectionId', + connectionModel: new Connection(), + name: 'testConnectionName', + driverUrl: 'url', + storageLocation: StorageScope.NONE + } + }; + testConnectionController.setConnnectingConnectionId(mockConnectionId); + testConnectionController.setConnnecting(true); - testExplorerController.deactivate(); - } catch (error) { - assert(false, error); - } + const connectionsItems = await treeController.getChildren(); + + assert( + connectionsItems.length === 1, + `Expected there to be 1 connection tree item, found ${connectionsItems.length}` + ); + assert( + connectionsItems[0].label === 'testConnectionName', + 'There should be a connection tree item with the label "testConnectionName"' + ); }); test('when a connection is added and connected it is added to the tree', async () => { @@ -184,8 +179,6 @@ suite('Explorer Controller Test Suite', function () { connectionsItems[1].label === 'shouldfail:27017', 'Second connection tree item should have label "shouldfail:27017"' ); - - testExplorerController.deactivate(); }); test('shows connection names sorted alphabetically in the tree', async () => { @@ -242,8 +235,6 @@ suite('Explorer Controller Test Suite', function () { afterAdditionConnectionsItems[0].label === '111', `First connection tree item should have label "111" found ${afterAdditionConnectionsItems[0].label}` ); - - testExplorerController.deactivate(); }); test('shows the databases of connected connection in tree', async () => { @@ -268,8 +259,6 @@ suite('Explorer Controller Test Suite', function () { databaseItems[0].label === 'admin', `First database tree item should have label "admin" found ${connectionsItems[0].label}.` ); - - testExplorerController.deactivate(); }); test('caches the expanded state of databases in the tree when a connection is expanded or collapsed', async () => { @@ -323,8 +312,6 @@ suite('Explorer Controller Test Suite', function () { newDatabaseItems[1].isExpanded === true, 'Expected database tree to be expanded from cache.' ); - - testExplorerController.deactivate(); }); test('tree view should be not created by default (shows welcome view)', () => { diff --git a/src/test/suite/explorer/helpExplorer.test.ts b/src/test/suite/explorer/helpExplorer.test.ts new file mode 100644 index 000000000..962f241b5 --- /dev/null +++ b/src/test/suite/explorer/helpExplorer.test.ts @@ -0,0 +1,133 @@ +import * as assert from 'assert'; +import * as vscode from 'vscode'; +import { afterEach } from 'mocha'; +const sinon = require('sinon'); + +import { mdbTestExtension } from '../stubbableMdbExtension'; +import HelpTree from '../../../explorer/helpTree'; + +suite('Help Explorer Test Suite', function () { + afterEach(() => { + sinon.restore(); + mdbTestExtension.testExtensionController._helpExplorer.deactivate(); + }); + + test('tree view should be not created until it is activated', () => { + const testHelpExplorer = + mdbTestExtension.testExtensionController._helpExplorer; + + assert(testHelpExplorer._treeView === undefined); + + testHelpExplorer.activateHelpTreeView( + mdbTestExtension.testExtensionController._telemetryController + ); + + assert(testHelpExplorer._treeView !== undefined); + }); + + test('the tree should have 5 help tree items', async () => { + const testHelpExplorer = + mdbTestExtension.testExtensionController._helpExplorer; + + testHelpExplorer.activateHelpTreeView( + mdbTestExtension.testExtensionController._telemetryController + ); + + const helpTreeItems = await testHelpExplorer._treeController.getChildren(); + assert(helpTreeItems.length === 6); + }); + + test('the tree should have an atlas item with a url and atlas icon', async () => { + const testHelpExplorer = + mdbTestExtension.testExtensionController._helpExplorer; + + testHelpExplorer.activateHelpTreeView( + mdbTestExtension.testExtensionController._telemetryController + ); + + const helpTreeItems = await testHelpExplorer._treeController.getChildren(); + const atlasHelpItem = helpTreeItems[5]; + assert(atlasHelpItem.title === 'Create Free Atlas Cluster'); + assert(atlasHelpItem.url === 'https://www.mongodb.com/cloud/atlas/register?utm_source=vscode&utm_medium=product&utm_campaign=VS%20code%20extension'); + // assert(atlasHelpItem.iconName === 'atlas'); + assert(atlasHelpItem.linkId === 'freeClusterCTA'); + }); + + test('when a help item is clicked on it should open the url with vscode', async () => { + const testHelpExplorer = + mdbTestExtension.testExtensionController._helpExplorer; + + testHelpExplorer.activateHelpTreeView( + mdbTestExtension.testExtensionController._telemetryController + ); + + sinon.replace( + mdbTestExtension.testExtensionController._telemetryController, + 'trackLinkClicked', + sinon.stub() + ); + + const stubExecuteCommand = sinon.stub(); + + sinon.replace( + mdbTestExtension.testExtensionController._telemetryController, + 'executeCommand', + stubExecuteCommand + ); + + const helpTreeItems = await testHelpExplorer._treeController.getChildren(); + const atlasHelpItem = helpTreeItems[5]; + + testHelpExplorer._treeController.onClickHelpItem( + atlasHelpItem, + mdbTestExtension.testExtensionController._telemetryController + ); + + assert(stubExecuteCommand.called); + assert( + stubExecuteCommand.firstArg === 'vscode.open' + ); + assert( + stubExecuteCommand.secondArg === vscode.Uri.parse(atlasHelpItem.url) + ); + }); + + test('when a help item is clicked on it should have a telemetry trackLinkClicked event', async () => { + const testHelpExplorer = + mdbTestExtension.testExtensionController._helpExplorer; + + testHelpExplorer.activateHelpTreeView( + mdbTestExtension.testExtensionController._telemetryController + ); + + const stubLinkClickedTelemetry = sinon.stub(); + + sinon.replace( + mdbTestExtension.testExtensionController._telemetryController, + 'trackLinkClicked', + stubLinkClickedTelemetry + ); + + sinon.replace( + mdbTestExtension.testExtensionController._telemetryController, + 'executeCommand', + sinon.stub() + ); + + const helpTreeItems = await testHelpExplorer._treeController.getChildren(); + const atlasHelpItem = helpTreeItems[5]; + + testHelpExplorer._treeController.onClickHelpItem( + atlasHelpItem, + mdbTestExtension.testExtensionController._telemetryController + ); + + assert(stubLinkClickedTelemetry.called); + assert( + stubLinkClickedTelemetry.firstArg === 'helpPanel' + ); + assert( + stubLinkClickedTelemetry.secondArg === 'freeClusterCTA' + ); + }); +}); diff --git a/src/test/suite/extension.test.ts b/src/test/suite/extension.test.ts index f5f013e78..7ef0f75f8 100644 --- a/src/test/suite/extension.test.ts +++ b/src/test/suite/extension.test.ts @@ -2,6 +2,9 @@ import * as assert from 'assert'; import * as vscode from 'vscode'; import { beforeEach, afterEach } from 'mocha'; import * as sinon from 'sinon'; + +const { contributes } = require('../../../../package.json'); + suite('Extension Test Suite', () => { vscode.window.showInformationMessage('Starting tests...'); @@ -28,6 +31,13 @@ suite('Extension Test Suite', () => { sinon.restore(); }); + test('there should be 3 views registered in the package.json', () => { + assert(contributes.views.mongodb.length === 3); + assert(contributes.views.mongodb.id === 'mongoDBConnectionExplorer'); + assert(contributes.views.mongodb.id === 'mongoDBPlaygroundsExplorer'); + assert(contributes.views.mongodb.id === 'mongoDBHelpExplorer'); + }); + test('commands are registered in vscode', async () => { const registeredCommands = await vscode.commands.getCommands(); From a13bf059d0d4a6c11373b790b040cacb942f67ba Mon Sep 17 00:00:00 2001 From: Rhys Howell Date: Tue, 8 Sep 2020 18:33:20 +0200 Subject: [PATCH 6/8] Add atlas icon --- images/dark/help/atlas.svg | 11 +++++ images/light/help/atlas.svg | 11 +++++ package.json | 6 +-- src/explorer/helpTree.ts | 3 +- src/test/suite/explorer/helpExplorer.test.ts | 42 ++++---------------- 5 files changed, 33 insertions(+), 40 deletions(-) create mode 100644 images/dark/help/atlas.svg create mode 100644 images/light/help/atlas.svg diff --git a/images/dark/help/atlas.svg b/images/dark/help/atlas.svg new file mode 100644 index 000000000..f2af325d0 --- /dev/null +++ b/images/dark/help/atlas.svg @@ -0,0 +1,11 @@ + + + + Icons 16 / VS Code /AtlasDark + Created with Sketch. + + + + + + diff --git a/images/light/help/atlas.svg b/images/light/help/atlas.svg new file mode 100644 index 000000000..35b3f98eb --- /dev/null +++ b/images/light/help/atlas.svg @@ -0,0 +1,11 @@ + + + + Icons 16 / VS Code /AtlasLight + Created with Sketch. + + + + + + diff --git a/package.json b/package.json index 3a4057d22..53aba8141 100644 --- a/package.json +++ b/package.json @@ -49,7 +49,7 @@ "watch:extension": "npm run compile:extension -- -watch", "watch:extension-bundles": "webpack --mode development --info-verbosity verbose --watch", "pretest": "npm run clean && npm run compile && npm run webpack-dev && cross-env MONGODB_VERSION=4.2.3 mongodb-runner start --port=27018", - "test": "cross-env NODE_OPTIONS=--no-force-async-hooks-checks xvfb-maybe node ./out/test/runTest.js", + "test": "cross-env node ./out/test/runTest.js", "posttest": "mongodb-runner stop --port=27018", "vscode:prepublish": "npm run clean && npm run compile && webpack --mode production", "check": "mongodb-js-precommit './src/**/*{.ts}'", @@ -113,10 +113,6 @@ { "view": "mongoDBPlaygroundsExplorer", "contents": "No '.mongodb' playground files found in the workspace.\n[Create New Playground](command:mdb.createNewPlaygroundFromPlaygroundExplorer)" - }, - { - "view": "helpAndInfo", - "contents": "[MongoDB Documentation](https://docs.mongodb.com/manual/)\n[Extension Documentation](https://docs.mongodb.com/mongodb-vscode/)\n[Feedback](https://feedback.mongodb.com/forums/929236-mongodb-for-vs-code/)\n[Submit a bug](https://github.com/mongodb-js/vscode/issues)" } ], "languages": [ diff --git a/src/explorer/helpTree.ts b/src/explorer/helpTree.ts index a787e9ae0..ef41b2e13 100644 --- a/src/explorer/helpTree.ts +++ b/src/explorer/helpTree.ts @@ -100,7 +100,8 @@ implements vscode.TreeDataProvider { const atlas = new HelpLinkTreeItem( 'Create Free Atlas Cluster', 'https://www.mongodb.com/cloud/atlas/register?utm_source=vscode&utm_medium=product&utm_campaign=VS%20code%20extension', - 'freeClusterCTA' + 'freeClusterCTA', + 'atlas' ); return Promise.resolve([ diff --git a/src/test/suite/explorer/helpExplorer.test.ts b/src/test/suite/explorer/helpExplorer.test.ts index 962f241b5..a12d3b12b 100644 --- a/src/test/suite/explorer/helpExplorer.test.ts +++ b/src/test/suite/explorer/helpExplorer.test.ts @@ -4,7 +4,6 @@ import { afterEach } from 'mocha'; const sinon = require('sinon'); import { mdbTestExtension } from '../stubbableMdbExtension'; -import HelpTree from '../../../explorer/helpTree'; suite('Help Explorer Test Suite', function () { afterEach(() => { @@ -15,24 +14,19 @@ suite('Help Explorer Test Suite', function () { test('tree view should be not created until it is activated', () => { const testHelpExplorer = mdbTestExtension.testExtensionController._helpExplorer; - assert(testHelpExplorer._treeView === undefined); - testHelpExplorer.activateHelpTreeView( mdbTestExtension.testExtensionController._telemetryController ); - assert(testHelpExplorer._treeView !== undefined); }); test('the tree should have 5 help tree items', async () => { const testHelpExplorer = mdbTestExtension.testExtensionController._helpExplorer; - testHelpExplorer.activateHelpTreeView( mdbTestExtension.testExtensionController._telemetryController ); - const helpTreeItems = await testHelpExplorer._treeController.getChildren(); assert(helpTreeItems.length === 6); }); @@ -40,94 +34,74 @@ suite('Help Explorer Test Suite', function () { test('the tree should have an atlas item with a url and atlas icon', async () => { const testHelpExplorer = mdbTestExtension.testExtensionController._helpExplorer; - testHelpExplorer.activateHelpTreeView( mdbTestExtension.testExtensionController._telemetryController ); - const helpTreeItems = await testHelpExplorer._treeController.getChildren(); const atlasHelpItem = helpTreeItems[5]; assert(atlasHelpItem.title === 'Create Free Atlas Cluster'); - assert(atlasHelpItem.url === 'https://www.mongodb.com/cloud/atlas/register?utm_source=vscode&utm_medium=product&utm_campaign=VS%20code%20extension'); - // assert(atlasHelpItem.iconName === 'atlas'); + assert( + atlasHelpItem.url === + 'https://www.mongodb.com/cloud/atlas/register?utm_source=vscode&utm_medium=product&utm_campaign=VS%20code%20extension' + ); + assert(atlasHelpItem.iconName === 'atlas'); assert(atlasHelpItem.linkId === 'freeClusterCTA'); }); test('when a help item is clicked on it should open the url with vscode', async () => { const testHelpExplorer = mdbTestExtension.testExtensionController._helpExplorer; - testHelpExplorer.activateHelpTreeView( mdbTestExtension.testExtensionController._telemetryController ); - sinon.replace( mdbTestExtension.testExtensionController._telemetryController, 'trackLinkClicked', sinon.stub() ); - const stubExecuteCommand = sinon.stub(); - sinon.replace( mdbTestExtension.testExtensionController._telemetryController, 'executeCommand', stubExecuteCommand ); - const helpTreeItems = await testHelpExplorer._treeController.getChildren(); const atlasHelpItem = helpTreeItems[5]; - testHelpExplorer._treeController.onClickHelpItem( atlasHelpItem, mdbTestExtension.testExtensionController._telemetryController ); - assert(stubExecuteCommand.called); - assert( - stubExecuteCommand.firstArg === 'vscode.open' - ); + assert(stubExecuteCommand.firstArg === 'vscode.open'); assert( stubExecuteCommand.secondArg === vscode.Uri.parse(atlasHelpItem.url) ); }); - test('when a help item is clicked on it should have a telemetry trackLinkClicked event', async () => { const testHelpExplorer = mdbTestExtension.testExtensionController._helpExplorer; - testHelpExplorer.activateHelpTreeView( mdbTestExtension.testExtensionController._telemetryController ); - const stubLinkClickedTelemetry = sinon.stub(); - sinon.replace( mdbTestExtension.testExtensionController._telemetryController, 'trackLinkClicked', stubLinkClickedTelemetry ); - sinon.replace( mdbTestExtension.testExtensionController._telemetryController, 'executeCommand', sinon.stub() ); - const helpTreeItems = await testHelpExplorer._treeController.getChildren(); const atlasHelpItem = helpTreeItems[5]; - testHelpExplorer._treeController.onClickHelpItem( atlasHelpItem, mdbTestExtension.testExtensionController._telemetryController ); - assert(stubLinkClickedTelemetry.called); - assert( - stubLinkClickedTelemetry.firstArg === 'helpPanel' - ); - assert( - stubLinkClickedTelemetry.secondArg === 'freeClusterCTA' - ); + assert(stubLinkClickedTelemetry.firstArg === 'helpPanel'); + assert(stubLinkClickedTelemetry.secondArg === 'freeClusterCTA'); }); }); From d29e872807480126cb3d03397cbeec726968d530 Mon Sep 17 00:00:00 2001 From: Rhys Howell Date: Tue, 8 Sep 2020 18:44:11 +0200 Subject: [PATCH 7/8] Re-add removed test config params --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 53aba8141..1e3d0adf6 100644 --- a/package.json +++ b/package.json @@ -49,7 +49,7 @@ "watch:extension": "npm run compile:extension -- -watch", "watch:extension-bundles": "webpack --mode development --info-verbosity verbose --watch", "pretest": "npm run clean && npm run compile && npm run webpack-dev && cross-env MONGODB_VERSION=4.2.3 mongodb-runner start --port=27018", - "test": "cross-env node ./out/test/runTest.js", + "test": "cross-env NODE_OPTIONS=--no-force-async-hooks-checks xvfb-maybe node ./out/test/runTest.js", "posttest": "mongodb-runner stop --port=27018", "vscode:prepublish": "npm run clean && npm run compile && webpack --mode production", "check": "mongodb-js-precommit './src/**/*{.ts}'", From 99f7fc59ff0db3e65a2f67c81faa8e10c2dd3aee Mon Sep 17 00:00:00 2001 From: Rhys Howell Date: Wed, 9 Sep 2020 16:56:33 +0200 Subject: [PATCH 8/8] Update tests and tweak atlas icon --- images/dark/help/atlas.svg | 4 +- images/light/help/atlas.svg | 4 +- src/mdbExtensionController.ts | 1 + src/test/suite/explorer/helpExplorer.test.ts | 49 ++++++++++---------- src/test/suite/extension.test.ts | 35 ++------------ 5 files changed, 35 insertions(+), 58 deletions(-) diff --git a/images/dark/help/atlas.svg b/images/dark/help/atlas.svg index f2af325d0..563a3d90e 100644 --- a/images/dark/help/atlas.svg +++ b/images/dark/help/atlas.svg @@ -4,8 +4,8 @@ Icons 16 / VS Code /AtlasDark Created with Sketch. - - + + diff --git a/images/light/help/atlas.svg b/images/light/help/atlas.svg index 35b3f98eb..9f8b165cf 100644 --- a/images/light/help/atlas.svg +++ b/images/light/help/atlas.svg @@ -4,8 +4,8 @@ Icons 16 / VS Code /AtlasLight Created with Sketch. - - + + diff --git a/src/mdbExtensionController.ts b/src/mdbExtensionController.ts index ad7b37308..cc47a6d4f 100644 --- a/src/mdbExtensionController.ts +++ b/src/mdbExtensionController.ts @@ -466,6 +466,7 @@ export default class MDBExtensionController implements vscode.Disposable { // TODO: Cancel active queries/playgrounds. this._connectionController.disconnect(); this._explorerController.deactivate(); + this._helpExplorer.deactivate(); this._playgroundsExplorer.deactivate(); this._playgroundController.deactivate(); this._telemetryController.deactivate(); diff --git a/src/test/suite/explorer/helpExplorer.test.ts b/src/test/suite/explorer/helpExplorer.test.ts index a12d3b12b..30760586e 100644 --- a/src/test/suite/explorer/helpExplorer.test.ts +++ b/src/test/suite/explorer/helpExplorer.test.ts @@ -4,6 +4,7 @@ import { afterEach } from 'mocha'; const sinon = require('sinon'); import { mdbTestExtension } from '../stubbableMdbExtension'; +import { HelpExplorer } from '../../../explorer'; suite('Help Explorer Test Suite', function () { afterEach(() => { @@ -12,8 +13,7 @@ suite('Help Explorer Test Suite', function () { }); test('tree view should be not created until it is activated', () => { - const testHelpExplorer = - mdbTestExtension.testExtensionController._helpExplorer; + const testHelpExplorer = new HelpExplorer(); assert(testHelpExplorer._treeView === undefined); testHelpExplorer.activateHelpTreeView( mdbTestExtension.testExtensionController._telemetryController @@ -39,7 +39,8 @@ suite('Help Explorer Test Suite', function () { ); const helpTreeItems = await testHelpExplorer._treeController.getChildren(); const atlasHelpItem = helpTreeItems[5]; - assert(atlasHelpItem.title === 'Create Free Atlas Cluster'); + + assert(atlasHelpItem.label === 'Create Free Atlas Cluster'); assert( atlasHelpItem.url === 'https://www.mongodb.com/cloud/atlas/register?utm_source=vscode&utm_medium=product&utm_campaign=VS%20code%20extension' @@ -51,20 +52,19 @@ suite('Help Explorer Test Suite', function () { test('when a help item is clicked on it should open the url with vscode', async () => { const testHelpExplorer = mdbTestExtension.testExtensionController._helpExplorer; - testHelpExplorer.activateHelpTreeView( - mdbTestExtension.testExtensionController._telemetryController - ); + sinon.replace( mdbTestExtension.testExtensionController._telemetryController, 'trackLinkClicked', - sinon.stub() + sinon.fake.resolves() ); - const stubExecuteCommand = sinon.stub(); - sinon.replace( - mdbTestExtension.testExtensionController._telemetryController, - 'executeCommand', - stubExecuteCommand + + testHelpExplorer.activateHelpTreeView( + mdbTestExtension.testExtensionController._telemetryController ); + + const stubExecuteCommand = sinon.fake.resolves(); + sinon.replace(vscode.commands, 'executeCommand', stubExecuteCommand); const helpTreeItems = await testHelpExplorer._treeController.getChildren(); const atlasHelpItem = helpTreeItems[5]; testHelpExplorer._treeController.onClickHelpItem( @@ -72,28 +72,29 @@ suite('Help Explorer Test Suite', function () { mdbTestExtension.testExtensionController._telemetryController ); assert(stubExecuteCommand.called); - assert(stubExecuteCommand.firstArg === 'vscode.open'); + assert(stubExecuteCommand.firstCall.args[0] === 'vscode.open'); + assert( + stubExecuteCommand.firstCall.args[1].path === vscode.Uri.parse(atlasHelpItem.url).path + ); assert( - stubExecuteCommand.secondArg === vscode.Uri.parse(atlasHelpItem.url) + stubExecuteCommand.firstCall.args[1].authority === vscode.Uri.parse(atlasHelpItem.url).authority ); }); test('when a help item is clicked on it should have a telemetry trackLinkClicked event', async () => { const testHelpExplorer = mdbTestExtension.testExtensionController._helpExplorer; - testHelpExplorer.activateHelpTreeView( - mdbTestExtension.testExtensionController._telemetryController - ); - const stubLinkClickedTelemetry = sinon.stub(); + + const stubLinkClickedTelemetry = sinon.fake.resolves(); sinon.replace( mdbTestExtension.testExtensionController._telemetryController, 'trackLinkClicked', stubLinkClickedTelemetry ); - sinon.replace( - mdbTestExtension.testExtensionController._telemetryController, - 'executeCommand', - sinon.stub() + testHelpExplorer.activateHelpTreeView( + mdbTestExtension.testExtensionController._telemetryController ); + + sinon.replace(vscode.commands, 'executeCommand', sinon.fake.resolves()); const helpTreeItems = await testHelpExplorer._treeController.getChildren(); const atlasHelpItem = helpTreeItems[5]; testHelpExplorer._treeController.onClickHelpItem( @@ -101,7 +102,7 @@ suite('Help Explorer Test Suite', function () { mdbTestExtension.testExtensionController._telemetryController ); assert(stubLinkClickedTelemetry.called); - assert(stubLinkClickedTelemetry.firstArg === 'helpPanel'); - assert(stubLinkClickedTelemetry.secondArg === 'freeClusterCTA'); + assert(stubLinkClickedTelemetry.firstCall.args[0] === 'helpPanel'); + assert(stubLinkClickedTelemetry.firstCall.args[1] === 'freeClusterCTA'); }); }); diff --git a/src/test/suite/extension.test.ts b/src/test/suite/extension.test.ts index 7ef0f75f8..02afcaac0 100644 --- a/src/test/suite/extension.test.ts +++ b/src/test/suite/extension.test.ts @@ -1,41 +1,16 @@ import * as assert from 'assert'; import * as vscode from 'vscode'; -import { beforeEach, afterEach } from 'mocha'; -import * as sinon from 'sinon'; -const { contributes } = require('../../../../package.json'); +const { contributes } = require('../../../package.json'); suite('Extension Test Suite', () => { vscode.window.showInformationMessage('Starting tests...'); - const sandbox = sinon.createSandbox(); - - let createTerminalStub: any; - let fakeSendTerminalText: any; - - beforeEach(() => { - sandbox.stub(vscode.window, 'showInformationMessage'); - - createTerminalStub = sandbox.stub(); - fakeSendTerminalText = sandbox.stub(); - - createTerminalStub.returns({ - sendText: fakeSendTerminalText, - show: () => {} - }); - sandbox.replace(vscode.window, 'createTerminal', createTerminalStub); - }); - - afterEach(() => { - sandbox.restore(); - sinon.restore(); - }); - test('there should be 3 views registered in the package.json', () => { - assert(contributes.views.mongodb.length === 3); - assert(contributes.views.mongodb.id === 'mongoDBConnectionExplorer'); - assert(contributes.views.mongodb.id === 'mongoDBPlaygroundsExplorer'); - assert(contributes.views.mongodb.id === 'mongoDBHelpExplorer'); + assert(contributes.views.mongoDB.length === 3); + assert(contributes.views.mongoDB[0].id === 'mongoDBConnectionExplorer'); + assert(contributes.views.mongoDB[1].id === 'mongoDBPlaygroundsExplorer'); + assert(contributes.views.mongoDB[2].id === 'mongoDBHelpExplorer'); }); test('commands are registered in vscode', async () => {