Simplify IAzureResourceTreeDataProvider (#20591)

This commit is contained in:
Charles Gagnon
2022-09-14 10:07:30 -07:00
committed by GitHub
parent 6c7d4a2f6b
commit 356f793078
19 changed files with 185 additions and 225 deletions

View File

@@ -60,21 +60,16 @@ export class AzureMonitorTreeDataProvider extends ResourceTreeDataProviderBase<a
}; };
} }
protected createContainerNode(): azureResource.IAzureResourceNode { public async getRootChildren(): Promise<TreeItem[]> {
return { return [{
account: undefined, id: AzureMonitorTreeDataProvider.containerId,
subscription: undefined, label: AzureMonitorTreeDataProvider.containerLabel,
tenantId: undefined, iconPath: {
treeItem: { dark: this._extensionContext.asAbsolutePath('resources/dark/folder_inverse.svg'),
id: AzureMonitorTreeDataProvider.containerId, light: this._extensionContext.asAbsolutePath('resources/light/folder.svg')
label: AzureMonitorTreeDataProvider.containerLabel, },
iconPath: { collapsibleState: TreeItemCollapsibleState.Collapsed,
dark: this._extensionContext.asAbsolutePath('resources/dark/folder_inverse.svg'), contextValue: AzureResourceItemType.databaseServerContainer
light: this._extensionContext.asAbsolutePath('resources/light/folder.svg') }];
},
collapsibleState: TreeItemCollapsibleState.Collapsed,
contextValue: AzureResourceItemType.databaseServerContainer
}
};
} }
} }

View File

@@ -59,21 +59,16 @@ export class CosmosDbMongoTreeDataProvider extends ResourceTreeDataProviderBase<
}; };
} }
protected createContainerNode(): azureResource.IAzureResourceNode { public async getRootChildren(): Promise<azdata.TreeItem[]> {
return { return [{
account: undefined, id: CosmosDbMongoTreeDataProvider.CONTAINER_ID,
subscription: undefined, label: CosmosDbMongoTreeDataProvider.CONTAINER_LABEL,
tenantId: undefined, iconPath: {
treeItem: { dark: this._extensionContext.asAbsolutePath('resources/dark/folder_inverse.svg'),
id: CosmosDbMongoTreeDataProvider.CONTAINER_ID, light: this._extensionContext.asAbsolutePath('resources/light/folder.svg')
label: CosmosDbMongoTreeDataProvider.CONTAINER_LABEL, },
iconPath: { collapsibleState: TreeItemCollapsibleState.Collapsed,
dark: this._extensionContext.asAbsolutePath('resources/dark/folder_inverse.svg'), contextValue: AzureResourceItemType.databaseServerContainer
light: this._extensionContext.asAbsolutePath('resources/light/folder.svg') }];
},
collapsibleState: TreeItemCollapsibleState.Collapsed,
contextValue: AzureResourceItemType.databaseServerContainer
}
};
} }
} }

View File

@@ -59,21 +59,16 @@ export class AzureResourceDatabaseTreeDataProvider extends ResourceTreeDataProvi
}; };
} }
protected createContainerNode(): azureResource.IAzureResourceNode { public async getRootChildren(): Promise<TreeItem[]> {
return { return [{
account: undefined, id: AzureResourceDatabaseTreeDataProvider.containerId,
subscription: undefined, label: AzureResourceDatabaseTreeDataProvider.containerLabel,
tenantId: undefined, iconPath: {
treeItem: { dark: this._extensionContext.asAbsolutePath('resources/dark/folder_inverse.svg'),
id: AzureResourceDatabaseTreeDataProvider.containerId, light: this._extensionContext.asAbsolutePath('resources/light/folder.svg')
label: AzureResourceDatabaseTreeDataProvider.containerLabel, },
iconPath: { collapsibleState: vscode.TreeItemCollapsibleState.Collapsed,
dark: this._extensionContext.asAbsolutePath('resources/dark/folder_inverse.svg'), contextValue: AzureResourceItemType.databaseContainer
light: this._extensionContext.asAbsolutePath('resources/light/folder.svg') }];
},
collapsibleState: vscode.TreeItemCollapsibleState.Collapsed,
contextValue: AzureResourceItemType.databaseContainer
}
};
} }
} }

View File

@@ -60,21 +60,16 @@ export class AzureResourceDatabaseServerTreeDataProvider extends ResourceTreeDat
}; };
} }
protected createContainerNode(): azureResource.IAzureResourceNode { public async getRootChildren(): Promise<TreeItem[]> {
return { return [{
account: undefined, id: AzureResourceDatabaseServerTreeDataProvider.containerId,
subscription: undefined, label: AzureResourceDatabaseServerTreeDataProvider.containerLabel,
tenantId: undefined, iconPath: {
treeItem: { dark: this._extensionContext.asAbsolutePath('resources/dark/folder_inverse.svg'),
id: AzureResourceDatabaseServerTreeDataProvider.containerId, light: this._extensionContext.asAbsolutePath('resources/light/folder.svg')
label: AzureResourceDatabaseServerTreeDataProvider.containerLabel, },
iconPath: { collapsibleState: vscode.TreeItemCollapsibleState.Collapsed,
dark: this._extensionContext.asAbsolutePath('resources/dark/folder_inverse.svg'), contextValue: AzureResourceItemType.databaseServerContainer
light: this._extensionContext.asAbsolutePath('resources/light/folder.svg') }];
},
collapsibleState: vscode.TreeItemCollapsibleState.Collapsed,
contextValue: AzureResourceItemType.databaseServerContainer
}
};
} }
} }

