|
|
|
|
@@ -17,7 +17,6 @@ import {
|
|
|
|
|
IAzureResourceCacheService,
|
|
|
|
|
IAzureResourceSubscriptionService,
|
|
|
|
|
IAzureResourceSubscriptionFilterService,
|
|
|
|
|
IAzureResourceTenantService
|
|
|
|
|
} from '../../../azureResource/interfaces';
|
|
|
|
|
import { IAzureResourceTreeChangeHandler } from '../../../azureResource/tree/treeChangeHandler';
|
|
|
|
|
import { AzureResourceAccountTreeNode } from '../../../azureResource/tree/accountTreeNode';
|
|
|
|
|
@@ -31,7 +30,6 @@ let mockExtensionContext: TypeMoq.IMock<vscode.ExtensionContext>;
|
|
|
|
|
let mockCacheService: TypeMoq.IMock<IAzureResourceCacheService>;
|
|
|
|
|
let mockSubscriptionService: TypeMoq.IMock<IAzureResourceSubscriptionService>;
|
|
|
|
|
let mockSubscriptionFilterService: TypeMoq.IMock<IAzureResourceSubscriptionFilterService>;
|
|
|
|
|
let mockTenantService: TypeMoq.IMock<IAzureResourceTenantService>;
|
|
|
|
|
let mockAppContext: AppContext;
|
|
|
|
|
let getSecurityTokenStub: sinon.SinonStub;
|
|
|
|
|
let mockTreeChangeHandler: TypeMoq.IMock<IAzureResourceTreeChangeHandler>;
|
|
|
|
|
@@ -63,28 +61,27 @@ const mockAccount: azdata.Account = {
|
|
|
|
|
|
|
|
|
|
const mockSubscription1: azureResource.AzureResourceSubscription = {
|
|
|
|
|
id: 'mock_subscription_1',
|
|
|
|
|
name: 'mock subscription 1'
|
|
|
|
|
name: 'mock subscription 1',
|
|
|
|
|
tenant: mockTenantId
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
const mockSubscription2: azureResource.AzureResourceSubscription = {
|
|
|
|
|
id: 'mock_subscription_2',
|
|
|
|
|
name: 'mock subscription 2'
|
|
|
|
|
name: 'mock subscription 2',
|
|
|
|
|
tenant: mockTenantId
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
const mockSubscriptions = [mockSubscription1, mockSubscription2];
|
|
|
|
|
|
|
|
|
|
const mockFilteredSubscriptions = [mockSubscription1];
|
|
|
|
|
|
|
|
|
|
const mockTokens: { [key: string]: any } = {};
|
|
|
|
|
const mockToken = {
|
|
|
|
|
token: 'mock_token',
|
|
|
|
|
tokenType: 'Bearer'
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
[mockSubscription1.id, mockSubscription2.id, mockTenantId].forEach(s => {
|
|
|
|
|
mockTokens[s] = {
|
|
|
|
|
token: 'mock_token',
|
|
|
|
|
tokenType: 'Bearer'
|
|
|
|
|
};
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
const mockCredential = new TokenCredentials(mockTokens[mockTenantId].token, mockTokens[mockTenantId].tokenType);
|
|
|
|
|
const mockCredential = new TokenCredentials(mockToken.token, mockToken.tokenType);
|
|
|
|
|
|
|
|
|
|
let mockSubscriptionCache: azureResource.AzureResourceSubscription[] = [];
|
|
|
|
|
|
|
|
|
|
@@ -94,7 +91,6 @@ describe('AzureResourceAccountTreeNode.info', function (): void {
|
|
|
|
|
mockCacheService = TypeMoq.Mock.ofType<IAzureResourceCacheService>();
|
|
|
|
|
mockSubscriptionService = TypeMoq.Mock.ofType<IAzureResourceSubscriptionService>();
|
|
|
|
|
mockSubscriptionFilterService = TypeMoq.Mock.ofType<IAzureResourceSubscriptionFilterService>();
|
|
|
|
|
mockTenantService = TypeMoq.Mock.ofType<IAzureResourceTenantService>();
|
|
|
|
|
|
|
|
|
|
mockTreeChangeHandler = TypeMoq.Mock.ofType<IAzureResourceTreeChangeHandler>();
|
|
|
|
|
|
|
|
|
|
@@ -104,13 +100,11 @@ describe('AzureResourceAccountTreeNode.info', function (): void {
|
|
|
|
|
mockAppContext.registerService<IAzureResourceCacheService>(AzureResourceServiceNames.cacheService, mockCacheService.object);
|
|
|
|
|
mockAppContext.registerService<IAzureResourceSubscriptionService>(AzureResourceServiceNames.subscriptionService, mockSubscriptionService.object);
|
|
|
|
|
mockAppContext.registerService<IAzureResourceSubscriptionFilterService>(AzureResourceServiceNames.subscriptionFilterService, mockSubscriptionFilterService.object);
|
|
|
|
|
mockAppContext.registerService<IAzureResourceTenantService>(AzureResourceServiceNames.tenantService, mockTenantService.object);
|
|
|
|
|
|
|
|
|
|
getSecurityTokenStub = sinon.stub(azdata.accounts, 'getSecurityToken').returns(Promise.resolve(mockTokens));
|
|
|
|
|
getSecurityTokenStub = sinon.stub(azdata.accounts, 'getAccountSecurityToken').returns(Promise.resolve(mockToken));
|
|
|
|
|
mockCacheService.setup((o) => o.generateKey(TypeMoq.It.isAnyString())).returns(() => generateGuid());
|
|
|
|
|
mockCacheService.setup((o) => o.get(TypeMoq.It.isAnyString())).returns(() => mockSubscriptionCache);
|
|
|
|
|
mockCacheService.setup((o) => o.update(TypeMoq.It.isAnyString(), TypeMoq.It.isAny())).returns(() => mockSubscriptionCache = mockSubscriptions);
|
|
|
|
|
mockTenantService.setup((o) => o.getTenantId(TypeMoq.It.isAny(), TypeMoq.It.isAny(), TypeMoq.It.isAny())).returns(() => Promise.resolve(mockTenantId));
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
afterEach(function (): void {
|
|
|
|
|
@@ -138,7 +132,7 @@ describe('AzureResourceAccountTreeNode.info', function (): void {
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
it('Should be correct when there are subscriptions listed.', async function (): Promise<void> {
|
|
|
|
|
mockSubscriptionService.setup((o) => o.getSubscriptions(mockAccount, mockCredential)).returns(() => Promise.resolve(mockSubscriptions));
|
|
|
|
|
mockSubscriptionService.setup((o) => o.getSubscriptions(mockAccount, mockCredential, mockTenantId)).returns(() => Promise.resolve(mockSubscriptions));
|
|
|
|
|
mockSubscriptionFilterService.setup((o) => o.getSelectedSubscriptions(mockAccount)).returns(() => Promise.resolve(undefined));
|
|
|
|
|
|
|
|
|
|
const accountTreeNodeLabel = `${mockAccount.displayInfo.displayName} (${mockSubscriptions.length} / ${mockSubscriptions.length} subscriptions)`;
|
|
|
|
|
@@ -158,7 +152,7 @@ describe('AzureResourceAccountTreeNode.info', function (): void {
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
it('Should be correct when there are subscriptions filtered.', async function (): Promise<void> {
|
|
|
|
|
mockSubscriptionService.setup((o) => o.getSubscriptions(mockAccount, mockCredential)).returns(() => Promise.resolve(mockSubscriptions));
|
|
|
|
|
mockSubscriptionService.setup((o) => o.getSubscriptions(mockAccount, mockCredential, mockTenantId)).returns(() => Promise.resolve(mockSubscriptions));
|
|
|
|
|
mockSubscriptionFilterService.setup((o) => o.getSelectedSubscriptions(mockAccount)).returns(() => Promise.resolve(mockFilteredSubscriptions));
|
|
|
|
|
|
|
|
|
|
const accountTreeNodeLabel = `${mockAccount.displayInfo.displayName} (${mockFilteredSubscriptions.length} / ${mockSubscriptions.length} subscriptions)`;
|
|
|
|
|
@@ -184,7 +178,6 @@ describe('AzureResourceAccountTreeNode.getChildren', function (): void {
|
|
|
|
|
mockCacheService = TypeMoq.Mock.ofType<IAzureResourceCacheService>();
|
|
|
|
|
mockSubscriptionService = TypeMoq.Mock.ofType<IAzureResourceSubscriptionService>();
|
|
|
|
|
mockSubscriptionFilterService = TypeMoq.Mock.ofType<IAzureResourceSubscriptionFilterService>();
|
|
|
|
|
mockTenantService = TypeMoq.Mock.ofType<IAzureResourceTenantService>();
|
|
|
|
|
|
|
|
|
|
mockTreeChangeHandler = TypeMoq.Mock.ofType<IAzureResourceTreeChangeHandler>();
|
|
|
|
|
|
|
|
|
|
@@ -194,13 +187,11 @@ describe('AzureResourceAccountTreeNode.getChildren', function (): void {
|
|
|
|
|
mockAppContext.registerService<IAzureResourceCacheService>(AzureResourceServiceNames.cacheService, mockCacheService.object);
|
|
|
|
|
mockAppContext.registerService<IAzureResourceSubscriptionService>(AzureResourceServiceNames.subscriptionService, mockSubscriptionService.object);
|
|
|
|
|
mockAppContext.registerService<IAzureResourceSubscriptionFilterService>(AzureResourceServiceNames.subscriptionFilterService, mockSubscriptionFilterService.object);
|
|
|
|
|
mockAppContext.registerService<IAzureResourceTenantService>(AzureResourceServiceNames.tenantService, mockTenantService.object);
|
|
|
|
|
|
|
|
|
|
sinon.stub(azdata.accounts, 'getSecurityToken').returns(Promise.resolve(mockTokens));
|
|
|
|
|
sinon.stub(azdata.accounts, 'getAccountSecurityToken').returns(Promise.resolve(mockToken));
|
|
|
|
|
mockCacheService.setup((o) => o.generateKey(TypeMoq.It.isAnyString())).returns(() => generateGuid());
|
|
|
|
|
mockCacheService.setup((o) => o.get(TypeMoq.It.isAnyString())).returns(() => mockSubscriptionCache);
|
|
|
|
|
mockCacheService.setup((o) => o.update(TypeMoq.It.isAnyString(), TypeMoq.It.isAny())).returns(() => mockSubscriptionCache = mockSubscriptions);
|
|
|
|
|
mockTenantService.setup((o) => o.getTenantId(TypeMoq.It.isAny(), TypeMoq.It.isAny(), TypeMoq.It.isAny())).returns(() => Promise.resolve(mockTenantId));
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
afterEach(function (): void {
|
|
|
|
|
@@ -208,14 +199,14 @@ describe('AzureResourceAccountTreeNode.getChildren', function (): void {
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
it('Should load subscriptions from scratch and update cache when it is clearing cache.', async function (): Promise<void> {
|
|
|
|
|
mockSubscriptionService.setup((o) => o.getSubscriptions(mockAccount, mockCredential)).returns(() => Promise.resolve(mockSubscriptions));
|
|
|
|
|
mockSubscriptionService.setup((o) => o.getSubscriptions(mockAccount, mockCredential, mockTenantId)).returns(() => Promise.resolve(mockSubscriptions));
|
|
|
|
|
mockSubscriptionFilterService.setup((o) => o.getSelectedSubscriptions(mockAccount)).returns(() => Promise.resolve([]));
|
|
|
|
|
|
|
|
|
|
const accountTreeNode = new AzureResourceAccountTreeNode(mockAccount, mockAppContext, mockTreeChangeHandler.object);
|
|
|
|
|
|
|
|
|
|
const children = await accountTreeNode.getChildren();
|
|
|
|
|
|
|
|
|
|
mockSubscriptionService.verify((o) => o.getSubscriptions(mockAccount, mockCredential), TypeMoq.Times.once());
|
|
|
|
|
mockSubscriptionService.verify((o) => o.getSubscriptions(mockAccount, mockCredential, mockTenantId), TypeMoq.Times.once());
|
|
|
|
|
mockCacheService.verify((o) => o.get(TypeMoq.It.isAnyString()), TypeMoq.Times.exactly(0));
|
|
|
|
|
mockCacheService.verify((o) => o.update(TypeMoq.It.isAnyString(), TypeMoq.It.isAny()), TypeMoq.Times.once());
|
|
|
|
|
mockSubscriptionFilterService.verify((o) => o.getSelectedSubscriptions(mockAccount), TypeMoq.Times.once());
|
|
|
|
|
@@ -241,7 +232,7 @@ describe('AzureResourceAccountTreeNode.getChildren', function (): void {
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
it('Should load subscriptions from cache when it is not clearing cache.', async function (): Promise<void> {
|
|
|
|
|
mockSubscriptionService.setup((o) => o.getSubscriptions(mockAccount, mockCredential)).returns(() => Promise.resolve(mockSubscriptions));
|
|
|
|
|
mockSubscriptionService.setup((o) => o.getSubscriptions(mockAccount, mockCredential, mockTenantId)).returns(() => Promise.resolve(mockSubscriptions));
|
|
|
|
|
mockSubscriptionFilterService.setup((o) => o.getSelectedSubscriptions(mockAccount)).returns(() => Promise.resolve(undefined));
|
|
|
|
|
|
|
|
|
|
const accountTreeNode = new AzureResourceAccountTreeNode(mockAccount, mockAppContext, mockTreeChangeHandler.object);
|
|
|
|
|
@@ -250,7 +241,7 @@ describe('AzureResourceAccountTreeNode.getChildren', function (): void {
|
|
|
|
|
const children = await accountTreeNode.getChildren();
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
mockSubscriptionService.verify((o) => o.getSubscriptions(mockAccount, mockCredential), TypeMoq.Times.once());
|
|
|
|
|
mockSubscriptionService.verify((o) => o.getSubscriptions(mockAccount, mockCredential, mockTenantId), TypeMoq.Times.once());
|
|
|
|
|
mockCacheService.verify((o) => o.get(TypeMoq.It.isAnyString()), TypeMoq.Times.once());
|
|
|
|
|
mockCacheService.verify((o) => o.update(TypeMoq.It.isAnyString(), TypeMoq.It.isAny()), TypeMoq.Times.once());
|
|
|
|
|
|
|
|
|
|
@@ -262,7 +253,7 @@ describe('AzureResourceAccountTreeNode.getChildren', function (): void {
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
it('Should handle when there is no subscriptions.', async function (): Promise<void> {
|
|
|
|
|
mockSubscriptionService.setup((o) => o.getSubscriptions(mockAccount, mockCredential)).returns(() => Promise.resolve(undefined));
|
|
|
|
|
mockSubscriptionService.setup((o) => o.getSubscriptions(mockAccount, mockCredential, mockTenantId)).returns(() => Promise.resolve(undefined));
|
|
|
|
|
|
|
|
|
|
const accountTreeNode = new AzureResourceAccountTreeNode(mockAccount, mockAppContext, mockTreeChangeHandler.object);
|
|
|
|
|
|
|
|
|
|
@@ -278,7 +269,7 @@ describe('AzureResourceAccountTreeNode.getChildren', function (): void {
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
it('Should honor subscription filtering.', async function (): Promise<void> {
|
|
|
|
|
mockSubscriptionService.setup((o) => o.getSubscriptions(mockAccount, mockCredential)).returns(() => Promise.resolve(mockSubscriptions));
|
|
|
|
|
mockSubscriptionService.setup((o) => o.getSubscriptions(mockAccount, mockCredential, mockTenantId)).returns(() => Promise.resolve(mockSubscriptions));
|
|
|
|
|
mockSubscriptionFilterService.setup((o) => o.getSelectedSubscriptions(mockAccount)).returns(() => Promise.resolve(mockFilteredSubscriptions));
|
|
|
|
|
|
|
|
|
|
const accountTreeNode = new AzureResourceAccountTreeNode(mockAccount, mockAppContext, mockTreeChangeHandler.object);
|
|
|
|
|
@@ -296,7 +287,7 @@ describe('AzureResourceAccountTreeNode.getChildren', function (): void {
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
it('Should handle errors.', async function (): Promise<void> {
|
|
|
|
|
mockSubscriptionService.setup((o) => o.getSubscriptions(mockAccount, mockCredential)).returns(() => Promise.resolve(mockSubscriptions));
|
|
|
|
|
mockSubscriptionService.setup((o) => o.getSubscriptions(mockAccount, mockCredential, mockTenantId)).returns(() => Promise.resolve(mockSubscriptions));
|
|
|
|
|
|
|
|
|
|
const mockError = 'Test error';
|
|
|
|
|
mockSubscriptionFilterService.setup((o) => o.getSelectedSubscriptions(mockAccount)).returns(() => { throw new Error(mockError); });
|
|
|
|
|
@@ -305,8 +296,8 @@ describe('AzureResourceAccountTreeNode.getChildren', function (): void {
|
|
|
|
|
|
|
|
|
|
const children = await accountTreeNode.getChildren();
|
|
|
|
|
|
|
|
|
|
should(getSecurityTokenStub.calledOnce).be.true('getSecurityToken should have been called exactly once');
|
|
|
|
|
mockSubscriptionService.verify((o) => o.getSubscriptions(mockAccount, mockCredential), TypeMoq.Times.once());
|
|
|
|
|
should(getSecurityTokenStub.calledTwice).be.true('getSecurityToken should have been called exactly twice - once per subscription');
|
|
|
|
|
mockSubscriptionService.verify((o) => o.getSubscriptions(mockAccount, mockCredential, mockTenantId), TypeMoq.Times.once());
|
|
|
|
|
mockSubscriptionFilterService.verify((o) => o.getSelectedSubscriptions(mockAccount), TypeMoq.Times.once());
|
|
|
|
|
mockCacheService.verify((o) => o.get(TypeMoq.It.isAnyString()), TypeMoq.Times.never());
|
|
|
|
|
mockCacheService.verify((o) => o.update(TypeMoq.It.isAnyString(), TypeMoq.It.isAny()), TypeMoq.Times.once());
|
|
|
|
|
@@ -325,7 +316,6 @@ describe('AzureResourceAccountTreeNode.clearCache', function (): void {
|
|
|
|
|
mockCacheService = TypeMoq.Mock.ofType<IAzureResourceCacheService>();
|
|
|
|
|
mockSubscriptionService = TypeMoq.Mock.ofType<IAzureResourceSubscriptionService>();
|
|
|
|
|
mockSubscriptionFilterService = TypeMoq.Mock.ofType<IAzureResourceSubscriptionFilterService>();
|
|
|
|
|
mockTenantService = TypeMoq.Mock.ofType<IAzureResourceTenantService>();
|
|
|
|
|
|
|
|
|
|
mockTreeChangeHandler = TypeMoq.Mock.ofType<IAzureResourceTreeChangeHandler>();
|
|
|
|
|
|
|
|
|
|
@@ -335,13 +325,11 @@ describe('AzureResourceAccountTreeNode.clearCache', function (): void {
|
|
|
|
|
mockAppContext.registerService<IAzureResourceCacheService>(AzureResourceServiceNames.cacheService, mockCacheService.object);
|
|
|
|
|
mockAppContext.registerService<IAzureResourceSubscriptionService>(AzureResourceServiceNames.subscriptionService, mockSubscriptionService.object);
|
|
|
|
|
mockAppContext.registerService<IAzureResourceSubscriptionFilterService>(AzureResourceServiceNames.subscriptionFilterService, mockSubscriptionFilterService.object);
|
|
|
|
|
mockAppContext.registerService<IAzureResourceTenantService>(AzureResourceServiceNames.tenantService, mockTenantService.object);
|
|
|
|
|
|
|
|
|
|
sinon.stub(azdata.accounts, 'getSecurityToken').returns(Promise.resolve(mockTokens));
|
|
|
|
|
sinon.stub(azdata.accounts, 'getAccountSecurityToken').returns(Promise.resolve(mockToken));
|
|
|
|
|
mockCacheService.setup((o) => o.generateKey(TypeMoq.It.isAnyString())).returns(() => generateGuid());
|
|
|
|
|
mockCacheService.setup((o) => o.get(TypeMoq.It.isAnyString())).returns(() => mockSubscriptionCache);
|
|
|
|
|
mockCacheService.setup((o) => o.update(TypeMoq.It.isAnyString(), TypeMoq.It.isAny())).returns(() => mockSubscriptionCache = mockSubscriptions);
|
|
|
|
|
mockTenantService.setup((o) => o.getTenantId(TypeMoq.It.isAny(), TypeMoq.It.isAny(), TypeMoq.It.isAny())).returns(() => Promise.resolve(mockTenantId));
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
afterEach(function (): void {
|
|
|
|
|
|