From ea84e60fa0ef277153142d5bd1f10362a050904e Mon Sep 17 00:00:00 2001 From: Kim Santiago <31145923+kisantia@users.noreply.github.com> Date: Fri, 8 May 2020 14:04:11 -0700 Subject: [PATCH] Add a few dacpac extension tests (#10322) * add controller test * Add a few wizard tests * Addressing comment * fix compile error --- .../dacpac/src/controllers/controllerBase.ts | 26 ---------- .../dacpac/src/controllers/mainController.ts | 17 ++++--- extensions/dacpac/src/main.ts | 4 +- .../dacpac/src/test/mainController.test.ts | 27 ++++++++++ extensions/dacpac/src/test/testContext.ts | 36 +++++++++++++ extensions/dacpac/src/test/wizard.test.ts | 50 ++++++++++++++++++- .../src/wizard/dataTierApplicationWizard.ts | 4 +- 7 files changed, 126 insertions(+), 38 deletions(-) delete mode 100644 extensions/dacpac/src/controllers/controllerBase.ts create mode 100644 extensions/dacpac/src/test/mainController.test.ts create mode 100644 extensions/dacpac/src/test/testContext.ts diff --git a/extensions/dacpac/src/controllers/controllerBase.ts b/extensions/dacpac/src/controllers/controllerBase.ts deleted file mode 100644 index 69654f4ff5..0000000000 --- a/extensions/dacpac/src/controllers/controllerBase.ts +++ /dev/null @@ -1,26 +0,0 @@ -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the Source EULA. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ - -import * as vscode from 'vscode'; - -export default abstract class ControllerBase implements vscode.Disposable { - protected _context: vscode.ExtensionContext; - - protected constructor(context: vscode.ExtensionContext) { - this._context = context; - } - - public get extensionContext(): vscode.ExtensionContext { - return this._context; - } - - abstract activate(): Promise; - - abstract deactivate(): void; - - public dispose(): void { - this.deactivate(); - } -} diff --git a/extensions/dacpac/src/controllers/mainController.ts b/extensions/dacpac/src/controllers/mainController.ts index 32e179fc82..3654e09ab7 100644 --- a/extensions/dacpac/src/controllers/mainController.ts +++ b/extensions/dacpac/src/controllers/mainController.ts @@ -4,20 +4,17 @@ *--------------------------------------------------------------------------------------------*/ import * as azdata from 'azdata'; -import ControllerBase from './controllerBase'; import * as vscode from 'vscode'; import { DataTierApplicationWizard } from '../wizard/dataTierApplicationWizard'; /** * The main controller class that initializes the extension */ -export default class MainController extends ControllerBase { +export default class MainController implements vscode.Disposable { - public constructor(context: vscode.ExtensionContext) { - super(context); + public constructor(private context: vscode.ExtensionContext) { } - /** - */ + public deactivate(): void { } @@ -29,4 +26,12 @@ export default class MainController extends ControllerBase { private initializeDacFxWizard() { azdata.tasks.registerTask('dacFx.start', (profile: azdata.IConnectionProfile, ...args: any[]) => new DataTierApplicationWizard().start(profile, args)); } + + public get extensionContext(): vscode.ExtensionContext { + return this.context; + } + + public dispose(): void { + this.deactivate(); + } } diff --git a/extensions/dacpac/src/main.ts b/extensions/dacpac/src/main.ts index fd444f5221..a72d42255f 100644 --- a/extensions/dacpac/src/main.ts +++ b/extensions/dacpac/src/main.ts @@ -4,11 +4,9 @@ *--------------------------------------------------------------------------------------------*/ import * as vscode from 'vscode'; - -import ControllerBase from './controllers/controllerBase'; import MainController from './controllers/mainController'; -let controllers: ControllerBase[] = []; +let controllers: MainController[] = []; export function activate(context: vscode.ExtensionContext) { let activations: Promise[] = []; diff --git a/extensions/dacpac/src/test/mainController.test.ts b/extensions/dacpac/src/test/mainController.test.ts new file mode 100644 index 0000000000..d158a624bf --- /dev/null +++ b/extensions/dacpac/src/test/mainController.test.ts @@ -0,0 +1,27 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the Source EULA. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +import * as should from 'should'; +import MainController from '../controllers/mainController'; +import { TestContext, createContext } from './testContext'; + +let testContext: TestContext; + +function createController(): MainController { + let controller = new MainController(testContext.context); + return controller; +} + +describe('MainController', function (): void { + before(async function (): Promise { + testContext = createContext(); + }); + + it('Should create new instance successfully', async function (): Promise { + let controller: MainController; + should.doesNotThrow(() => controller = createController()); + should.notEqual(controller.extensionContext, undefined); + }); + +}); diff --git a/extensions/dacpac/src/test/testContext.ts b/extensions/dacpac/src/test/testContext.ts new file mode 100644 index 0000000000..813db94065 --- /dev/null +++ b/extensions/dacpac/src/test/testContext.ts @@ -0,0 +1,36 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the Source EULA. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import * as vscode from 'vscode'; +import * as path from 'path'; + +export interface TestContext { + context: vscode.ExtensionContext; +} + +export function createContext(): TestContext { + let extensionPath = path.join(__dirname, '..', '..'); + + return { + context: { + subscriptions: [], + workspaceState: { + get: () => { return Promise.resolve(); }, + update: () => { return Promise.resolve(); } + }, + globalState: { + get: () => { return Promise.resolve(); }, + update: () => { return Promise.resolve(); } + }, + extensionPath: extensionPath, + asAbsolutePath: () => { return ''; }, + storagePath: '', + globalStoragePath: '', + logPath: '', + extensionUri: vscode.Uri.parse(''), + environmentVariableCollection: undefined as any + } + }; +} diff --git a/extensions/dacpac/src/test/wizard.test.ts b/extensions/dacpac/src/test/wizard.test.ts index 20893df070..96bb694208 100644 --- a/extensions/dacpac/src/test/wizard.test.ts +++ b/extensions/dacpac/src/test/wizard.test.ts @@ -7,10 +7,16 @@ import 'mocha'; import * as should from 'should'; import * as loc from '../localizedConstants'; import { DataTierApplicationWizard, Operation } from '../wizard/dataTierApplicationWizard'; +import { DacFxDataModel } from '../wizard/api/models'; +let wizard: DataTierApplicationWizard; describe('Dacfx wizard', function (): void { + beforeEach(async function (): Promise { + wizard = new DataTierApplicationWizard(); + wizard.model = {}; + }); + it('Should initialize wizard correctly', async () => { - let wizard = new DataTierApplicationWizard(); should.notEqual(wizard.wizard, undefined); should.equal(wizard.wizard.title, loc.wizardTitle); @@ -18,8 +24,50 @@ describe('Dacfx wizard', function (): void { should.notEqual(wizard.pages, undefined); should.equal(wizard.pages.size, 7); should.equal(wizard.wizard.pages.length, 4); + }); + it('Should determine summary page correctly', async () => { + // summary page should be 2 for deploy + wizard.selectedOperation = Operation.deploy; + wizard.model.upgradeExisting = false; + should.equal(wizard.isSummaryPage(2), true); + + // summary page should be 3 for deploy - upgrade existing db + wizard.selectedOperation = Operation.deploy; + wizard.model.upgradeExisting = true; + should.equal(wizard.isSummaryPage(3), true); + + // summary page should be 3 for generate deploy script + wizard.selectedOperation = Operation.generateDeployScript; + should.equal(wizard.isSummaryPage(3), true); + + // summary page should be 2 for import + wizard.selectedOperation = Operation.import; + should.equal(wizard.isSummaryPage(2), true); + + // summary page should be 2 for export + wizard.selectedOperation = Operation.export; + should.equal(wizard.isSummaryPage(2), true); + + // summary page should be 2 for extract + wizard.selectedOperation = Operation.extract; + should.equal(wizard.isSummaryPage(2), true); + }); + + it('Should set Done button and operation correctly', async () => { wizard.setDoneButton(Operation.deploy); should.equal(wizard.selectedOperation, Operation.deploy); + + wizard.setDoneButton(Operation.generateDeployScript); + should.equal(wizard.selectedOperation, Operation.generateDeployScript); + + wizard.setDoneButton(Operation.extract); + should.equal(wizard.selectedOperation, Operation.extract); + + wizard.setDoneButton(Operation.import); + should.equal(wizard.selectedOperation, Operation.import); + + wizard.setDoneButton(Operation.export); + should.equal(wizard.selectedOperation, Operation.export); }); }); diff --git a/extensions/dacpac/src/wizard/dataTierApplicationWizard.ts b/extensions/dacpac/src/wizard/dataTierApplicationWizard.ts index b0232b7faf..d89d24b25b 100644 --- a/extensions/dacpac/src/wizard/dataTierApplicationWizard.ts +++ b/extensions/dacpac/src/wizard/dataTierApplicationWizard.ts @@ -79,7 +79,7 @@ export enum PageName { export class DataTierApplicationWizard { public wizard: azdata.window.Wizard; private connection: azdata.connection.ConnectionProfile; - private model: DacFxDataModel; + public model: DacFxDataModel; public pages: Map = new Map(); public selectedOperation: Operation; @@ -331,7 +331,7 @@ export class DataTierApplicationWizard { return page; } - private isSummaryPage(idx: number): boolean { + public isSummaryPage(idx: number): boolean { return this.selectedOperation === Operation.import && idx === ImportOperationPath.summary || this.selectedOperation === Operation.export && idx === ExportOperationPath.summary || this.selectedOperation === Operation.extract && idx === ExtractOperationPath.summary