View File

@@ -60,21 +60,16 @@ export class KustoTreeDataProvider extends ResourceTreeDataProviderBase<azureRes
}; };
} }
protected createContainerNode(): azureResource.IAzureResourceNode { public async getRootChildren(): Promise<TreeItem[]> {
return { return [{
account: undefined, id: KustoTreeDataProvider.containerId,
subscription: undefined, label: KustoTreeDataProvider.containerLabel,
tenantId: undefined, iconPath: {
treeItem: { dark: this._extensionContext.asAbsolutePath('resources/dark/folder_inverse.svg'),
id: KustoTreeDataProvider.containerId, light: this._extensionContext.asAbsolutePath('resources/light/folder.svg')
label: KustoTreeDataProvider.containerLabel, },
iconPath: { collapsibleState: TreeItemCollapsibleState.Collapsed,
dark: this._extensionContext.asAbsolutePath('resources/dark/folder_inverse.svg'), contextValue: AzureResourceItemType.databaseServerContainer
light: this._extensionContext.asAbsolutePath('resources/light/folder.svg') }];
},
collapsibleState: TreeItemCollapsibleState.Collapsed,
contextValue: AzureResourceItemType.databaseServerContainer
}
};
} }
} }

View File

@@ -61,21 +61,16 @@ export class MysqlFlexibleServerTreeDataProvider extends ResourceTreeDataProvide
}; };
} }
protected createContainerNode(): azureResource.IAzureResourceNode { public async getRootChildren(): Promise<TreeItem[]> {
return { return [{
account: undefined, id: MysqlFlexibleServerTreeDataProvider.CONTAINER_ID,
subscription: undefined, label: MysqlFlexibleServerTreeDataProvider.CONTAINER_LABEL,
tenantId: undefined, iconPath: {
treeItem: { dark: this._extensionContext.asAbsolutePath('resources/dark/folder_inverse.svg'),
id: MysqlFlexibleServerTreeDataProvider.CONTAINER_ID, light: this._extensionContext.asAbsolutePath('resources/light/folder.svg')
label: MysqlFlexibleServerTreeDataProvider.CONTAINER_LABEL, },
iconPath: { collapsibleState: TreeItemCollapsibleState.Collapsed,
dark: this._extensionContext.asAbsolutePath('resources/dark/folder_inverse.svg'), contextValue: AzureResourceItemType.databaseServerContainer
light: this._extensionContext.asAbsolutePath('resources/light/folder.svg') }];
},
collapsibleState: TreeItemCollapsibleState.Collapsed,
contextValue: AzureResourceItemType.databaseServerContainer
}
};
} }
} }

View File

@@ -63,21 +63,16 @@ export class PostgresServerArcTreeDataProvider extends ResourceTreeDataProviderB
}; };
} }
protected createContainerNode(): azureResource.IAzureResourceNode { public async getRootChildren(): Promise<TreeItem[]> {
return { return [{
account: undefined, id: PostgresServerArcTreeDataProvider.containerId,
subscription: undefined, label: PostgresServerArcTreeDataProvider.containerLabel,
tenantId: undefined, iconPath: {
treeItem: { dark: this._extensionContext.asAbsolutePath('resources/dark/folder_inverse.svg'),
id: PostgresServerArcTreeDataProvider.containerId, light: this._extensionContext.asAbsolutePath('resources/light/folder.svg')
label: PostgresServerArcTreeDataProvider.containerLabel, },
iconPath: { collapsibleState: TreeItemCollapsibleState.Collapsed,
dark: this._extensionContext.asAbsolutePath('resources/dark/folder_inverse.svg'), contextValue: AzureResourceItemType.databaseServerContainer
light: this._extensionContext.asAbsolutePath('resources/light/folder.svg') }];
},
collapsibleState: TreeItemCollapsibleState.Collapsed,
contextValue: AzureResourceItemType.databaseServerContainer
}
};
} }
} }

View File

@@ -63,21 +63,16 @@ export class PostgresServerTreeDataProvider extends ResourceTreeDataProviderBase
}; };
} }
protected createContainerNode(): azureResource.IAzureResourceNode { public async getRootChildren(): Promise<TreeItem[]> {
return { return [{
account: undefined, id: PostgresServerTreeDataProvider.containerId,
subscription: undefined, label: PostgresServerTreeDataProvider.containerLabel,
tenantId: undefined, iconPath: {
treeItem: { dark: this._extensionContext.asAbsolutePath('resources/dark/folder_inverse.svg'),
id: PostgresServerTreeDataProvider.containerId, light: this._extensionContext.asAbsolutePath('resources/light/folder.svg')
label: PostgresServerTreeDataProvider.containerLabel, },
iconPath: { collapsibleState: TreeItemCollapsibleState.Collapsed,
dark: this._extensionContext.asAbsolutePath('resources/dark/folder_inverse.svg'), contextValue: AzureResourceItemType.databaseServerContainer
light: this._extensionContext.asAbsolutePath('resources/light/folder.svg') }];
},
collapsibleState: TreeItemCollapsibleState.Collapsed,
contextValue: AzureResourceItemType.databaseServerContainer
}
};
} }
} }

