From dd253b4e98d8eb240d133c965639e816c75abcbc Mon Sep 17 00:00:00 2001 From: Charles Gagnon Date: Mon, 19 Sep 2022 14:29:42 -0700 Subject: [PATCH] Finish strict null azurecore (#20619) * Finish strict null azurecore * one last --- .../account-provider/auths/azureAuth.test.ts | 52 +++++++++---------- .../azureResource/resourceTreeNode.test.ts | 11 ++-- .../tree/accountNotSignedInTreeNode.test.ts | 4 +- .../tree/accountTreeNode.test.ts | 4 +- .../tree/subscriptionTreeNode.test.ts | 9 ++-- .../azureResource/tree/treeProvider.test.ts | 8 +-- .../src/test/stubs/credentialsTestProvider.ts | 2 +- extensions/azurecore/tsconfig.json | 2 - 8 files changed, 46 insertions(+), 46 deletions(-) diff --git a/extensions/azurecore/src/test/account-provider/auths/azureAuth.test.ts b/extensions/azurecore/src/test/account-provider/auths/azureAuth.test.ts index 2123cb2bd3..68ae3027a4 100644 --- a/extensions/azurecore/src/test/account-provider/auths/azureAuth.test.ts +++ b/extensions/azurecore/src/test/account-provider/auths/azureAuth.test.ts @@ -99,13 +99,13 @@ describe('Azure Authentication', function () { mockTenant ]); }); - azureAuthCodeGrant.setup(x => x.getTokenHelper(mockTenant, provider.settings.ossRdbmsResource, TypeMoq.It.isAny(), TypeMoq.It.isAny(), TypeMoq.It.isAny())).returns(() => { + azureAuthCodeGrant.setup(x => x.getTokenHelper(mockTenant, provider.settings.ossRdbmsResource!, TypeMoq.It.isAny(), TypeMoq.It.isAny(), TypeMoq.It.isAny())).returns(() => { return Promise.resolve({ accessToken: mockAccessToken } as OAuthTokenResponse); }); - azureAuthCodeGrant.setup(x => x.refreshToken(mockTenant, provider.settings.ossRdbmsResource, mockRefreshToken)).returns((): Promise => { + azureAuthCodeGrant.setup(x => x.refreshToken(mockTenant, provider.settings.ossRdbmsResource!, mockRefreshToken)).returns((): Promise => { const mockToken: AccessToken = JSON.parse(JSON.stringify(mockAccessToken)); delete (mockToken as any).invalidData; return Promise.resolve({ @@ -113,7 +113,7 @@ describe('Azure Authentication', function () { } as OAuthTokenResponse); }); - azureAuthCodeGrant.setup(x => x.getSavedToken(mockTenant, provider.settings.ossRdbmsResource, mockAccount.key)).returns((): Promise<{ accessToken: AccessToken, refreshToken: RefreshToken, expiresOn: string }> => { + azureAuthCodeGrant.setup(x => x.getSavedToken(mockTenant, provider.settings.ossRdbmsResource!, mockAccount.key)).returns((): Promise<{ accessToken: AccessToken, refreshToken: RefreshToken, expiresOn: string }> => { return Promise.resolve({ accessToken: mockAccessToken, refreshToken: mockRefreshToken, @@ -122,13 +122,13 @@ describe('Azure Authentication', function () { }); const securityToken = await azureAuthCodeGrant.object.getAccountSecurityToken(mockAccount, mockTenant.id, AzureResource.OssRdbms); - should(securityToken.token).be.equal(mockAccessToken.token, 'Token are not similar'); + should(securityToken?.token).be.equal(mockAccessToken.token, 'Token are not similar'); }); it('saved token exists and can be reused', async function () { delete (mockAccessToken as any).tokenType; - azureAuthCodeGrant.setup(x => x.getSavedToken(mockTenant, provider.settings.microsoftResource, mockAccount.key)).returns((): Promise<{ accessToken: AccessToken, refreshToken: RefreshToken, expiresOn: string }> => { + azureAuthCodeGrant.setup(x => x.getSavedToken(mockTenant, provider.settings.microsoftResource!, mockAccount.key)).returns((): Promise<{ accessToken: AccessToken, refreshToken: RefreshToken, expiresOn: string }> => { return Promise.resolve({ accessToken: mockAccessToken, refreshToken: mockRefreshToken, @@ -137,21 +137,21 @@ describe('Azure Authentication', function () { }); const securityToken = await azureAuthCodeGrant.object.getAccountSecurityToken(mockAccount, mockTenant.id, AzureResource.MicrosoftResourceManagement); - should(securityToken.tokenType).be.equal('Bearer', 'tokenType should be bearer on a successful getSecurityToken from cache'); + should(securityToken?.tokenType).be.equal('Bearer', 'tokenType should be bearer on a successful getSecurityToken from cache'); }); it('saved token had invalid expiration', async function () { delete (mockAccessToken as any).tokenType; (mockAccessToken as any).invalidData = 'this should not exist on response'; - azureAuthCodeGrant.setup(x => x.getSavedToken(mockTenant, provider.settings.microsoftResource, mockAccount.key)).returns((): Promise<{ accessToken: AccessToken, refreshToken: RefreshToken, expiresOn: string }> => { + azureAuthCodeGrant.setup(x => x.getSavedToken(mockTenant, provider.settings.microsoftResource!, mockAccount.key)).returns((): Promise<{ accessToken: AccessToken, refreshToken: RefreshToken, expiresOn: string }> => { return Promise.resolve({ accessToken: mockAccessToken, refreshToken: mockRefreshToken, - expiresOn: undefined + expiresOn: 'invalid' }); }); - azureAuthCodeGrant.setup(x => x.refreshToken(mockTenant, provider.settings.microsoftResource, mockRefreshToken)).returns((): Promise => { + azureAuthCodeGrant.setup(x => x.refreshToken(mockTenant, provider.settings.microsoftResource!, mockRefreshToken)).returns((): Promise => { const mockToken: AccessToken = JSON.parse(JSON.stringify(mockAccessToken)); delete (mockToken as any).invalidData; return Promise.resolve({ @@ -161,18 +161,18 @@ describe('Azure Authentication', function () { const securityToken = await azureAuthCodeGrant.object.getAccountSecurityToken(mockAccount, mockTenant.id, AzureResource.MicrosoftResourceManagement); should((securityToken as any).invalidData).be.undefined(); // Ensure its a new one - should(securityToken.tokenType).be.equal('Bearer', 'tokenType should be bearer on a successful getSecurityToken from cache'); + should(securityToken?.tokenType).be.equal('Bearer', 'tokenType should be bearer on a successful getSecurityToken from cache'); - azureAuthCodeGrant.verify(x => x.refreshToken(mockTenant, provider.settings.microsoftResource, mockRefreshToken), TypeMoq.Times.once()); + azureAuthCodeGrant.verify(x => x.refreshToken(mockTenant, provider.settings.microsoftResource!, mockRefreshToken), TypeMoq.Times.once()); }); describe('no saved token', function () { it('no base token', async function () { - azureAuthCodeGrant.setup(x => x.getSavedToken(mockTenant, provider.settings.microsoftResource, mockAccount.key)).returns((): Promise<{ accessToken: AccessToken, refreshToken: RefreshToken, expiresOn: string }> => { + azureAuthCodeGrant.setup(x => x.getSavedToken(mockTenant, provider.settings.microsoftResource!, mockAccount.key)).returns((): Promise<{ accessToken: AccessToken, refreshToken: RefreshToken, expiresOn: string } | undefined> => { return Promise.resolve(undefined); }); - azureAuthCodeGrant.setup(x => x.getSavedToken(azureAuthCodeGrant.object.commonTenant, provider.settings.microsoftResource, mockAccount.key)).returns((): Promise<{ accessToken: AccessToken, refreshToken: RefreshToken, expiresOn: string }> => { + azureAuthCodeGrant.setup(x => x.getSavedToken(azureAuthCodeGrant.object.commonTenant, provider.settings.microsoftResource!, mockAccount.key)).returns((): Promise<{ accessToken: AccessToken, refreshToken: RefreshToken, expiresOn: string } | undefined> => { return Promise.resolve(undefined); }); @@ -180,11 +180,11 @@ describe('Azure Authentication', function () { }); it('base token exists', async function () { - azureAuthCodeGrant.setup(x => x.getSavedToken(mockTenant, provider.settings.microsoftResource, mockAccount.key)).returns((): Promise<{ accessToken: AccessToken, refreshToken: RefreshToken, expiresOn: string }> => { + azureAuthCodeGrant.setup(x => x.getSavedToken(mockTenant, provider.settings.microsoftResource!, mockAccount.key)).returns((): Promise<{ accessToken: AccessToken, refreshToken: RefreshToken, expiresOn: string } | undefined> => { return Promise.resolve(undefined); }); - azureAuthCodeGrant.setup(x => x.getSavedToken(azureAuthCodeGrant.object.commonTenant, provider.settings.microsoftResource, mockAccount.key)).returns((): Promise<{ accessToken: AccessToken, refreshToken: RefreshToken, expiresOn: string }> => { + azureAuthCodeGrant.setup(x => x.getSavedToken(azureAuthCodeGrant.object.commonTenant, provider.settings.microsoftResource!, mockAccount.key)).returns((): Promise<{ accessToken: AccessToken, refreshToken: RefreshToken, expiresOn: string }> => { return Promise.resolve({ accessToken: mockAccessToken, refreshToken: mockRefreshToken, @@ -199,8 +199,8 @@ describe('Azure Authentication', function () { } as OAuthTokenResponse); }); - const securityToken: Token = await azureAuthCodeGrant.object.getAccountSecurityToken(mockAccount, mockTenant.id, AzureResource.MicrosoftResourceManagement); - should(securityToken.tokenType).be.equal('Bearer', 'tokenType should be bearer on a successful getSecurityToken from cache'); + const securityToken = await azureAuthCodeGrant.object.getAccountSecurityToken(mockAccount, mockTenant.id, AzureResource.MicrosoftResourceManagement); + should(securityToken?.tokenType).be.equal('Bearer', 'tokenType should be bearer on a successful getSecurityToken from cache'); }); }); @@ -217,18 +217,18 @@ describe('Azure Authentication', function () { } as AxiosResponse); }); - azureAuthCodeGrant.setup(x => x.handleInteractionRequired(mockTenant, provider.settings.microsoftResource)).returns(() => { + azureAuthCodeGrant.setup(x => x.handleInteractionRequired(mockTenant, provider.settings.microsoftResource!)).returns(() => { return Promise.resolve({ accessToken: mockAccessToken } as OAuthTokenResponse); }); - const result = await azureAuthCodeGrant.object.getToken(mockTenant, provider.settings.microsoftResource, {} as TokenPostData); + const result = await azureAuthCodeGrant.object.getToken(mockTenant, provider.settings.microsoftResource!, {} as TokenPostData); - azureAuthCodeGrant.verify(x => x.handleInteractionRequired(mockTenant, provider.settings.microsoftResource), TypeMoq.Times.once()); + azureAuthCodeGrant.verify(x => x.handleInteractionRequired(mockTenant, provider.settings.microsoftResource!), TypeMoq.Times.once()); - should(result.accessToken).be.deepEqual(mockAccessToken); + should(result?.accessToken).be.deepEqual(mockAccessToken); }); it('unknown error should throw error', async function () { @@ -240,7 +240,7 @@ describe('Azure Authentication', function () { } as AxiosResponse); }); - await azureAuthCodeGrant.object.getToken(mockTenant, provider.settings.microsoftResource, {} as TokenPostData).should.be.rejected(); + await azureAuthCodeGrant.object.getToken(mockTenant, provider.settings.microsoftResource!, {} as TokenPostData).should.be.rejected(); }); it('calls getTokenHelper', async function () { @@ -254,18 +254,18 @@ describe('Azure Authentication', function () { } as AxiosResponse); }); - azureAuthCodeGrant.setup(x => x.getTokenHelper(mockTenant, provider.settings.microsoftResource, TypeMoq.It.isAny(), TypeMoq.It.isAny(), TypeMoq.It.isAny())).returns(() => { + azureAuthCodeGrant.setup(x => x.getTokenHelper(mockTenant, provider.settings.microsoftResource!, TypeMoq.It.isAny(), TypeMoq.It.isAny(), TypeMoq.It.isAny())).returns(() => { return Promise.resolve({ accessToken: mockAccessToken } as OAuthTokenResponse); }); - const result = await azureAuthCodeGrant.object.getToken(mockTenant, provider.settings.microsoftResource, {} as TokenPostData); + const result = await azureAuthCodeGrant.object.getToken(mockTenant, provider.settings.microsoftResource!, {} as TokenPostData); - azureAuthCodeGrant.verify(x => x.getTokenHelper(mockTenant, provider.settings.microsoftResource, TypeMoq.It.isAny(), TypeMoq.It.isAny(), TypeMoq.It.isAny()), TypeMoq.Times.once()); + azureAuthCodeGrant.verify(x => x.getTokenHelper(mockTenant, provider.settings.microsoftResource!, TypeMoq.It.isAny(), TypeMoq.It.isAny(), TypeMoq.It.isAny()), TypeMoq.Times.once()); - should(result.accessToken).be.deepEqual(mockAccessToken); + should(result?.accessToken).be.deepEqual(mockAccessToken); }); }); diff --git a/extensions/azurecore/src/test/azureResource/resourceTreeNode.test.ts b/extensions/azurecore/src/test/azureResource/resourceTreeNode.test.ts index fd6512de91..fd68d2c049 100644 --- a/extensions/azurecore/src/test/azureResource/resourceTreeNode.test.ts +++ b/extensions/azurecore/src/test/azureResource/resourceTreeNode.test.ts @@ -14,6 +14,7 @@ import { AppContext } from '../../appContext'; import { AzureResourceServiceNames } from '../../azureResource/constants'; import settings from '../../account-provider/providerSettings'; import { AzureAccount, azureResource } from 'azurecore'; +import { TreeNode } from '../../azureResource/treeNode'; // Mock test data const mockAccount: AzureAccount = { @@ -107,7 +108,7 @@ describe('AzureResourceResourceTreeNode.info', function (): void { resourceService.registerResourceProvider(mockResourceProvider.object); resourceService.areResourceProvidersLoaded = true; - appContext = new AppContext(undefined); + appContext = new AppContext(TypeMoq.Mock.ofType().object); appContext.registerService(AzureResourceServiceNames.resourceService, resourceService); }); @@ -115,7 +116,7 @@ describe('AzureResourceResourceTreeNode.info', function (): void { const resourceTreeNode = new AzureResourceResourceTreeNode({ resourceProviderId: mockResourceProviderId, resourceNode: mockResourceRootNode - }, undefined, appContext); + }, TypeMoq.Mock.ofType().object, appContext); should(resourceTreeNode.nodePathValue).equal(mockResourceRootNode.treeItem.id); @@ -147,7 +148,7 @@ describe('AzureResourceResourceTreeNode.getChildren', function (): void { resourceService.registerResourceProvider(mockResourceProvider.object); resourceService.areResourceProvidersLoaded = true; - appContext = new AppContext(undefined); + appContext = new AppContext(TypeMoq.Mock.ofType().object); appContext.registerService(AzureResourceServiceNames.resourceService, resourceService); }); @@ -156,7 +157,7 @@ describe('AzureResourceResourceTreeNode.getChildren', function (): void { resourceProviderId: mockResourceProviderId, resourceNode: mockResourceRootNode }, - undefined, appContext); + TypeMoq.Mock.ofType().object, appContext); const children = await resourceTreeNode.getChildren(); @@ -186,7 +187,7 @@ describe('AzureResourceResourceTreeNode.getChildren', function (): void { const resourceTreeNode = new AzureResourceResourceTreeNode({ resourceProviderId: mockResourceProviderId, resourceNode: mockResourceNode1 - }, undefined, appContext); + }, TypeMoq.Mock.ofType().object, appContext); const children = await resourceTreeNode.getChildren(); diff --git a/extensions/azurecore/src/test/azureResource/tree/accountNotSignedInTreeNode.test.ts b/extensions/azurecore/src/test/azureResource/tree/accountNotSignedInTreeNode.test.ts index a9c3e0f4fa..00bf974859 100644 --- a/extensions/azurecore/src/test/azureResource/tree/accountNotSignedInTreeNode.test.ts +++ b/extensions/azurecore/src/test/azureResource/tree/accountNotSignedInTreeNode.test.ts @@ -23,8 +23,8 @@ describe('AzureResourceAccountNotSignedInTreeNode.info', function(): void { should(treeItem.contextValue).equal(AzureResourceItemType.message); should(treeItem.collapsibleState).equal(vscode.TreeItemCollapsibleState.None); should(treeItem.command).not.undefined(); - should(treeItem.command.title).equal(label); - should(treeItem.command.command).equal('azure.resource.signin'); + should(treeItem.command?.title).equal(label); + should(treeItem.command?.command).equal('azure.resource.signin'); const nodeInfo = treeNode.getNodeInfo(); should(nodeInfo.isLeaf).true(); diff --git a/extensions/azurecore/src/test/azureResource/tree/accountTreeNode.test.ts b/extensions/azurecore/src/test/azureResource/tree/accountTreeNode.test.ts index 05e765adec..b8b8a4102b 100644 --- a/extensions/azurecore/src/test/azureResource/tree/accountTreeNode.test.ts +++ b/extensions/azurecore/src/test/azureResource/tree/accountTreeNode.test.ts @@ -141,7 +141,7 @@ describe('AzureResourceAccountTreeNode.info', function (): void { it('Should be correct when there are subscriptions listed.', async function (): Promise { mockSubscriptionService.setup((o) => o.getSubscriptions(mockAccount, TypeMoq.It.isAny())).returns(() => Promise.resolve(mockSubscriptions)); - mockSubscriptionFilterService.setup((o) => o.getSelectedSubscriptions(mockAccount)).returns(() => Promise.resolve(undefined)); + mockSubscriptionFilterService.setup((o) => o.getSelectedSubscriptions(mockAccount)).returns(() => Promise.resolve([])); sinon.stub(azdata.accounts, 'getAccountSecurityToken').resolves(mockToken); const accountTreeNodeLabel = `${mockAccount.displayInfo.displayName} (${mockSubscriptions.length} / ${mockSubscriptions.length} subscriptions)`; @@ -265,7 +265,7 @@ describe('AzureResourceAccountTreeNode.getChildren', function (): void { it('Should load subscriptions from cache when it is not clearing cache.', async function (): Promise { mockSubscriptionService.setup((o) => o.getSubscriptions(mockAccount, TypeMoq.It.isAny())).returns(() => Promise.resolve(mockSubscriptions)); - mockSubscriptionFilterService.setup((o) => o.getSelectedSubscriptions(mockAccount)).returns(() => Promise.resolve(undefined)); + mockSubscriptionFilterService.setup((o) => o.getSelectedSubscriptions(mockAccount)).returns(() => Promise.resolve([])); const accountTreeNode = new AzureResourceAccountTreeNode(mockAccount, mockAppContext, mockTreeChangeHandler.object); diff --git a/extensions/azurecore/src/test/azureResource/tree/subscriptionTreeNode.test.ts b/extensions/azurecore/src/test/azureResource/tree/subscriptionTreeNode.test.ts index 33485137ab..d29808ed0a 100644 --- a/extensions/azurecore/src/test/azureResource/tree/subscriptionTreeNode.test.ts +++ b/extensions/azurecore/src/test/azureResource/tree/subscriptionTreeNode.test.ts @@ -17,7 +17,8 @@ import { AzureResourceService } from '../../../azureResource/resourceService'; import { AzureResourceResourceTreeNode } from '../../../azureResource/resourceTreeNode'; import { IAzureResourceCacheService } from '../../../azureResource/interfaces'; import { generateGuid } from '../../../azureResource/utils'; -import { AzureAccount, azureResource } from 'azurecore'; +import { AzureAccount, AzureAccountProperties, azureResource } from 'azurecore'; +import { TreeNode } from '../../../azureResource/treeNode'; // Mock services let appContext: AppContext; @@ -39,7 +40,7 @@ const mockAccount: AzureAccount = { contextualDisplayName: 'test', userId: 'test@email.com' }, - properties: undefined, + properties: TypeMoq.Mock.ofType().object, isStale: false }; @@ -95,7 +96,7 @@ describe('AzureResourceSubscriptionTreeNode.info', function(): void { }); it('Should be correct when created.', async function(): Promise { - const subscriptionTreeNode = new AzureResourceSubscriptionTreeNode(mockAccount, mockSubscription, mockTenantId, appContext, mockTreeChangeHandler.object, undefined); + const subscriptionTreeNode = new AzureResourceSubscriptionTreeNode(mockAccount, mockSubscription, mockTenantId, appContext, mockTreeChangeHandler.object, TypeMoq.Mock.ofType().object); should(subscriptionTreeNode.nodePathValue).equal(`account_${mockAccount.key.accountId}.subscription_${mockSubscription.id}.tenant_${mockTenantId}`); @@ -148,7 +149,7 @@ describe('AzureResourceSubscriptionTreeNode.getChildren', function(): void { }); it('Should return resource containers.', async function(): Promise { - const subscriptionTreeNode = new AzureResourceSubscriptionTreeNode(mockAccount, mockSubscription, mockTenantId, appContext, mockTreeChangeHandler.object, undefined); + const subscriptionTreeNode = new AzureResourceSubscriptionTreeNode(mockAccount, mockSubscription, mockTenantId, appContext, mockTreeChangeHandler.object, TypeMoq.Mock.ofType().object); const children = await subscriptionTreeNode.getChildren(); mockResourceTreeDataProvider1.verify((o) => o.getRootChildren(), TypeMoq.Times.once()); diff --git a/extensions/azurecore/src/test/azureResource/tree/treeProvider.test.ts b/extensions/azurecore/src/test/azureResource/tree/treeProvider.test.ts index 4a4357369e..1e932c307d 100644 --- a/extensions/azurecore/src/test/azureResource/tree/treeProvider.test.ts +++ b/extensions/azurecore/src/test/azureResource/tree/treeProvider.test.ts @@ -17,7 +17,7 @@ import { AzureResourceAccountTreeNode } from '../../../azureResource/tree/accoun import { AzureResourceAccountNotSignedInTreeNode } from '../../../azureResource/tree/accountNotSignedInTreeNode'; import { AzureResourceServiceNames } from '../../../azureResource/constants'; import { generateGuid } from '../../../azureResource/utils'; -import { AzureAccount } from 'azurecore'; +import { AzureAccount, AzureAccountProperties } from 'azurecore'; // Mock services let mockAppContext: AppContext; @@ -37,7 +37,7 @@ const mockAccount1: AzureAccount = { contextualDisplayName: 'test', userId: 'test@email.com' }, - properties: undefined, + properties: TypeMoq.Mock.ofType().object, isStale: false }; const mockAccount2: AzureAccount = { @@ -51,7 +51,7 @@ const mockAccount2: AzureAccount = { contextualDisplayName: 'test', userId: 'test@email.com' }, - properties: undefined, + properties: TypeMoq.Mock.ofType().object, isStale: false }; const mockAccounts = [mockAccount1, mockAccount2]; @@ -94,7 +94,7 @@ describe('AzureResourceTreeProvider.getChildren', function (): void { }); it('Should handle when there is no accounts.', async function (): Promise { - sinon.stub(azdata.accounts, 'getAllAccounts').returns(Promise.resolve(undefined)); + sinon.stub(azdata.accounts, 'getAllAccounts').returns(Promise.resolve([])); const treeProvider = new AzureResourceTreeProvider(mockAppContext); treeProvider.isSystemInitialized = true; diff --git a/extensions/azurecore/src/test/stubs/credentialsTestProvider.ts b/extensions/azurecore/src/test/stubs/credentialsTestProvider.ts index b7e8faf490..7432dee5f1 100644 --- a/extensions/azurecore/src/test/stubs/credentialsTestProvider.ts +++ b/extensions/azurecore/src/test/stubs/credentialsTestProvider.ts @@ -9,7 +9,7 @@ import * as azdata from 'azdata'; * Mock CredentialsProvider to be used for testing */ export class CredentialsTestProvider implements azdata.CredentialProvider { - handle: number; + handle: number = 0; public storedCredentials: { [K: string]: azdata.Credential } = {}; diff --git a/extensions/azurecore/tsconfig.json b/extensions/azurecore/tsconfig.json index 7682440684..e1b080f9e7 100644 --- a/extensions/azurecore/tsconfig.json +++ b/extensions/azurecore/tsconfig.json @@ -2,12 +2,10 @@ "extends": "../tsconfig.base.json", "compilerOptions": { "outDir": "./out", - "strict": true, "noUnusedParameters": false, "typeRoots": [ "./node_modules/@types" ], - "strictNullChecks": false }, "include": [ "src/**/*"