Add a few dacpac extension tests (#10322)

* add controller test

* Add a few wizard tests

* Addressing comment

* fix compile error
This commit is contained in:
Kim Santiago
2020-05-08 14:04:11 -07:00
committed by GitHub
parent 10ac5fdfab
commit ea84e60fa0
7 changed files with 126 additions and 38 deletions

View File

@@ -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<boolean>;
abstract deactivate(): void;
public dispose(): void {
this.deactivate();
}
}

View File

@@ -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();
}
}

View File

@@ -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<boolean>[] = [];

View File

@@ -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<void> {
testContext = createContext();
});
it('Should create new instance successfully', async function (): Promise<void> {
let controller: MainController;
should.doesNotThrow(() => controller = createController());
should.notEqual(controller.extensionContext, undefined);
});
});

View File

@@ -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
}
};
}

View File

@@ -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<void> {
wizard = new DataTierApplicationWizard();
wizard.model = <DacFxDataModel>{};
});
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);
});
});

View File

@@ -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<string, Page> = new Map<string, Page>();
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