View File

@@ -17,16 +17,12 @@ export abstract class ResourceTreeDataProviderBase<T extends azureResource.Azure
public constructor(protected _resourceService: IAzureResourceService<T>) { public constructor(protected _resourceService: IAzureResourceService<T>) {
} }
public getTreeItem(element: azureResource.IAzureResourceNode): azdata.TreeItem | Thenable<azdata.TreeItem> { public async getResourceTreeItem(element: azureResource.IAzureResourceNode): Promise<azdata.TreeItem> {
return element.treeItem; return element.treeItem;
} }
public async getChildren(element?: azureResource.IAzureResourceNode): Promise<azureResource.IAzureResourceNode[]> { public async getChildren(element: azureResource.IAzureResourceNode): Promise<azureResource.IAzureResourceNode[]> {
try { try {
if (!element) {
return [this.createContainerNode()];
}
let resources: T[] = await this.getResources(element); let resources: T[] = await this.getResources(element);
return resources.map((resource) => <azureResource.IAzureResourceNode>{ return resources.map((resource) => <azureResource.IAzureResourceNode>{
@@ -51,7 +47,7 @@ export abstract class ResourceTreeDataProviderBase<T extends azureResource.Azure
protected abstract getTreeItemForResource(resource: T, account: AzureAccount): azdata.TreeItem; protected abstract getTreeItemForResource(resource: T, account: AzureAccount): azdata.TreeItem;
protected abstract createContainerNode(): azureResource.IAzureResourceNode; public abstract getRootChildren(): Promise<azdata.TreeItem[]>;
} }
export interface GraphData { export interface GraphData {

View File

@@ -60,21 +60,16 @@ export class SqlInstanceTreeDataProvider extends ResourceTreeDataProviderBase<az
}; };
} }
protected createContainerNode(): azureResource.IAzureResourceNode { public async getRootChildren(): Promise<TreeItem[]> {
return { return [{
account: undefined, id: SqlInstanceTreeDataProvider.containerId,
subscription: undefined, label: SqlInstanceTreeDataProvider.containerLabel,
tenantId: undefined, iconPath: {
treeItem: { dark: this._extensionContext.asAbsolutePath('resources/dark/folder_inverse.svg'),
id: SqlInstanceTreeDataProvider.containerId, light: this._extensionContext.asAbsolutePath('resources/light/folder.svg')
label: SqlInstanceTreeDataProvider.containerLabel, },
iconPath: { collapsibleState: TreeItemCollapsibleState.Collapsed,
dark: this._extensionContext.asAbsolutePath('resources/dark/folder_inverse.svg'), contextValue: AzureResourceItemType.databaseServerContainer
light: this._extensionContext.asAbsolutePath('resources/light/folder.svg') }];
},
collapsibleState: TreeItemCollapsibleState.Collapsed,
contextValue: AzureResourceItemType.databaseServerContainer
}
};
} }
} }

View File

@@ -60,21 +60,16 @@ export class SqlInstanceArcTreeDataProvider extends ResourceTreeDataProviderBase
}; };
} }
protected createContainerNode(): azureResource.IAzureResourceNode { public async getRootChildren(): Promise<TreeItem[]> {
return { return [{
account: undefined, id: SqlInstanceArcTreeDataProvider.containerId,
subscription: undefined, label: SqlInstanceArcTreeDataProvider.containerLabel,
tenantId: undefined, iconPath: {
treeItem: { dark: this._extensionContext.asAbsolutePath('resources/dark/folder_inverse.svg'),
id: SqlInstanceArcTreeDataProvider.containerId, light: this._extensionContext.asAbsolutePath('resources/light/folder.svg')
label: SqlInstanceArcTreeDataProvider.containerLabel, },
iconPath: { collapsibleState: TreeItemCollapsibleState.Collapsed,
dark: this._extensionContext.asAbsolutePath('resources/dark/folder_inverse.svg'), contextValue: AzureResourceItemType.databaseServerContainer
light: this._extensionContext.asAbsolutePath('resources/light/folder.svg') }];
},
collapsibleState: TreeItemCollapsibleState.Collapsed,
contextValue: AzureResourceItemType.databaseServerContainer
}
};
} }
} }

View File

