Add DacFx summary page tests (#11519)

* remove generate script operation

* add tests for summary page

* add a couple more checks
This commit is contained in:
Kim Santiago
2020-07-31 10:18:21 -07:00
committed by GitHub
parent 89753577ab
commit 9c1168ba3b
5 changed files with 116 additions and 40 deletions

View File

@@ -0,0 +1,85 @@
/*---------------------------------------------------------------------------------------------
* Copyright (c) Microsoft Corporation. All rights reserved.
* Licensed under the Source EULA. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/
import 'mocha';
import * as should from 'should';
import { DataTierApplicationWizard, PageName, Operation } from '../wizard/dataTierApplicationWizard';
import { DacFxDataModel } from '../wizard/api/models';
import { TestContext, createContext } from './testContext';
import { TestDacFxSummaryPage } from './testDacFxConfigPages';
let wizard: DataTierApplicationWizard;
let testContext: TestContext;
describe('DacFx Summary Page Tests', function (): void {
beforeEach(async function (): Promise<void> {
wizard = new DataTierApplicationWizard();
wizard.model = <DacFxDataModel>{};
wizard.model.server = undefined;
wizard.setPages();
wizard.configureButtons();
testContext = createContext();
});
it('DacFx Summary Page should start correctly for deploying to an existing database', async () => {
wizard.selectedOperation = Operation.deploy;
wizard.model.upgradeExisting = true;
const summaryPage = await validatePageCreation();
should(summaryPage.WizardState.wizard.generateScriptButton.hidden).equal(false, 'Generate script button should not be hidden when the operation is deploy and upgrade existing is true');
await validateOnPageLeave(summaryPage);
});
it('DacFx Summary Page should start correctly for deploying to a new database', async () => {
wizard.selectedOperation = Operation.deploy;
wizard.model.upgradeExisting = false;
const summaryPage = await validatePageCreation();
should(summaryPage.WizardState.wizard.generateScriptButton.hidden).equal(true, 'Generate script button should be hidden when deploying to a new database');
await validateOnPageLeave(summaryPage);
});
it('DacFx Summary Page should start correctly for extract', async () => {
wizard.selectedOperation = Operation.extract;
const summaryPage = await validatePageCreation();
should(summaryPage.WizardState.wizard.generateScriptButton.hidden).equal(true, 'Generate script button should be hidden when extracting');
await validateOnPageLeave(summaryPage);
});
it('DacFx Summary Page should start correctly for import', async () => {
wizard.selectedOperation = Operation.import;
const summaryPage = await validatePageCreation();
should(summaryPage.WizardState.wizard.generateScriptButton.hidden).equal(true, 'Generate script button should be hidden when importing');
await validateOnPageLeave(summaryPage);
});
it('DacFx Summary Page should start correctly for exporting', async () => {
wizard.selectedOperation = Operation.export;
const summaryPage = await validatePageCreation();
should(summaryPage.WizardState.wizard.generateScriptButton.hidden).equal(true, 'Generate script button should be hidden when exporting');
await validateOnPageLeave(summaryPage);
});
async function validatePageCreation(): Promise<TestDacFxSummaryPage> {
const summaryPage: TestDacFxSummaryPage = new TestDacFxSummaryPage(wizard, wizard.pages.get(PageName.selectOperation).wizardPage, wizard.model, testContext.viewContext.view);
const onPageStart = await summaryPage.start();
const onPageEnter = await summaryPage.onPageEnter();
should(onPageStart).equal(true);
should(onPageEnter).equal(true);
should(summaryPage.data).not.equal(undefined);
should(summaryPage.data.length).equal(summaryPage.WizardState.selectedOperation === Operation.extract ? 4 : 3);
return summaryPage;
}
async function validateOnPageLeave(summaryPage: TestDacFxSummaryPage): Promise<void> {
const onPageLeave = await summaryPage.onPageLeave();
should(onPageLeave).equal(true);
should(summaryPage.WizardState.wizard.generateScriptButton.hidden).equal(true, 'Generate Script button should be hidden when leaving the summary page');
}
});

View File

@@ -10,6 +10,7 @@ import { ExtractConfigPage } from '../wizard/pages/extractConfigPage';
import { DataTierApplicationWizard } from '../wizard/dataTierApplicationWizard'; import { DataTierApplicationWizard } from '../wizard/dataTierApplicationWizard';
import { SelectOperationPage } from '../wizard/pages/selectOperationpage'; import { SelectOperationPage } from '../wizard/pages/selectOperationpage';
import { ImportConfigPage } from '../wizard/pages/importConfigPage'; import { ImportConfigPage } from '../wizard/pages/importConfigPage';
import { DacFxSummaryPage } from '../wizard/pages/dacFxSummaryPage';
export class TestDeployConfigPage extends DeployConfigPage { export class TestDeployConfigPage extends DeployConfigPage {
constructor(instance: DataTierApplicationWizard, wizardPage: azdata.window.WizardPage, model: DacFxDataModel, view: azdata.ModelView) { constructor(instance: DataTierApplicationWizard, wizardPage: azdata.window.WizardPage, model: DacFxDataModel, view: azdata.ModelView) {
@@ -58,3 +59,13 @@ export class TestImportConfigPage extends ImportConfigPage {
return this.model; return this.model;
} }
} }
export class TestDacFxSummaryPage extends DacFxSummaryPage {
constructor(instance: DataTierApplicationWizard, wizardPage: azdata.window.WizardPage, model: DacFxDataModel, view: azdata.ModelView) {
super(instance, wizardPage, model, view);
}
get WizardState(): DataTierApplicationWizard {
return this.instance;
}
}

View File

@@ -74,10 +74,6 @@ describe('Dacfx wizard', function (): void {
wizard.model.upgradeExisting = true; wizard.model.upgradeExisting = true;
should.equal(wizard.isSummaryPage(3), 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 // summary page should be 2 for import
wizard.selectedOperation = Operation.import; wizard.selectedOperation = Operation.import;
should.equal(wizard.isSummaryPage(2), true); should.equal(wizard.isSummaryPage(2), true);
@@ -95,9 +91,6 @@ describe('Dacfx wizard', function (): void {
wizard.setDoneButton(Operation.deploy); wizard.setDoneButton(Operation.deploy);
should.equal(wizard.selectedOperation, Operation.deploy); should.equal(wizard.selectedOperation, Operation.deploy);
wizard.setDoneButton(Operation.generateDeployScript);
should.equal(wizard.selectedOperation, Operation.generateDeployScript);
wizard.setDoneButton(Operation.extract); wizard.setDoneButton(Operation.extract);
should.equal(wizard.selectedOperation, Operation.extract); should.equal(wizard.selectedOperation, Operation.extract);

View File

@@ -31,8 +31,7 @@ export enum Operation {
deploy, deploy,
extract, extract,
import, import,
export, export
generateDeployScript
} }
export enum DeployOperationPath { export enum DeployOperationPath {
@@ -117,10 +116,7 @@ export class DataTierApplicationWizard {
this.model.serverId = this.connection.connectionId; this.model.serverId = this.connection.connectionId;
this.setPages(); this.setPages();
this.configureButtons();
this.wizard.generateScriptButton.hidden = true;
this.wizard.generateScriptButton.onClick(async () => await this.generateDeployScript());
this.wizard.doneButton.onClick(async () => await this.executeOperation());
this.wizard.open(); this.wizard.open();
return true; return true;
@@ -206,6 +202,12 @@ export class DataTierApplicationWizard {
this.wizard.pages = [selectOperationWizardPage, deployConfigWizardPage, deployPlanWizardPage, summaryWizardPage]; this.wizard.pages = [selectOperationWizardPage, deployConfigWizardPage, deployPlanWizardPage, summaryWizardPage];
} }
public configureButtons(): void {
this.wizard.generateScriptButton.hidden = true;
this.wizard.generateScriptButton.onClick(async () => await this.generateDeployScript());
this.wizard.doneButton.onClick(async () => await this.executeOperation());
}
public registerNavigationValidator(validator: (pageChangeInfo: azdata.window.WizardPageChangeInfo) => boolean) { public registerNavigationValidator(validator: (pageChangeInfo: azdata.window.WizardPageChangeInfo) => boolean) {
this.wizard.registerNavigationValidator(validator); this.wizard.registerNavigationValidator(validator);
} }
@@ -232,14 +234,9 @@ export class DataTierApplicationWizard {
this.selectedOperation = Operation.export; this.selectedOperation = Operation.export;
break; break;
} }
case Operation.generateDeployScript: {
this.wizard.doneButton.label = loc.generateScript;
this.selectedOperation = Operation.generateDeployScript;
break;
}
} }
if (operation !== Operation.deploy && operation !== Operation.generateDeployScript) { if (operation !== Operation.deploy) {
this.model.upgradeExisting = false; this.model.upgradeExisting = false;
} }
} }
@@ -258,9 +255,6 @@ export class DataTierApplicationWizard {
case Operation.export: { case Operation.export: {
return await this.export(); return await this.export();
} }
case Operation.generateDeployScript: {
return await this.generateDeployScript();
}
} }
} }
@@ -328,7 +322,7 @@ export class DataTierApplicationWizard {
} }
} else if (this.isSummaryPage(idx)) { } else if (this.isSummaryPage(idx)) {
page = this.pages.get(PageName.summary); page = this.pages.get(PageName.summary);
} else if ((this.selectedOperation === Operation.deploy || this.selectedOperation === Operation.generateDeployScript) && idx === DeployOperationPath.deployPlan) { } else if ((this.selectedOperation === Operation.deploy) && idx === DeployOperationPath.deployPlan) {
page = this.pages.get(PageName.deployPlan); page = this.pages.get(PageName.deployPlan);
} }
@@ -340,7 +334,7 @@ export class DataTierApplicationWizard {
|| this.selectedOperation === Operation.export && idx === ExportOperationPath.summary || this.selectedOperation === Operation.export && idx === ExportOperationPath.summary
|| this.selectedOperation === Operation.extract && idx === ExtractOperationPath.summary || this.selectedOperation === Operation.extract && idx === ExtractOperationPath.summary
|| this.selectedOperation === Operation.deploy && !this.model.upgradeExisting && idx === DeployNewOperationPath.summary || this.selectedOperation === Operation.deploy && !this.model.upgradeExisting && idx === DeployNewOperationPath.summary
|| (this.selectedOperation === Operation.deploy || this.selectedOperation === Operation.generateDeployScript) && idx === DeployOperationPath.summary; || (this.selectedOperation === Operation.deploy) && idx === DeployOperationPath.summary;
} }
public async generateDeployPlan(): Promise<string> { public async generateDeployPlan(): Promise<string> {

View File

@@ -13,6 +13,7 @@ export class DacFxSummaryPage extends BasePage {
private form: azdata.FormContainer; private form: azdata.FormContainer;
private table: azdata.TableComponent; private table: azdata.TableComponent;
private loader: azdata.LoadingComponent; private loader: azdata.LoadingComponent;
public data: string[][];
public constructor(instance: DataTierApplicationWizard, wizardPage: azdata.window.WizardPage, model: DacFxDataModel, view: azdata.ModelView) { public constructor(instance: DataTierApplicationWizard, wizardPage: azdata.window.WizardPage, model: DacFxDataModel, view: azdata.ModelView) {
super(instance, wizardPage, model, view); super(instance, wizardPage, model, view);
@@ -36,7 +37,7 @@ export class DacFxSummaryPage extends BasePage {
} }
async onPageEnter(): Promise<boolean> { async onPageEnter(): Promise<boolean> {
this.populateTable(); await this.populateTable();
this.loader.loading = false; this.loader.loading = false;
if (this.model.upgradeExisting && this.instance.selectedOperation === Operation.deploy) { if (this.model.upgradeExisting && this.instance.selectedOperation === Operation.deploy) {
this.instance.wizard.generateScriptButton.hidden = false; this.instance.wizard.generateScriptButton.hidden = false;
@@ -61,8 +62,7 @@ export class DacFxSummaryPage extends BasePage {
}); });
} }
private populateTable() { private async populateTable(): Promise<void> {
let data = [];
let targetServer = loc.targetServer; let targetServer = loc.targetServer;
let targetDatabase = loc.targetDatabase; let targetDatabase = loc.targetDatabase;
let sourceServer = loc.sourceServer; let sourceServer = loc.sourceServer;
@@ -71,14 +71,14 @@ export class DacFxSummaryPage extends BasePage {
switch (this.instance.selectedOperation) { switch (this.instance.selectedOperation) {
case Operation.deploy: { case Operation.deploy: {
data = [ this.data = [
[targetServer, this.model.serverName], [targetServer, this.model.serverName],
[fileLocation, this.model.filePath], [fileLocation, this.model.filePath],
[targetDatabase, this.model.database]]; [targetDatabase, this.model.database]];
break; break;
} }
case Operation.extract: { case Operation.extract: {
data = [ this.data = [
[sourceServer, this.model.serverName], [sourceServer, this.model.serverName],
[sourceDatabase, this.model.database], [sourceDatabase, this.model.database],
[loc.version, this.model.version], [loc.version, this.model.version],
@@ -86,30 +86,23 @@ export class DacFxSummaryPage extends BasePage {
break; break;
} }
case Operation.import: { case Operation.import: {
data = [ this.data = [
[targetServer, this.model.serverName], [targetServer, this.model.serverName],
[fileLocation, this.model.filePath], [fileLocation, this.model.filePath],
[targetDatabase, this.model.database]]; [targetDatabase, this.model.database]];
break; break;
} }
case Operation.export: { case Operation.export: {
data = [ this.data = [
[sourceServer, this.model.serverName], [sourceServer, this.model.serverName],
[sourceDatabase, this.model.database], [sourceDatabase, this.model.database],
[fileLocation, this.model.filePath]]; [fileLocation, this.model.filePath]];
break; break;
} }
case Operation.generateDeployScript: {
data = [
[targetServer, this.model.serverName],
[fileLocation, this.model.filePath],
[targetDatabase, this.model.database]];
break;
}
} }
this.table.updateProperties({ await this.table.updateProperties({
data: data, data: this.data,
columns: [ columns: [
{ {
value: loc.setting, value: loc.setting,