diff --git a/extensions/azurecore/src/azureResource/providers/azuremonitor/azuremonitorTreeDataProvider.ts b/extensions/azurecore/src/azureResource/providers/azuremonitor/azuremonitorTreeDataProvider.ts index 1817030647..a20784e07e 100644 --- a/extensions/azurecore/src/azureResource/providers/azuremonitor/azuremonitorTreeDataProvider.ts +++ b/extensions/azurecore/src/azureResource/providers/azuremonitor/azuremonitorTreeDataProvider.ts @@ -60,21 +60,16 @@ export class AzureMonitorTreeDataProvider extends ResourceTreeDataProviderBase { + return [{ + id: AzureMonitorTreeDataProvider.containerId, + label: AzureMonitorTreeDataProvider.containerLabel, + iconPath: { + dark: this._extensionContext.asAbsolutePath('resources/dark/folder_inverse.svg'), + light: this._extensionContext.asAbsolutePath('resources/light/folder.svg') + }, + collapsibleState: TreeItemCollapsibleState.Collapsed, + contextValue: AzureResourceItemType.databaseServerContainer + }]; } } diff --git a/extensions/azurecore/src/azureResource/providers/cosmosdb/mongo/cosmosDbMongoTreeDataProvider.ts b/extensions/azurecore/src/azureResource/providers/cosmosdb/mongo/cosmosDbMongoTreeDataProvider.ts index 754fb03687..2eed523bd5 100644 --- a/extensions/azurecore/src/azureResource/providers/cosmosdb/mongo/cosmosDbMongoTreeDataProvider.ts +++ b/extensions/azurecore/src/azureResource/providers/cosmosdb/mongo/cosmosDbMongoTreeDataProvider.ts @@ -59,21 +59,16 @@ export class CosmosDbMongoTreeDataProvider extends ResourceTreeDataProviderBase< }; } - protected createContainerNode(): azureResource.IAzureResourceNode { - return { - account: undefined, - subscription: undefined, - tenantId: undefined, - treeItem: { - id: CosmosDbMongoTreeDataProvider.CONTAINER_ID, - label: CosmosDbMongoTreeDataProvider.CONTAINER_LABEL, - iconPath: { - dark: this._extensionContext.asAbsolutePath('resources/dark/folder_inverse.svg'), - light: this._extensionContext.asAbsolutePath('resources/light/folder.svg') - }, - collapsibleState: TreeItemCollapsibleState.Collapsed, - contextValue: AzureResourceItemType.databaseServerContainer - } - }; + public async getRootChildren(): Promise { + return [{ + id: CosmosDbMongoTreeDataProvider.CONTAINER_ID, + label: CosmosDbMongoTreeDataProvider.CONTAINER_LABEL, + iconPath: { + dark: this._extensionContext.asAbsolutePath('resources/dark/folder_inverse.svg'), + light: this._extensionContext.asAbsolutePath('resources/light/folder.svg') + }, + collapsibleState: TreeItemCollapsibleState.Collapsed, + contextValue: AzureResourceItemType.databaseServerContainer + }]; } } diff --git a/extensions/azurecore/src/azureResource/providers/database/databaseTreeDataProvider.ts b/extensions/azurecore/src/azureResource/providers/database/databaseTreeDataProvider.ts index 34d4e3bc48..58a8c0de16 100644 --- a/extensions/azurecore/src/azureResource/providers/database/databaseTreeDataProvider.ts +++ b/extensions/azurecore/src/azureResource/providers/database/databaseTreeDataProvider.ts @@ -59,21 +59,16 @@ export class AzureResourceDatabaseTreeDataProvider extends ResourceTreeDataProvi }; } - protected createContainerNode(): azureResource.IAzureResourceNode { - return { - account: undefined, - subscription: undefined, - tenantId: undefined, - treeItem: { - id: AzureResourceDatabaseTreeDataProvider.containerId, - label: AzureResourceDatabaseTreeDataProvider.containerLabel, - iconPath: { - dark: this._extensionContext.asAbsolutePath('resources/dark/folder_inverse.svg'), - light: this._extensionContext.asAbsolutePath('resources/light/folder.svg') - }, - collapsibleState: vscode.TreeItemCollapsibleState.Collapsed, - contextValue: AzureResourceItemType.databaseContainer - } - }; + public async getRootChildren(): Promise { + return [{ + id: AzureResourceDatabaseTreeDataProvider.containerId, + label: AzureResourceDatabaseTreeDataProvider.containerLabel, + iconPath: { + dark: this._extensionContext.asAbsolutePath('resources/dark/folder_inverse.svg'), + light: this._extensionContext.asAbsolutePath('resources/light/folder.svg') + }, + collapsibleState: vscode.TreeItemCollapsibleState.Collapsed, + contextValue: AzureResourceItemType.databaseContainer + }]; } } diff --git a/extensions/azurecore/src/azureResource/providers/databaseServer/databaseServerTreeDataProvider.ts b/extensions/azurecore/src/azureResource/providers/databaseServer/databaseServerTreeDataProvider.ts index 1c9c11e8cc..37e0574a4c 100644 --- a/extensions/azurecore/src/azureResource/providers/databaseServer/databaseServerTreeDataProvider.ts +++ b/extensions/azurecore/src/azureResource/providers/databaseServer/databaseServerTreeDataProvider.ts @@ -60,21 +60,16 @@ export class AzureResourceDatabaseServerTreeDataProvider extends ResourceTreeDat }; } - protected createContainerNode(): azureResource.IAzureResourceNode { - return { - account: undefined, - subscription: undefined, - tenantId: undefined, - treeItem: { - id: AzureResourceDatabaseServerTreeDataProvider.containerId, - label: AzureResourceDatabaseServerTreeDataProvider.containerLabel, - iconPath: { - dark: this._extensionContext.asAbsolutePath('resources/dark/folder_inverse.svg'), - light: this._extensionContext.asAbsolutePath('resources/light/folder.svg') - }, - collapsibleState: vscode.TreeItemCollapsibleState.Collapsed, - contextValue: AzureResourceItemType.databaseServerContainer - } - }; + public async getRootChildren(): Promise { + return [{ + id: AzureResourceDatabaseServerTreeDataProvider.containerId, + label: AzureResourceDatabaseServerTreeDataProvider.containerLabel, + iconPath: { + dark: this._extensionContext.asAbsolutePath('resources/dark/folder_inverse.svg'), + light: this._extensionContext.asAbsolutePath('resources/light/folder.svg') + }, + collapsibleState: vscode.TreeItemCollapsibleState.Collapsed, + contextValue: AzureResourceItemType.databaseServerContainer + }]; } } diff --git a/extensions/azurecore/src/azureResource/providers/kusto/kustoTreeDataProvider.ts b/extensions/azurecore/src/azureResource/providers/kusto/kustoTreeDataProvider.ts index 9b926710f6..d8603dabf2 100644 --- a/extensions/azurecore/src/azureResource/providers/kusto/kustoTreeDataProvider.ts +++ b/extensions/azurecore/src/azureResource/providers/kusto/kustoTreeDataProvider.ts @@ -60,21 +60,16 @@ export class KustoTreeDataProvider extends ResourceTreeDataProviderBase { + return [{ + id: KustoTreeDataProvider.containerId, + label: KustoTreeDataProvider.containerLabel, + iconPath: { + dark: this._extensionContext.asAbsolutePath('resources/dark/folder_inverse.svg'), + light: this._extensionContext.asAbsolutePath('resources/light/folder.svg') + }, + collapsibleState: TreeItemCollapsibleState.Collapsed, + contextValue: AzureResourceItemType.databaseServerContainer + }]; } } diff --git a/extensions/azurecore/src/azureResource/providers/mysqlFlexibleServer/mysqlFlexibleServerTreeDataProvider.ts b/extensions/azurecore/src/azureResource/providers/mysqlFlexibleServer/mysqlFlexibleServerTreeDataProvider.ts index b2b879d402..ee7060441f 100644 --- a/extensions/azurecore/src/azureResource/providers/mysqlFlexibleServer/mysqlFlexibleServerTreeDataProvider.ts +++ b/extensions/azurecore/src/azureResource/providers/mysqlFlexibleServer/mysqlFlexibleServerTreeDataProvider.ts @@ -61,21 +61,16 @@ export class MysqlFlexibleServerTreeDataProvider extends ResourceTreeDataProvide }; } - protected createContainerNode(): azureResource.IAzureResourceNode { - return { - account: undefined, - subscription: undefined, - tenantId: undefined, - treeItem: { - id: MysqlFlexibleServerTreeDataProvider.CONTAINER_ID, - label: MysqlFlexibleServerTreeDataProvider.CONTAINER_LABEL, - iconPath: { - dark: this._extensionContext.asAbsolutePath('resources/dark/folder_inverse.svg'), - light: this._extensionContext.asAbsolutePath('resources/light/folder.svg') - }, - collapsibleState: TreeItemCollapsibleState.Collapsed, - contextValue: AzureResourceItemType.databaseServerContainer - } - }; + public async getRootChildren(): Promise { + return [{ + id: MysqlFlexibleServerTreeDataProvider.CONTAINER_ID, + label: MysqlFlexibleServerTreeDataProvider.CONTAINER_LABEL, + iconPath: { + dark: this._extensionContext.asAbsolutePath('resources/dark/folder_inverse.svg'), + light: this._extensionContext.asAbsolutePath('resources/light/folder.svg') + }, + collapsibleState: TreeItemCollapsibleState.Collapsed, + contextValue: AzureResourceItemType.databaseServerContainer + }]; } } diff --git a/extensions/azurecore/src/azureResource/providers/postgresArcServer/postgresServerTreeDataProvider.ts b/extensions/azurecore/src/azureResource/providers/postgresArcServer/postgresServerTreeDataProvider.ts index 46a61fffe3..5c4dba5f48 100644 --- a/extensions/azurecore/src/azureResource/providers/postgresArcServer/postgresServerTreeDataProvider.ts +++ b/extensions/azurecore/src/azureResource/providers/postgresArcServer/postgresServerTreeDataProvider.ts @@ -63,21 +63,16 @@ export class PostgresServerArcTreeDataProvider extends ResourceTreeDataProviderB }; } - protected createContainerNode(): azureResource.IAzureResourceNode { - return { - account: undefined, - subscription: undefined, - tenantId: undefined, - treeItem: { - id: PostgresServerArcTreeDataProvider.containerId, - label: PostgresServerArcTreeDataProvider.containerLabel, - iconPath: { - dark: this._extensionContext.asAbsolutePath('resources/dark/folder_inverse.svg'), - light: this._extensionContext.asAbsolutePath('resources/light/folder.svg') - }, - collapsibleState: TreeItemCollapsibleState.Collapsed, - contextValue: AzureResourceItemType.databaseServerContainer - } - }; + public async getRootChildren(): Promise { + return [{ + id: PostgresServerArcTreeDataProvider.containerId, + label: PostgresServerArcTreeDataProvider.containerLabel, + iconPath: { + dark: this._extensionContext.asAbsolutePath('resources/dark/folder_inverse.svg'), + light: this._extensionContext.asAbsolutePath('resources/light/folder.svg') + }, + collapsibleState: TreeItemCollapsibleState.Collapsed, + contextValue: AzureResourceItemType.databaseServerContainer + }]; } } diff --git a/extensions/azurecore/src/azureResource/providers/postgresServer/postgresServerTreeDataProvider.ts b/extensions/azurecore/src/azureResource/providers/postgresServer/postgresServerTreeDataProvider.ts index 5d0b7807c6..d3933285be 100644 --- a/extensions/azurecore/src/azureResource/providers/postgresServer/postgresServerTreeDataProvider.ts +++ b/extensions/azurecore/src/azureResource/providers/postgresServer/postgresServerTreeDataProvider.ts @@ -63,21 +63,16 @@ export class PostgresServerTreeDataProvider extends ResourceTreeDataProviderBase }; } - protected createContainerNode(): azureResource.IAzureResourceNode { - return { - account: undefined, - subscription: undefined, - tenantId: undefined, - treeItem: { - id: PostgresServerTreeDataProvider.containerId, - label: PostgresServerTreeDataProvider.containerLabel, - iconPath: { - dark: this._extensionContext.asAbsolutePath('resources/dark/folder_inverse.svg'), - light: this._extensionContext.asAbsolutePath('resources/light/folder.svg') - }, - collapsibleState: TreeItemCollapsibleState.Collapsed, - contextValue: AzureResourceItemType.databaseServerContainer - } - }; + public async getRootChildren(): Promise { + return [{ + id: PostgresServerTreeDataProvider.containerId, + label: PostgresServerTreeDataProvider.containerLabel, + iconPath: { + dark: this._extensionContext.asAbsolutePath('resources/dark/folder_inverse.svg'), + light: this._extensionContext.asAbsolutePath('resources/light/folder.svg') + }, + collapsibleState: TreeItemCollapsibleState.Collapsed, + contextValue: AzureResourceItemType.databaseServerContainer + }]; } } diff --git a/extensions/azurecore/src/azureResource/providers/resourceTreeDataProviderBase.ts b/extensions/azurecore/src/azureResource/providers/resourceTreeDataProviderBase.ts index b019df8ac7..91f810ccb5 100644 --- a/extensions/azurecore/src/azureResource/providers/resourceTreeDataProviderBase.ts +++ b/extensions/azurecore/src/azureResource/providers/resourceTreeDataProviderBase.ts @@ -17,16 +17,12 @@ export abstract class ResourceTreeDataProviderBase) { } - public getTreeItem(element: azureResource.IAzureResourceNode): azdata.TreeItem | Thenable { + public async getResourceTreeItem(element: azureResource.IAzureResourceNode): Promise { return element.treeItem; } - public async getChildren(element?: azureResource.IAzureResourceNode): Promise { + public async getChildren(element: azureResource.IAzureResourceNode): Promise { try { - if (!element) { - return [this.createContainerNode()]; - } - let resources: T[] = await this.getResources(element); return resources.map((resource) => { @@ -51,7 +47,7 @@ export abstract class ResourceTreeDataProviderBase; } export interface GraphData { diff --git a/extensions/azurecore/src/azureResource/providers/sqlinstance/sqlInstanceTreeDataProvider.ts b/extensions/azurecore/src/azureResource/providers/sqlinstance/sqlInstanceTreeDataProvider.ts index 39fe0724a5..c0eaba1967 100644 --- a/extensions/azurecore/src/azureResource/providers/sqlinstance/sqlInstanceTreeDataProvider.ts +++ b/extensions/azurecore/src/azureResource/providers/sqlinstance/sqlInstanceTreeDataProvider.ts @@ -60,21 +60,16 @@ export class SqlInstanceTreeDataProvider extends ResourceTreeDataProviderBase { + return [{ + id: SqlInstanceTreeDataProvider.containerId, + label: SqlInstanceTreeDataProvider.containerLabel, + iconPath: { + dark: this._extensionContext.asAbsolutePath('resources/dark/folder_inverse.svg'), + light: this._extensionContext.asAbsolutePath('resources/light/folder.svg') + }, + collapsibleState: TreeItemCollapsibleState.Collapsed, + contextValue: AzureResourceItemType.databaseServerContainer + }]; } } diff --git a/extensions/azurecore/src/azureResource/providers/sqlinstanceArc/sqlInstanceArcTreeDataProvider.ts b/extensions/azurecore/src/azureResource/providers/sqlinstanceArc/sqlInstanceArcTreeDataProvider.ts index 44a8875576..3e419f075d 100644 --- a/extensions/azurecore/src/azureResource/providers/sqlinstanceArc/sqlInstanceArcTreeDataProvider.ts +++ b/extensions/azurecore/src/azureResource/providers/sqlinstanceArc/sqlInstanceArcTreeDataProvider.ts @@ -60,21 +60,16 @@ export class SqlInstanceArcTreeDataProvider extends ResourceTreeDataProviderBase }; } - protected createContainerNode(): azureResource.IAzureResourceNode { - return { - account: undefined, - subscription: undefined, - tenantId: undefined, - treeItem: { - id: SqlInstanceArcTreeDataProvider.containerId, - label: SqlInstanceArcTreeDataProvider.containerLabel, - iconPath: { - dark: this._extensionContext.asAbsolutePath('resources/dark/folder_inverse.svg'), - light: this._extensionContext.asAbsolutePath('resources/light/folder.svg') - }, - collapsibleState: TreeItemCollapsibleState.Collapsed, - contextValue: AzureResourceItemType.databaseServerContainer - } - }; + public async getRootChildren(): Promise { + return [{ + id: SqlInstanceArcTreeDataProvider.containerId, + label: SqlInstanceArcTreeDataProvider.containerLabel, + iconPath: { + dark: this._extensionContext.asAbsolutePath('resources/dark/folder_inverse.svg'), + light: this._extensionContext.asAbsolutePath('resources/light/folder.svg') + }, + collapsibleState: TreeItemCollapsibleState.Collapsed, + contextValue: AzureResourceItemType.databaseServerContainer + }]; } } diff --git a/extensions/azurecore/src/azureResource/resourceService.ts b/extensions/azurecore/src/azureResource/resourceService.ts index 1535b446d7..3bab08cedb 100644 --- a/extensions/azurecore/src/azureResource/resourceService.ts +++ b/extensions/azurecore/src/azureResource/resourceService.ts @@ -32,7 +32,7 @@ export class AzureResourceService { this._areResourceProvidersLoaded = false; } - public async getRootChildren(resourceProviderId: string, account: AzureAccount, subscription: azureResource.AzureResourceSubscription, tenatId: string): Promise { + public async getRootChildren(resourceProviderId: string, account: AzureAccount, subscription: azureResource.AzureResourceSubscription, tenantId: string): Promise { await this.ensureResourceProvidersRegistered(); if (!(resourceProviderId in this._resourceProviders)) { @@ -40,16 +40,18 @@ export class AzureResourceService { } const treeDataProvider = this._treeDataProviders[resourceProviderId]; - const children = await treeDataProvider.getChildren(); + const rootChildren = await treeDataProvider.getRootChildren(); - return children.map((child) => { - resourceProviderId: resourceProviderId, - resourceNode: { - account: account, - subscription: subscription, - tenantId: tenatId, - treeItem: child.treeItem - } + return rootChildren.map(rootChild => { + return { + resourceProviderId, + resourceNode: { + account, + subscription, + tenantId, + treeItem: rootChild + } + }; }); } @@ -70,7 +72,7 @@ export class AzureResourceService { }); } - public async getTreeItem(resourceProviderId: string, element?: azureResource.IAzureResourceNode): Promise { + public async getTreeItem(resourceProviderId: string, element: azureResource.IAzureResourceNode): Promise { await this.ensureResourceProvidersRegistered(); if (!(resourceProviderId in this._resourceProviders)) { @@ -78,7 +80,7 @@ export class AzureResourceService { } const treeDataProvider = this._treeDataProviders[resourceProviderId]; - return treeDataProvider.getTreeItem(element); + return treeDataProvider.getResourceTreeItem(element); } public get areResourceProvidersLoaded(): boolean { diff --git a/extensions/azurecore/src/azureResource/tree/subscriptionTreeNode.ts b/extensions/azurecore/src/azureResource/tree/subscriptionTreeNode.ts index 62ac1128a1..06e49e422f 100644 --- a/extensions/azurecore/src/azureResource/tree/subscriptionTreeNode.ts +++ b/extensions/azurecore/src/azureResource/tree/subscriptionTreeNode.ts @@ -24,14 +24,14 @@ export class AzureResourceSubscriptionTreeNode extends AzureResourceContainerTre public constructor( public readonly account: AzureAccount, public readonly subscription: azureResource.AzureResourceSubscription, - public readonly tenatId: string, + public readonly tenantId: string, appContext: AppContext, treeChangeHandler: IAzureResourceTreeChangeHandler, parent: TreeNode ) { super(appContext, treeChangeHandler, parent); - this._id = `account_${this.account.key.accountId}.subscription_${this.subscription.id}.tenant_${this.tenatId}`; + this._id = `account_${this.account.key.accountId}.subscription_${this.subscription.id}.tenant_${this.tenantId}`; this.setCacheKey(`${this._id}.resources`); } @@ -42,7 +42,7 @@ export class AzureResourceSubscriptionTreeNode extends AzureResourceContainerTre const children: IAzureResourceNodeWithProviderId[] = []; for (const resourceProviderId of await resourceService.listResourceProviderIds()) { - children.push(...await resourceService.getRootChildren(resourceProviderId, this.account, this.subscription, this.tenatId)); + children.push(...await resourceService.getRootChildren(resourceProviderId, this.account, this.subscription, this.tenantId)); } if (children.length === 0) { diff --git a/extensions/azurecore/src/azurecore.d.ts b/extensions/azurecore/src/azurecore.d.ts index 9ccb612639..5c43cf92b4 100644 --- a/extensions/azurecore/src/azurecore.d.ts +++ b/extensions/azurecore/src/azurecore.d.ts @@ -355,7 +355,22 @@ declare module 'azurecore' { getTreeDataProvider(): IAzureResourceTreeDataProvider; } - export interface IAzureResourceTreeDataProvider extends TreeDataProvider { + export interface IAzureResourceTreeDataProvider { + /** + * Gets the root tree item nodes for this provider - these will be used as + * direct children of the Account node in the Azure tree view. + */ + getRootChildren(): Promise; + /** + * Gets the children for a given {@link IAzureResourceNode} + * @param element The parent node to get the children for + */ + getChildren(element: IAzureResourceNode): Promise; + /** + * Gets the tree item to display for a given {@link IAzureResourceNode} + * @param element The resource node to get the TreeItem for + */ + getResourceTreeItem(element: IAzureResourceNode): Promise; browseConnectionMode: boolean; } diff --git a/extensions/azurecore/src/test/azureResource/providers/database/databaseTreeDataProvider.test.ts b/extensions/azurecore/src/test/azureResource/providers/database/databaseTreeDataProvider.test.ts index 653b38f0e8..eb246e5a2a 100644 --- a/extensions/azurecore/src/test/azureResource/providers/database/databaseTreeDataProvider.test.ts +++ b/extensions/azurecore/src/test/azureResource/providers/database/databaseTreeDataProvider.test.ts @@ -104,7 +104,7 @@ describe('AzureResourceDatabaseTreeDataProvider.info', function (): void { it('Should be correct when created.', async function (): Promise { const treeDataProvider = new AzureResourceDatabaseTreeDataProvider(mockDatabaseService.object, mockExtensionContext.object); - const treeItem = await treeDataProvider.getTreeItem(mockResourceRootNode); + const treeItem = await treeDataProvider.getResourceTreeItem(mockResourceRootNode); should(treeItem.id).equal(mockResourceRootNode.treeItem.id); should(treeItem.label).equal(mockResourceRootNode.treeItem.label); should(treeItem.collapsibleState).equal(mockResourceRootNode.treeItem.collapsibleState); @@ -129,19 +129,16 @@ describe('AzureResourceDatabaseTreeDataProvider.getChildren', function (): void it('Should return container node when element is undefined.', async function (): Promise { const treeDataProvider = new AzureResourceDatabaseTreeDataProvider(mockDatabaseService.object, mockExtensionContext.object); - const children = await treeDataProvider.getChildren(); + const children = await treeDataProvider.getRootChildren(); should(children).Array(); should(children.length).equal(1); const child = children[0]; - should(child.account).undefined(); - should(child.subscription).undefined(); - should(child.tenantId).undefined(); - should(child.treeItem.id).equal('azure.resource.providers.database.treeDataProvider.databaseContainer'); - should(child.treeItem.label).equal('SQL database'); - should(child.treeItem.collapsibleState).equal(vscode.TreeItemCollapsibleState.Collapsed); - should(child.treeItem.contextValue).equal('azure.resource.itemType.databaseContainer'); + should(child.id).equal('azure.resource.providers.database.treeDataProvider.databaseContainer'); + should(child.label).equal('SQL database'); + should(child.collapsibleState).equal(vscode.TreeItemCollapsibleState.Collapsed); + should(child.contextValue).equal('azure.resource.itemType.databaseContainer'); }); it('Should return resource nodes when it is container node.', async function (): Promise { diff --git a/extensions/azurecore/src/test/azureResource/providers/databaseServer/databaseServerTreeDataProvider.test.ts b/extensions/azurecore/src/test/azureResource/providers/databaseServer/databaseServerTreeDataProvider.test.ts index 298c401381..f287b532e5 100644 --- a/extensions/azurecore/src/test/azureResource/providers/databaseServer/databaseServerTreeDataProvider.test.ts +++ b/extensions/azurecore/src/test/azureResource/providers/databaseServer/databaseServerTreeDataProvider.test.ts @@ -103,7 +103,7 @@ describe('AzureResourceDatabaseServerTreeDataProvider.info', function (): void { it('Should be correct when created.', async function (): Promise { const treeDataProvider = new AzureResourceDatabaseServerTreeDataProvider(mockDatabaseServerService.object, mockExtensionContext.object); - const treeItem = await treeDataProvider.getTreeItem(mockResourceRootNode); + const treeItem = await treeDataProvider.getResourceTreeItem(mockResourceRootNode); should(treeItem.id).equal(mockResourceRootNode.treeItem.id); should(treeItem.label).equal(mockResourceRootNode.treeItem.label); should(treeItem.collapsibleState).equal(mockResourceRootNode.treeItem.collapsibleState); @@ -128,19 +128,16 @@ describe('AzureResourceDatabaseServerTreeDataProvider.getChildren', function (): it('Should return container node when element is undefined.', async function (): Promise { const treeDataProvider = new AzureResourceDatabaseServerTreeDataProvider(mockDatabaseServerService.object, mockExtensionContext.object); - const children = await treeDataProvider.getChildren(); + const children = await treeDataProvider.getRootChildren(); should(children).Array(); should(children.length).equal(1); const child = children[0]; - should(child.account).undefined(); - should(child.subscription).undefined(); - should(child.tenantId).undefined(); - should(child.treeItem.id).equal('azure.resource.providers.databaseServer.treeDataProvider.databaseServerContainer'); - should(child.treeItem.label).equal('SQL server'); - should(child.treeItem.collapsibleState).equal(vscode.TreeItemCollapsibleState.Collapsed); - should(child.treeItem.contextValue).equal('azure.resource.itemType.databaseServerContainer'); + should(child.id).equal('azure.resource.providers.databaseServer.treeDataProvider.databaseServerContainer'); + should(child.label).equal('SQL server'); + should(child.collapsibleState).equal(vscode.TreeItemCollapsibleState.Collapsed); + should(child.contextValue).equal('azure.resource.itemType.databaseServerContainer'); }); it('Should return resource nodes when it is container node.', async function (): Promise { diff --git a/extensions/azurecore/src/test/azureResource/resourceService.test.ts b/extensions/azurecore/src/test/azureResource/resourceService.test.ts index 2ea35e144f..c7567f256d 100644 --- a/extensions/azurecore/src/test/azureResource/resourceService.test.ts +++ b/extensions/azurecore/src/test/azureResource/resourceService.test.ts @@ -7,6 +7,7 @@ import * as should from 'should'; import * as TypeMoq from 'typemoq'; import 'mocha'; import { fail } from 'assert'; +import * as azdata from 'azdata'; import { AzureResourceService } from '../../azureResource/resourceService'; import { AzureAccount, azureResource } from 'azurecore'; @@ -52,15 +53,15 @@ let resourceService: AzureResourceService; describe('AzureResourceService.listResourceProviderIds', function(): void { beforeEach(() => { mockResourceTreeDataProvider1 = TypeMoq.Mock.ofType(); - mockResourceTreeDataProvider1.setup((o) => o.getChildren()).returns(() => Promise.resolve([TypeMoq.Mock.ofType().object])); - mockResourceTreeDataProvider1.setup((o) => o.getTreeItem(TypeMoq.It.isAny())).returns(() => Promise.resolve(TypeMoq.It.isAny())); + mockResourceTreeDataProvider1.setup((o) => o.getRootChildren()).returns(() => Promise.resolve([TypeMoq.Mock.ofType().object])); + mockResourceTreeDataProvider1.setup((o) => o.getResourceTreeItem(TypeMoq.It.isAny())).returns(() => Promise.resolve(TypeMoq.It.isAny())); mockResourceProvider1 = TypeMoq.Mock.ofType(); mockResourceProvider1.setup((o) => o.providerId).returns(() => 'mockResourceProvider1'); mockResourceProvider1.setup((o) => o.getTreeDataProvider()).returns(() => mockResourceTreeDataProvider1.object); mockResourceTreeDataProvider2 = TypeMoq.Mock.ofType(); - mockResourceTreeDataProvider2.setup((o) => o.getChildren()).returns(() => Promise.resolve([TypeMoq.Mock.ofType().object])); - mockResourceTreeDataProvider2.setup((o) => o.getTreeItem(TypeMoq.It.isAny())).returns(() => Promise.resolve(TypeMoq.It.isAny())); + mockResourceTreeDataProvider2.setup((o) => o.getRootChildren()).returns(() => Promise.resolve([TypeMoq.Mock.ofType().object])); + mockResourceTreeDataProvider2.setup((o) => o.getResourceTreeItem(TypeMoq.It.isAny())).returns(() => Promise.resolve(TypeMoq.It.isAny())); mockResourceProvider2 = TypeMoq.Mock.ofType(); mockResourceProvider2.setup((o) => o.providerId).returns(() => 'mockResourceProvider2'); mockResourceProvider2.setup((o) => o.getTreeDataProvider()).returns(() => mockResourceTreeDataProvider2.object); @@ -89,8 +90,8 @@ describe('AzureResourceService.listResourceProviderIds', function(): void { describe('AzureResourceService.getRootChildren', function(): void { beforeEach(() => { mockResourceTreeDataProvider1 = TypeMoq.Mock.ofType(); - mockResourceTreeDataProvider1.setup((o) => o.getChildren()).returns(() => Promise.resolve([TypeMoq.Mock.ofType().object])); - mockResourceTreeDataProvider1.setup((o) => o.getTreeItem(TypeMoq.It.isAny())).returns(() => Promise.resolve(TypeMoq.It.isAny())); + mockResourceTreeDataProvider1.setup((o) => o.getRootChildren()).returns(() => Promise.resolve([TypeMoq.Mock.ofType().object])); + mockResourceTreeDataProvider1.setup((o) => o.getResourceTreeItem(TypeMoq.It.isAny())).returns(() => Promise.resolve(TypeMoq.It.isAny())); mockResourceProvider1 = TypeMoq.Mock.ofType(); mockResourceProvider1.setup((o) => o.providerId).returns(() => 'mockResourceProvider1'); mockResourceProvider1.setup((o) => o.getTreeDataProvider()).returns(() => mockResourceTreeDataProvider1.object); @@ -122,9 +123,9 @@ describe('AzureResourceService.getRootChildren', function(): void { describe('AzureResourceService.getChildren', function(): void { beforeEach(() => { mockResourceTreeDataProvider1 = TypeMoq.Mock.ofType(); - mockResourceTreeDataProvider1.setup((o) => o.getChildren()).returns(() => Promise.resolve([TypeMoq.Mock.ofType().object])); + mockResourceTreeDataProvider1.setup((o) => o.getRootChildren()).returns(() => Promise.resolve([TypeMoq.Mock.ofType().object])); mockResourceTreeDataProvider1.setup((o) => o.getChildren(TypeMoq.It.isAny())).returns(() => Promise.resolve([TypeMoq.Mock.ofType().object])); - mockResourceTreeDataProvider1.setup((o) => o.getTreeItem(TypeMoq.It.isAny())).returns(() => Promise.resolve(TypeMoq.It.isAny())); + mockResourceTreeDataProvider1.setup((o) => o.getResourceTreeItem(TypeMoq.It.isAny())).returns(() => Promise.resolve(TypeMoq.It.isAny())); mockResourceProvider1 = TypeMoq.Mock.ofType(); mockResourceProvider1.setup((o) => o.providerId).returns(() => 'mockResourceProvider1'); mockResourceProvider1.setup((o) => o.getTreeDataProvider()).returns(() => mockResourceTreeDataProvider1.object); @@ -155,9 +156,9 @@ describe('AzureResourceService.getChildren', function(): void { describe('AzureResourceService.getTreeItem', function(): void { beforeEach(() => { mockResourceTreeDataProvider1 = TypeMoq.Mock.ofType(); - mockResourceTreeDataProvider1.setup((o) => o.getChildren()).returns(() => Promise.resolve([TypeMoq.Mock.ofType().object])); + mockResourceTreeDataProvider1.setup((o) => o.getRootChildren()).returns(() => Promise.resolve([TypeMoq.Mock.ofType().object])); mockResourceTreeDataProvider1.setup((o) => o.getChildren(TypeMoq.It.isAny())).returns(() => Promise.resolve([TypeMoq.Mock.ofType().object])); - mockResourceTreeDataProvider1.setup((o) => o.getTreeItem(TypeMoq.It.isAny())).returns(() => Promise.resolve(TypeMoq.It.isAny())); + mockResourceTreeDataProvider1.setup((o) => o.getResourceTreeItem(TypeMoq.It.isAny())).returns(() => Promise.resolve(TypeMoq.It.isAny())); mockResourceProvider1 = TypeMoq.Mock.ofType(); mockResourceProvider1.setup((o) => o.providerId).returns(() => 'mockResourceProvider1'); mockResourceProvider1.setup((o) => o.getTreeDataProvider()).returns(() => mockResourceTreeDataProvider1.object); diff --git a/extensions/azurecore/src/test/azureResource/resourceTreeNode.test.ts b/extensions/azurecore/src/test/azureResource/resourceTreeNode.test.ts index ebd6bf2a75..fd6512de91 100644 --- a/extensions/azurecore/src/test/azureResource/resourceTreeNode.test.ts +++ b/extensions/azurecore/src/test/azureResource/resourceTreeNode.test.ts @@ -96,7 +96,7 @@ let appContext: AppContext; describe('AzureResourceResourceTreeNode.info', function (): void { beforeEach(() => { mockResourceTreeDataProvider = TypeMoq.Mock.ofType(); - mockResourceTreeDataProvider.setup((o) => o.getTreeItem(mockResourceRootNode)).returns(() => mockResourceRootNode.treeItem); + mockResourceTreeDataProvider.setup((o) => o.getResourceTreeItem(mockResourceRootNode)).returns(() => Promise.resolve(mockResourceRootNode.treeItem)); mockResourceTreeDataProvider.setup((o) => o.getChildren(mockResourceRootNode)).returns(() => Promise.resolve(mockResourceNodes)); mockResourceProvider = TypeMoq.Mock.ofType(); @@ -190,7 +190,7 @@ describe('AzureResourceResourceTreeNode.getChildren', function (): void { const children = await resourceTreeNode.getChildren(); - mockResourceTreeDataProvider.verify((o) => o.getChildren(), TypeMoq.Times.exactly(0)); + mockResourceTreeDataProvider.verify((o) => o.getRootChildren(), TypeMoq.Times.exactly(0)); should(children).Array(); should(children.length).equal(0); diff --git a/extensions/azurecore/src/test/azureResource/tree/subscriptionTreeNode.test.ts b/extensions/azurecore/src/test/azureResource/tree/subscriptionTreeNode.test.ts index fefcc0ba6e..33485137ab 100644 --- a/extensions/azurecore/src/test/azureResource/tree/subscriptionTreeNode.test.ts +++ b/extensions/azurecore/src/test/azureResource/tree/subscriptionTreeNode.test.ts @@ -6,6 +6,7 @@ import * as should from 'should'; import * as TypeMoq from 'typemoq'; import * as vscode from 'vscode'; +import * as azdata from 'azdata'; import 'mocha'; import { AppContext } from '../../../appContext'; @@ -69,15 +70,15 @@ describe('AzureResourceSubscriptionTreeNode.info', function(): void { mockTreeChangeHandler = TypeMoq.Mock.ofType(); mockResourceTreeDataProvider1 = TypeMoq.Mock.ofType(); - mockResourceTreeDataProvider1.setup((o) => o.getChildren()).returns(() => Promise.resolve([TypeMoq.Mock.ofType().object])); - mockResourceTreeDataProvider1.setup((o) => o.getTreeItem(TypeMoq.It.isAny())).returns(() => Promise.resolve(TypeMoq.It.isAny())); + mockResourceTreeDataProvider1.setup((o) => o.getRootChildren()).returns(() => Promise.resolve([TypeMoq.Mock.ofType().object])); + mockResourceTreeDataProvider1.setup((x: any) => x.then).returns(() => undefined); mockResourceProvider1 = TypeMoq.Mock.ofType(); mockResourceProvider1.setup((o) => o.providerId).returns(() => 'mockResourceProvider1'); mockResourceProvider1.setup((o) => o.getTreeDataProvider()).returns(() => mockResourceTreeDataProvider1.object); mockResourceTreeDataProvider2 = TypeMoq.Mock.ofType(); - mockResourceTreeDataProvider2.setup((o) => o.getChildren()).returns(() => Promise.resolve([TypeMoq.Mock.ofType().object])); - mockResourceTreeDataProvider2.setup((o) => o.getTreeItem(TypeMoq.It.isAny())).returns(() => Promise.resolve(TypeMoq.It.isAny())); + mockResourceTreeDataProvider2.setup((o) => o.getRootChildren()).returns(() => Promise.resolve([TypeMoq.Mock.ofType().object])); + mockResourceTreeDataProvider2.setup((x: any) => x.then).returns(() => undefined); mockResourceProvider2 = TypeMoq.Mock.ofType(); mockResourceProvider2.setup((o) => o.providerId).returns(() => 'mockResourceProvider2'); mockResourceProvider2.setup((o) => o.getTreeDataProvider()).returns(() => mockResourceTreeDataProvider2.object); @@ -121,15 +122,16 @@ describe('AzureResourceSubscriptionTreeNode.getChildren', function(): void { mockTreeChangeHandler = TypeMoq.Mock.ofType(); mockResourceTreeDataProvider1 = TypeMoq.Mock.ofType(); - mockResourceTreeDataProvider1.setup((o) => o.getChildren()).returns(() => Promise.resolve([TypeMoq.Mock.ofType().object])); - mockResourceTreeDataProvider1.setup((o) => o.getTreeItem(TypeMoq.It.isAny())).returns(() => Promise.resolve(TypeMoq.It.isAny())); + mockResourceTreeDataProvider1.setup((o) => o.getRootChildren()).returns(() => Promise.resolve([{ label: 'Item1'}] as azdata.TreeItem[])); + mockResourceTreeDataProvider1.setup((o) => o.getResourceTreeItem(TypeMoq.It.isAny())).returns(() => Promise.resolve(TypeMoq.It.isAny())); + mockResourceProvider1 = TypeMoq.Mock.ofType(); mockResourceProvider1.setup((o) => o.providerId).returns(() => 'mockResourceProvider1'); mockResourceProvider1.setup((o) => o.getTreeDataProvider()).returns(() => mockResourceTreeDataProvider1.object); mockResourceTreeDataProvider2 = TypeMoq.Mock.ofType(); - mockResourceTreeDataProvider2.setup((o) => o.getChildren()).returns(() => Promise.resolve([TypeMoq.Mock.ofType().object])); - mockResourceTreeDataProvider2.setup((o) => o.getTreeItem(TypeMoq.It.isAny())).returns(() => Promise.resolve(TypeMoq.It.isAny())); + mockResourceTreeDataProvider2.setup((o) => o.getRootChildren()).returns(() => Promise.resolve([{ label: 'Item2' }] as azdata.TreeItem[])); + mockResourceTreeDataProvider2.setup((o) => o.getResourceTreeItem(TypeMoq.It.isAny())).returns(() => Promise.resolve(TypeMoq.It.isAny())); mockResourceProvider2 = TypeMoq.Mock.ofType(); mockResourceProvider2.setup((o) => o.providerId).returns(() => 'mockResourceProvider2'); mockResourceProvider2.setup((o) => o.getTreeDataProvider()).returns(() => mockResourceTreeDataProvider2.object); @@ -149,14 +151,14 @@ describe('AzureResourceSubscriptionTreeNode.getChildren', function(): void { const subscriptionTreeNode = new AzureResourceSubscriptionTreeNode(mockAccount, mockSubscription, mockTenantId, appContext, mockTreeChangeHandler.object, undefined); const children = await subscriptionTreeNode.getChildren(); - mockResourceTreeDataProvider1.verify((o) => o.getChildren(), TypeMoq.Times.once()); + mockResourceTreeDataProvider1.verify((o) => o.getRootChildren(), TypeMoq.Times.once()); - mockResourceTreeDataProvider2.verify((o) => o.getChildren(), TypeMoq.Times.once()); + mockResourceTreeDataProvider2.verify((o) => o.getRootChildren(), TypeMoq.Times.once()); - const expectedChildren = await resourceService.listResourceProviderIds(); + const expectedResourceProviderIds = await resourceService.listResourceProviderIds(); should(children).Array(); - should(children.length).equal(expectedChildren.length); + should(children.length).equal(expectedResourceProviderIds.length, 'There should be one child for each resource provider'); for (const child of children) { should(child).instanceOf(AzureResourceResourceTreeNode); }