@@ -32,7 +32,7 @@ export class AzureResourceService {
this._areResourceProvidersLoaded = false; this._areResourceProvidersLoaded = false;
} }
public async getRootChildren(resourceProviderId: string, account: AzureAccount, subscription: azureResource.AzureResourceSubscription, tenatId: string): Promise<IAzureResourceNodeWithProviderId[]> { public async getRootChildren(resourceProviderId: string, account: AzureAccount, subscription: azureResource.AzureResourceSubscription, tenantId: string): Promise<IAzureResourceNodeWithProviderId[]> {
await this.ensureResourceProvidersRegistered(); await this.ensureResourceProvidersRegistered();
if (!(resourceProviderId in this._resourceProviders)) { if (!(resourceProviderId in this._resourceProviders)) {
@@ -40,16 +40,18 @@ export class AzureResourceService {
} }
const treeDataProvider = this._treeDataProviders[resourceProviderId]; const treeDataProvider = this._treeDataProviders[resourceProviderId];
const children = await treeDataProvider.getChildren(); const rootChildren = await treeDataProvider.getRootChildren();
return children.map((child) => <IAzureResourceNodeWithProviderId>{ return rootChildren.map(rootChild => {
resourceProviderId: resourceProviderId, return {
resourceNode: <azureResource.IAzureResourceNode>{ resourceProviderId,
account: account, resourceNode: {
subscription: subscription, account,
tenantId: tenatId, subscription,
treeItem: child.treeItem tenantId,
} treeItem: rootChild
}
};
}); });
} }
@@ -70,7 +72,7 @@ export class AzureResourceService {
}); });
} }
public async getTreeItem(resourceProviderId: string, element?: azureResource.IAzureResourceNode): Promise<TreeItem> { public async getTreeItem(resourceProviderId: string, element: azureResource.IAzureResourceNode): Promise<TreeItem> {
await this.ensureResourceProvidersRegistered(); await this.ensureResourceProvidersRegistered();
if (!(resourceProviderId in this._resourceProviders)) { if (!(resourceProviderId in this._resourceProviders)) {
@@ -78,7 +80,7 @@ export class AzureResourceService {
} }
const treeDataProvider = this._treeDataProviders[resourceProviderId]; const treeDataProvider = this._treeDataProviders[resourceProviderId];
return treeDataProvider.getTreeItem(element); return treeDataProvider.getResourceTreeItem(element);
} }
public get areResourceProvidersLoaded(): boolean { public get areResourceProvidersLoaded(): boolean {

View File

@@ -24,14 +24,14 @@ export class AzureResourceSubscriptionTreeNode extends AzureResourceContainerTre
public constructor( public constructor(
public readonly account: AzureAccount, public readonly account: AzureAccount,
public readonly subscription: azureResource.AzureResourceSubscription, public readonly subscription: azureResource.AzureResourceSubscription,
public readonly tenatId: string, public readonly tenantId: string,
appContext: AppContext, appContext: AppContext,
treeChangeHandler: IAzureResourceTreeChangeHandler, treeChangeHandler: IAzureResourceTreeChangeHandler,
parent: TreeNode parent: TreeNode
) { ) {
super(appContext, treeChangeHandler, parent); 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`); this.setCacheKey(`${this._id}.resources`);
} }
@@ -42,7 +42,7 @@ export class AzureResourceSubscriptionTreeNode extends AzureResourceContainerTre
const children: IAzureResourceNodeWithProviderId[] = []; const children: IAzureResourceNodeWithProviderId[] = [];
for (const resourceProviderId of await resourceService.listResourceProviderIds()) { 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) { if (children.length === 0) {

View File

@@ -355,7 +355,22 @@ declare module 'azurecore' {
getTreeDataProvider(): IAzureResourceTreeDataProvider; getTreeDataProvider(): IAzureResourceTreeDataProvider;
} }
export interface IAzureResourceTreeDataProvider extends TreeDataProvider<IAzureResourceNode> { 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<azdata.TreeItem[]>;
/**
* Gets the children for a given {@link IAzureResourceNode}
* @param element The parent node to get the children for
*/
getChildren(element: IAzureResourceNode): Promise<IAzureResourceNode[]>;
/**
* 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<azdata.TreeItem>;
browseConnectionMode: boolean; browseConnectionMode: boolean;
} }

View File

@@ -104,7 +104,7 @@ describe('AzureResourceDatabaseTreeDataProvider.info', function (): void {
it('Should be correct when created.', async function (): Promise<void> { it('Should be correct when created.', async function (): Promise<void> {
const treeDataProvider = new AzureResourceDatabaseTreeDataProvider(mockDatabaseService.object, mockExtensionContext.object); 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.id).equal(mockResourceRootNode.treeItem.id);
should(treeItem.label).equal(mockResourceRootNode.treeItem.label); should(treeItem.label).equal(mockResourceRootNode.treeItem.label);
should(treeItem.collapsibleState).equal(mockResourceRootNode.treeItem.collapsibleState); 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<void> { it('Should return container node when element is undefined.', async function (): Promise<void> {
const treeDataProvider = new AzureResourceDatabaseTreeDataProvider(mockDatabaseService.object, mockExtensionContext.object); const treeDataProvider = new AzureResourceDatabaseTreeDataProvider(mockDatabaseService.object, mockExtensionContext.object);
const children = await treeDataProvider.getChildren(); const children = await treeDataProvider.getRootChildren();
should(children).Array(); should(children).Array();
should(children.length).equal(1); should(children.length).equal(1);
const child = children[0]; const child = children[0];
should(child.account).undefined(); should(child.id).equal('azure.resource.providers.database.treeDataProvider.databaseContainer');
should(child.subscription).undefined(); should(child.label).equal('SQL database');
should(child.tenantId).undefined(); should(child.collapsibleState).equal(vscode.TreeItemCollapsibleState.Collapsed);
should(child.treeItem.id).equal('azure.resource.providers.database.treeDataProvider.databaseContainer'); should(child.contextValue).equal('azure.resource.itemType.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');
}); });
it('Should return resource nodes when it is container node.', async function (): Promise<void> { it('Should return resource nodes when it is container node.', async function (): Promise<void> {

View File

@@ -103,7 +103,7 @@ describe('AzureResourceDatabaseServerTreeDataProvider.info', function (): void {
it('Should be correct when created.', async function (): Promise<void> { it('Should be correct when created.', async function (): Promise<void> {
const treeDataProvider = new AzureResourceDatabaseServerTreeDataProvider(mockDatabaseServerService.object, mockExtensionContext.object); 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.id).equal(mockResourceRootNode.treeItem.id);
should(treeItem.label).equal(mockResourceRootNode.treeItem.label); should(treeItem.label).equal(mockResourceRootNode.treeItem.label);
should(treeItem.collapsibleState).equal(mockResourceRootNode.treeItem.collapsibleState); 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<void> { it('Should return container node when element is undefined.', async function (): Promise<void> {
const treeDataProvider = new AzureResourceDatabaseServerTreeDataProvider(mockDatabaseServerService.object, mockExtensionContext.object); const treeDataProvider = new AzureResourceDatabaseServerTreeDataProvider(mockDatabaseServerService.object, mockExtensionContext.object);
const children = await treeDataProvider.getChildren(); const children = await treeDataProvider.getRootChildren();
should(children).Array(); should(children).Array();
should(children.length).equal(1); should(children.length).equal(1);
const child = children[0]; const child = children[0];
should(child.account).undefined(); should(child.id).equal('azure.resource.providers.databaseServer.treeDataProvider.databaseServerContainer');
should(child.subscription).undefined(); should(child.label).equal('SQL server');
should(child.tenantId).undefined(); should(child.collapsibleState).equal(vscode.TreeItemCollapsibleState.Collapsed);
should(child.treeItem.id).equal('azure.resource.providers.databaseServer.treeDataProvider.databaseServerContainer'); should(child.contextValue).equal('azure.resource.itemType.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');
}); });
it('Should return resource nodes when it is container node.', async function (): Promise<void> { it('Should return resource nodes when it is container node.', async function (): Promise<void> {

View File

@@ -7,6 +7,7 @@ import * as should from 'should';
import * as TypeMoq from 'typemoq'; import * as TypeMoq from 'typemoq';
import 'mocha'; import 'mocha';
import { fail } from 'assert'; import { fail } from 'assert';
import * as azdata from 'azdata';
import { AzureResourceService } from '../../azureResource/resourceService'; import { AzureResourceService } from '../../azureResource/resourceService';
import { AzureAccount, azureResource } from 'azurecore'; import { AzureAccount, azureResource } from 'azurecore';
@@ -52,15 +53,15 @@ let resourceService: AzureResourceService;
describe('AzureResourceService.listResourceProviderIds', function(): void { describe('AzureResourceService.listResourceProviderIds', function(): void {
beforeEach(() => { beforeEach(() => {
mockResourceTreeDataProvider1 = TypeMoq.Mock.ofType<azureResource.IAzureResourceTreeDataProvider>(); mockResourceTreeDataProvider1 = TypeMoq.Mock.ofType<azureResource.IAzureResourceTreeDataProvider>();
mockResourceTreeDataProvider1.setup((o) => o.getChildren()).returns(() => Promise.resolve([TypeMoq.Mock.ofType<azureResource.IAzureResourceNode>().object])); mockResourceTreeDataProvider1.setup((o) => o.getRootChildren()).returns(() => Promise.resolve([TypeMoq.Mock.ofType<azdata.TreeItem>().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<azureResource.IAzureResourceProvider>(); mockResourceProvider1 = TypeMoq.Mock.ofType<azureResource.IAzureResourceProvider>();
mockResourceProvider1.setup((o) => o.providerId).returns(() => 'mockResourceProvider1'); mockResourceProvider1.setup((o) => o.providerId).returns(() => 'mockResourceProvider1');
mockResourceProvider1.setup((o) => o.getTreeDataProvider()).returns(() => mockResourceTreeDataProvider1.object); mockResourceProvider1.setup((o) => o.getTreeDataProvider()).returns(() => mockResourceTreeDataProvider1.object);
mockResourceTreeDataProvider2 = TypeMoq.Mock.ofType<azureResource.IAzureResourceTreeDataProvider>(); mockResourceTreeDataProvider2 = TypeMoq.Mock.ofType<azureResource.IAzureResourceTreeDataProvider>();
mockResourceTreeDataProvider2.setup((o) => o.getChildren()).returns(() => Promise.resolve([TypeMoq.Mock.ofType<azureResource.IAzureResourceNode>().object])); mockResourceTreeDataProvider2.setup((o) => o.getRootChildren()).returns(() => Promise.resolve([TypeMoq.Mock.ofType<azdata.TreeItem>().object]));
mockResourceTreeDataProvider2.setup((o) => o.getTreeItem(TypeMoq.It.isAny())).returns(() => Promise.resolve(TypeMoq.It.isAny())); mockResourceTreeDataProvider2.setup((o) => o.getResourceTreeItem(TypeMoq.It.isAny())).returns(() => Promise.resolve(TypeMoq.It.isAny()));
mockResourceProvider2 = TypeMoq.Mock.ofType<azureResource.IAzureResourceProvider>(); mockResourceProvider2 = TypeMoq.Mock.ofType<azureResource.IAzureResourceProvider>();
mockResourceProvider2.setup((o) => o.providerId).returns(() => 'mockResourceProvider2'); mockResourceProvider2.setup((o) => o.providerId).returns(() => 'mockResourceProvider2');
mockResourceProvider2.setup((o) => o.getTreeDataProvider()).returns(() => mockResourceTreeDataProvider2.object); mockResourceProvider2.setup((o) => o.getTreeDataProvider()).returns(() => mockResourceTreeDataProvider2.object);
@@ -89,8 +90,8 @@ describe('AzureResourceService.listResourceProviderIds', function(): void {
describe('AzureResourceService.getRootChildren', function(): void { describe('AzureResourceService.getRootChildren', function(): void {
beforeEach(() => { beforeEach(() => {
mockResourceTreeDataProvider1 = TypeMoq.Mock.ofType<azureResource.IAzureResourceTreeDataProvider>(); mockResourceTreeDataProvider1 = TypeMoq.Mock.ofType<azureResource.IAzureResourceTreeDataProvider>();
mockResourceTreeDataProvider1.setup((o) => o.getChildren()).returns(() => Promise.resolve([TypeMoq.Mock.ofType<azureResource.IAzureResourceNode>().object])); mockResourceTreeDataProvider1.setup((o) => o.getRootChildren()).returns(() => Promise.resolve([TypeMoq.Mock.ofType<azdata.TreeItem>().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<azureResource.IAzureResourceProvider>(); mockResourceProvider1 = TypeMoq.Mock.ofType<azureResource.IAzureResourceProvider>();
mockResourceProvider1.setup((o) => o.providerId).returns(() => 'mockResourceProvider1'); mockResourceProvider1.setup((o) => o.providerId).returns(() => 'mockResourceProvider1');
mockResourceProvider1.setup((o) => o.getTreeDataProvider()).returns(() => mockResourceTreeDataProvider1.object); mockResourceProvider1.setup((o) => o.getTreeDataProvider()).returns(() => mockResourceTreeDataProvider1.object);
@@ -122,9 +123,9 @@ describe('AzureResourceService.getRootChildren', function(): void {
describe('AzureResourceService.getChildren', function(): void { describe('AzureResourceService.getChildren', function(): void {
beforeEach(() => { beforeEach(() => {
mockResourceTreeDataProvider1 = TypeMoq.Mock.ofType<azureResource.IAzureResourceTreeDataProvider>(); mockResourceTreeDataProvider1 = TypeMoq.Mock.ofType<azureResource.IAzureResourceTreeDataProvider>();
mockResourceTreeDataProvider1.setup((o) => o.getChildren()).returns(() => Promise.resolve([TypeMoq.Mock.ofType<azureResource.IAzureResourceNode>().object])); mockResourceTreeDataProvider1.setup((o) => o.getRootChildren()).returns(() => Promise.resolve([TypeMoq.Mock.ofType<azdata.TreeItem>().object]));
mockResourceTreeDataProvider1.setup((o) => o.getChildren(TypeMoq.It.isAny())).returns(() => Promise.resolve([TypeMoq.Mock.ofType<azureResource.IAzureResourceNode>().object])); mockResourceTreeDataProvider1.setup((o) => o.getChildren(TypeMoq.It.isAny())).returns(() => Promise.resolve([TypeMoq.Mock.ofType<azureResource.IAzureResourceNode>().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<azureResource.IAzureResourceProvider>(); mockResourceProvider1 = TypeMoq.Mock.ofType<azureResource.IAzureResourceProvider>();
mockResourceProvider1.setup((o) => o.providerId).returns(() => 'mockResourceProvider1'); mockResourceProvider1.setup((o) => o.providerId).returns(() => 'mockResourceProvider1');
mockResourceProvider1.setup((o) => o.getTreeDataProvider()).returns(() => mockResourceTreeDataProvider1.object); mockResourceProvider1.setup((o) => o.getTreeDataProvider()).returns(() => mockResourceTreeDataProvider1.object);
@@ -155,9 +156,9 @@ describe('AzureResourceService.getChildren', function(): void {
describe('AzureResourceService.getTreeItem', function(): void { describe('AzureResourceService.getTreeItem', function(): void {
beforeEach(() => { beforeEach(() => {
mockResourceTreeDataProvider1 = TypeMoq.Mock.ofType<azureResource.IAzureResourceTreeDataProvider>(); mockResourceTreeDataProvider1 = TypeMoq.Mock.ofType<azureResource.IAzureResourceTreeDataProvider>();
mockResourceTreeDataProvider1.setup((o) => o.getChildren()).returns(() => Promise.resolve([TypeMoq.Mock.ofType<azureResource.IAzureResourceNode>().object])); mockResourceTreeDataProvider1.setup((o) => o.getRootChildren()).returns(() => Promise.resolve([TypeMoq.Mock.ofType<azdata.TreeItem>().object]));
mockResourceTreeDataProvider1.setup((o) => o.getChildren(TypeMoq.It.isAny())).returns(() => Promise.resolve([TypeMoq.Mock.ofType<azureResource.IAzureResourceNode>().object])); mockResourceTreeDataProvider1.setup((o) => o.getChildren(TypeMoq.It.isAny())).returns(() => Promise.resolve([TypeMoq.Mock.ofType<azureResource.IAzureResourceNode>().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<azureResource.IAzureResourceProvider>(); mockResourceProvider1 = TypeMoq.Mock.ofType<azureResource.IAzureResourceProvider>();
mockResourceProvider1.setup((o) => o.providerId).returns(() => 'mockResourceProvider1'); mockResourceProvider1.setup((o) => o.providerId).returns(() => 'mockResourceProvider1');
mockResourceProvider1.setup((o) => o.getTreeDataProvider()).returns(() => mockResourceTreeDataProvider1.object); mockResourceProvider1.setup((o) => o.getTreeDataProvider()).returns(() => mockResourceTreeDataProvider1.object);

View File

@@ -96,7 +96,7 @@ let appContext: AppContext;
describe('AzureResourceResourceTreeNode.info', function (): void { describe('AzureResourceResourceTreeNode.info', function (): void {
beforeEach(() => { beforeEach(() => {
mockResourceTreeDataProvider = TypeMoq.Mock.ofType<azureResource.IAzureResourceTreeDataProvider>(); mockResourceTreeDataProvider = TypeMoq.Mock.ofType<azureResource.IAzureResourceTreeDataProvider>();
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)); mockResourceTreeDataProvider.setup((o) => o.getChildren(mockResourceRootNode)).returns(() => Promise.resolve(mockResourceNodes));
mockResourceProvider = TypeMoq.Mock.ofType<azureResource.IAzureResourceProvider>(); mockResourceProvider = TypeMoq.Mock.ofType<azureResource.IAzureResourceProvider>();
@@ -190,7 +190,7 @@ describe('AzureResourceResourceTreeNode.getChildren', function (): void {
const children = await resourceTreeNode.getChildren(); 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).Array();
should(children.length).equal(0); should(children.length).equal(0);

View File

@@ -6,6 +6,7 @@
import * as should from 'should'; import * as should from 'should';
import * as TypeMoq from 'typemoq'; import * as TypeMoq from 'typemoq';
import * as vscode from 'vscode'; import * as vscode from 'vscode';
import * as azdata from 'azdata';
import 'mocha'; import 'mocha';
import { AppContext } from '../../../appContext'; import { AppContext } from '../../../appContext';
@@ -69,15 +70,15 @@ describe('AzureResourceSubscriptionTreeNode.info', function(): void {
mockTreeChangeHandler = TypeMoq.Mock.ofType<IAzureResourceTreeChangeHandler>(); mockTreeChangeHandler = TypeMoq.Mock.ofType<IAzureResourceTreeChangeHandler>();
mockResourceTreeDataProvider1 = TypeMoq.Mock.ofType<azureResource.IAzureResourceTreeDataProvider>(); mockResourceTreeDataProvider1 = TypeMoq.Mock.ofType<azureResource.IAzureResourceTreeDataProvider>();
mockResourceTreeDataProvider1.setup((o) => o.getChildren()).returns(() => Promise.resolve([TypeMoq.Mock.ofType<azureResource.IAzureResourceNode>().object])); mockResourceTreeDataProvider1.setup((o) => o.getRootChildren()).returns(() => Promise.resolve([TypeMoq.Mock.ofType<azdata.TreeItem>().object]));
mockResourceTreeDataProvider1.setup((o) => o.getTreeItem(TypeMoq.It.isAny())).returns(() => Promise.resolve(TypeMoq.It.isAny())); mockResourceTreeDataProvider1.setup((x: any) => x.then).returns(() => undefined);
mockResourceProvider1 = TypeMoq.Mock.ofType<azureResource.IAzureResourceProvider>(); mockResourceProvider1 = TypeMoq.Mock.ofType<azureResource.IAzureResourceProvider>();
mockResourceProvider1.setup((o) => o.providerId).returns(() => 'mockResourceProvider1'); mockResourceProvider1.setup((o) => o.providerId).returns(() => 'mockResourceProvider1');
mockResourceProvider1.setup((o) => o.getTreeDataProvider()).returns(() => mockResourceTreeDataProvider1.object); mockResourceProvider1.setup((o) => o.getTreeDataProvider()).returns(() => mockResourceTreeDataProvider1.object);
mockResourceTreeDataProvider2 = TypeMoq.Mock.ofType<azureResource.IAzureResourceTreeDataProvider>(); mockResourceTreeDataProvider2 = TypeMoq.Mock.ofType<azureResource.IAzureResourceTreeDataProvider>();
mockResourceTreeDataProvider2.setup((o) => o.getChildren()).returns(() => Promise.resolve([TypeMoq.Mock.ofType<azureResource.IAzureResourceNode>().object])); mockResourceTreeDataProvider2.setup((o) => o.getRootChildren()).returns(() => Promise.resolve([TypeMoq.Mock.ofType<azdata.TreeItem>().object]));
mockResourceTreeDataProvider2.setup((o) => o.getTreeItem(TypeMoq.It.isAny())).returns(() => Promise.resolve(TypeMoq.It.isAny())); mockResourceTreeDataProvider2.setup((x: any) => x.then).returns(() => undefined);
mockResourceProvider2 = TypeMoq.Mock.ofType<azureResource.IAzureResourceProvider>(); mockResourceProvider2 = TypeMoq.Mock.ofType<azureResource.IAzureResourceProvider>();
mockResourceProvider2.setup((o) => o.providerId).returns(() => 'mockResourceProvider2'); mockResourceProvider2.setup((o) => o.providerId).returns(() => 'mockResourceProvider2');
mockResourceProvider2.setup((o) => o.getTreeDataProvider()).returns(() => mockResourceTreeDataProvider2.object); mockResourceProvider2.setup((o) => o.getTreeDataProvider()).returns(() => mockResourceTreeDataProvider2.object);
@@ -121,15 +122,16 @@ describe('AzureResourceSubscriptionTreeNode.getChildren', function(): void {
mockTreeChangeHandler = TypeMoq.Mock.ofType<IAzureResourceTreeChangeHandler>(); mockTreeChangeHandler = TypeMoq.Mock.ofType<IAzureResourceTreeChangeHandler>();
mockResourceTreeDataProvider1 = TypeMoq.Mock.ofType<azureResource.IAzureResourceTreeDataProvider>(); mockResourceTreeDataProvider1 = TypeMoq.Mock.ofType<azureResource.IAzureResourceTreeDataProvider>();
mockResourceTreeDataProvider1.setup((o) => o.getChildren()).returns(() => Promise.resolve([TypeMoq.Mock.ofType<azureResource.IAzureResourceNode>().object])); mockResourceTreeDataProvider1.setup((o) => o.getRootChildren()).returns(() => Promise.resolve([{ label: 'Item1'}] as azdata.TreeItem[]));
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<azureResource.IAzureResourceProvider>(); mockResourceProvider1 = TypeMoq.Mock.ofType<azureResource.IAzureResourceProvider>();
mockResourceProvider1.setup((o) => o.providerId).returns(() => 'mockResourceProvider1'); mockResourceProvider1.setup((o) => o.providerId).returns(() => 'mockResourceProvider1');
mockResourceProvider1.setup((o) => o.getTreeDataProvider()).returns(() => mockResourceTreeDataProvider1.object); mockResourceProvider1.setup((o) => o.getTreeDataProvider()).returns(() => mockResourceTreeDataProvider1.object);
mockResourceTreeDataProvider2 = TypeMoq.Mock.ofType<azureResource.IAzureResourceTreeDataProvider>(); mockResourceTreeDataProvider2 = TypeMoq.Mock.ofType<azureResource.IAzureResourceTreeDataProvider>();
mockResourceTreeDataProvider2.setup((o) => o.getChildren()).returns(() => Promise.resolve([TypeMoq.Mock.ofType<azureResource.IAzureResourceNode>().object])); mockResourceTreeDataProvider2.setup((o) => o.getRootChildren()).returns(() => Promise.resolve([{ label: 'Item2' }] as azdata.TreeItem[]));
mockResourceTreeDataProvider2.setup((o) => o.getTreeItem(TypeMoq.It.isAny())).returns(() => Promise.resolve(TypeMoq.It.isAny())); mockResourceTreeDataProvider2.setup((o) => o.getResourceTreeItem(TypeMoq.It.isAny())).returns(() => Promise.resolve(TypeMoq.It.isAny()));
mockResourceProvider2 = TypeMoq.Mock.ofType<azureResource.IAzureResourceProvider>(); mockResourceProvider2 = TypeMoq.Mock.ofType<azureResource.IAzureResourceProvider>();
mockResourceProvider2.setup((o) => o.providerId).returns(() => 'mockResourceProvider2'); mockResourceProvider2.setup((o) => o.providerId).returns(() => 'mockResourceProvider2');
mockResourceProvider2.setup((o) => o.getTreeDataProvider()).returns(() => mockResourceTreeDataProvider2.object); 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 subscriptionTreeNode = new AzureResourceSubscriptionTreeNode(mockAccount, mockSubscription, mockTenantId, appContext, mockTreeChangeHandler.object, undefined);
const children = await subscriptionTreeNode.getChildren(); 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).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) { for (const child of children) {
should(child).instanceOf(AzureResourceResourceTreeNode); should(child).instanceOf(AzureResourceResourceTreeNode);
} }