diff --git a/extensions/dacpac/src/test/dacpac.test.ts b/extensions/dacpac/src/test/dacpac.test.ts deleted file mode 100644 index ab4deb304d..0000000000 --- a/extensions/dacpac/src/test/dacpac.test.ts +++ /dev/null @@ -1,112 +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 'mocha'; -import * as should from 'should'; -import * as os from 'os'; -import * as path from 'path'; -import { isValidFilenameCharacter, sanitizeStringForFilename, isValidBasename } from '../wizard/api/utils'; - -const isWindows = os.platform() === 'win32'; - -describe('Sanitize database name for filename tests', function (): void { - it('Should only validate if one character is passed', async () => { - should(isValidFilenameCharacter(null)).equal(false); - should(isValidFilenameCharacter('')).equal(false); - should(isValidFilenameCharacter('abc')).equal(false); - should(isValidFilenameCharacter('c')).equal(true); - }); - - it('Should determine invalid file name characters', async () => { - // invalid for both Windows and non-Windows - should(isValidFilenameCharacter('\\')).equal(false); - should(isValidFilenameCharacter('/')).equal(false); - }); - - it('Should determine invalid Windows file name characters', async () => { - // invalid only for Windows - should(isValidFilenameCharacter('?')).equal(isWindows ? false : true); - should(isValidFilenameCharacter(':')).equal(isWindows ? false : true); - should(isValidFilenameCharacter('*')).equal(isWindows ? false : true); - should(isValidFilenameCharacter('<')).equal(isWindows ? false : true); - should(isValidFilenameCharacter('>')).equal(isWindows ? false : true); - should(isValidFilenameCharacter('|')).equal(isWindows ? false : true); - should(isValidFilenameCharacter('"')).equal(isWindows ? false : true); - }); - - it('Should sanitize database name for filename', async () => { - let invalidDbName = '"in|valid*<>db/?name'; - let expectedWindows = '_in_valid___db__name'; - let expectedNonWindows = '"in|valid*<>db_?name'; - let isWindows = os.platform() === 'win32'; - should(sanitizeStringForFilename(invalidDbName)).equal(isWindows ? expectedWindows : expectedNonWindows); - }); -}); - -describe('Check for invalid filename tests', function (): void { - it('Should determine invalid filenames', async () => { - // valid filename - should(isValidBasename(formatFileName('ValidName.dacpac'))).equal(true); - - // invalid for both Windows and non-Windows - should(isValidBasename(formatFileName(' .dacpac'))).equal(false); - should(isValidBasename(formatFileName(' .dacpac'))).equal(false); - should(isValidBasename(formatFileName(' .dacpac'))).equal(false); - should(isValidBasename(formatFileName('..dacpac'))).equal(false); - should(isValidBasename(formatFileName('...dacpac'))).equal(false); - should(isValidBasename(null)).equal(false); - should(isValidBasename(undefined)).equal(false); - should(isValidBasename('\\')).equal(false); - should(isValidBasename('/')).equal(false); - - // most file systems do not allow files > 255 length - should(isValidBasename(formatFileName('aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.dacpac'))).equal(false); - }); - - it('Should determine invalid Windows filenames', async () => { - // invalid characters only for Windows - should(isValidBasename(formatFileName('?.dacpac'))).equal(isWindows ? false : true); - should(isValidBasename(formatFileName(':.dacpac'))).equal(isWindows ? false : true); - should(isValidBasename(formatFileName('*.dacpac'))).equal(isWindows ? false : true); - should(isValidBasename(formatFileName('<.dacpac'))).equal(isWindows ? false : true); - should(isValidBasename(formatFileName('>.dacpac'))).equal(isWindows ? false : true); - should(isValidBasename(formatFileName('|.dacpac'))).equal(isWindows ? false : true); - should(isValidBasename(formatFileName('".dacpac'))).equal(isWindows ? false : true); - - // Windows filenames cannot end with a whitespace - should(isValidBasename(formatFileName('test .dacpac'))).equal(isWindows ? false : true); - should(isValidBasename(formatFileName('test .dacpac'))).equal(isWindows ? false : true); - }); - - it('Should determine Windows forbidden filenames', async () => { - // invalid only for Windows - should(isValidBasename(formatFileName('CON.dacpac'))).equal(isWindows ? false : true); - should(isValidBasename(formatFileName('PRN.dacpac'))).equal(isWindows ? false : true); - should(isValidBasename(formatFileName('AUX.dacpac'))).equal(isWindows ? false : true); - should(isValidBasename(formatFileName('NUL.dacpac'))).equal(isWindows ? false : true); - should(isValidBasename(formatFileName('COM1.dacpac'))).equal(isWindows ? false : true); - should(isValidBasename(formatFileName('COM2.dacpac'))).equal(isWindows ? false : true); - should(isValidBasename(formatFileName('COM3.dacpac'))).equal(isWindows ? false : true); - should(isValidBasename(formatFileName('COM4.dacpac'))).equal(isWindows ? false : true); - should(isValidBasename(formatFileName('COM5.dacpac'))).equal(isWindows ? false : true); - should(isValidBasename(formatFileName('COM6.dacpac'))).equal(isWindows ? false : true); - should(isValidBasename(formatFileName('COM7.dacpac'))).equal(isWindows ? false : true); - should(isValidBasename(formatFileName('COM8.dacpac'))).equal(isWindows ? false : true); - should(isValidBasename(formatFileName('COM9.dacpac'))).equal(isWindows ? false : true); - should(isValidBasename(formatFileName('LPT1.dacpac'))).equal(isWindows ? false : true); - should(isValidBasename(formatFileName('LPT2.dacpac'))).equal(isWindows ? false : true); - should(isValidBasename(formatFileName('LPT3.dacpac'))).equal(isWindows ? false : true); - should(isValidBasename(formatFileName('LPT4.dacpac'))).equal(isWindows ? false : true); - should(isValidBasename(formatFileName('LPT5.dacpac'))).equal(isWindows ? false : true); - should(isValidBasename(formatFileName('LPT6.dacpac'))).equal(isWindows ? false : true); - should(isValidBasename(formatFileName('LPT7.dacpac'))).equal(isWindows ? false : true); - should(isValidBasename(formatFileName('LPT8.dacpac'))).equal(isWindows ? false : true); - should(isValidBasename(formatFileName('LPT9.dacpac'))).equal(isWindows ? false : true); - }); -}); - -function formatFileName(filename: string): string { - return path.join(os.tmpdir(), filename); -} diff --git a/extensions/dacpac/src/test/utils.test.ts b/extensions/dacpac/src/test/utils.test.ts new file mode 100644 index 0000000000..5656028e0c --- /dev/null +++ b/extensions/dacpac/src/test/utils.test.ts @@ -0,0 +1,200 @@ +/*--------------------------------------------------------------------------------------------- + * 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 * as os from 'os'; +import * as path from 'path'; +import * as loc from '../localizedConstants'; +import { isValidFilenameCharacter, sanitizeStringForFilename, isValidBasename, isValidBasenameErrorMessage, generateDatabaseName } from '../wizard/api/utils'; +import { DeployConfigPage } from '../wizard/pages/deployConfigPage'; + +const isWindows = os.platform() === 'win32'; + +describe('Sanitize database name for filename tests', function (): void { + it('Should only validate if one character is passed', async () => { + should(isValidFilenameCharacter(null)).equal(false); + should(isValidFilenameCharacter('')).equal(false); + should(isValidFilenameCharacter('abc')).equal(false); + should(isValidFilenameCharacter('c')).equal(true); + }); + + it('Should determine invalid file name characters', async () => { + // invalid for both Windows and non-Windows + should(isValidFilenameCharacter('\\')).equal(false); + should(isValidFilenameCharacter('/')).equal(false); + }); + + it('Should determine invalid Windows file name characters', async () => { + // invalid only for Windows + should(isValidFilenameCharacter('?')).equal(isWindows ? false : true); + should(isValidFilenameCharacter(':')).equal(isWindows ? false : true); + should(isValidFilenameCharacter('*')).equal(isWindows ? false : true); + should(isValidFilenameCharacter('<')).equal(isWindows ? false : true); + should(isValidFilenameCharacter('>')).equal(isWindows ? false : true); + should(isValidFilenameCharacter('|')).equal(isWindows ? false : true); + should(isValidFilenameCharacter('"')).equal(isWindows ? false : true); + }); + + it('Should sanitize database name for filename', async () => { + let invalidDbName = '"in|valid*<>db/?name'; + let expectedWindows = '_in_valid___db__name'; + let expectedNonWindows = '"in|valid*<>db_?name'; + let isWindows = os.platform() === 'win32'; + should(sanitizeStringForFilename(invalidDbName)).equal(isWindows ? expectedWindows : expectedNonWindows); + }); +}); + +describe('Check for invalid filename tests', function (): void { + it('Should determine invalid filenames', async () => { + // valid filename + should(isValidBasename(formatFileName('ValidName.dacpac'))).equal(true); + + // invalid for both Windows and non-Windows + should(isValidBasename(formatFileName(' .dacpac'))).equal(false); + should(isValidBasename(formatFileName(' .dacpac'))).equal(false); + should(isValidBasename(formatFileName(' .dacpac'))).equal(false); + should(isValidBasename(formatFileName('..dacpac'))).equal(false); + should(isValidBasename(formatFileName('...dacpac'))).equal(false); + should(isValidBasename(null)).equal(false); + should(isValidBasename(undefined)).equal(false); + should(isValidBasename('\\')).equal(false); + should(isValidBasename('/')).equal(false); + + // most file systems do not allow files > 255 length + should(isValidBasename(formatFileName('aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.dacpac'))).equal(false); + }); + + it('Should determine invalid Windows filenames', async () => { + // invalid characters only for Windows + should(isValidBasename(formatFileName('?.dacpac'))).equal(isWindows ? false : true); + should(isValidBasename(formatFileName(':.dacpac'))).equal(isWindows ? false : true); + should(isValidBasename(formatFileName('*.dacpac'))).equal(isWindows ? false : true); + should(isValidBasename(formatFileName('<.dacpac'))).equal(isWindows ? false : true); + should(isValidBasename(formatFileName('>.dacpac'))).equal(isWindows ? false : true); + should(isValidBasename(formatFileName('|.dacpac'))).equal(isWindows ? false : true); + should(isValidBasename(formatFileName('".dacpac'))).equal(isWindows ? false : true); + + // Windows filenames cannot end with a whitespace + should(isValidBasename(formatFileName('test .dacpac'))).equal(isWindows ? false : true); + should(isValidBasename(formatFileName('test .dacpac'))).equal(isWindows ? false : true); + }); + + it('Should determine Windows forbidden filenames', async () => { + // invalid only for Windows + should(isValidBasename(formatFileName('CON.dacpac'))).equal(isWindows ? false : true); + should(isValidBasename(formatFileName('PRN.dacpac'))).equal(isWindows ? false : true); + should(isValidBasename(formatFileName('AUX.dacpac'))).equal(isWindows ? false : true); + should(isValidBasename(formatFileName('NUL.dacpac'))).equal(isWindows ? false : true); + should(isValidBasename(formatFileName('COM1.dacpac'))).equal(isWindows ? false : true); + should(isValidBasename(formatFileName('COM2.dacpac'))).equal(isWindows ? false : true); + should(isValidBasename(formatFileName('COM3.dacpac'))).equal(isWindows ? false : true); + should(isValidBasename(formatFileName('COM4.dacpac'))).equal(isWindows ? false : true); + should(isValidBasename(formatFileName('COM5.dacpac'))).equal(isWindows ? false : true); + should(isValidBasename(formatFileName('COM6.dacpac'))).equal(isWindows ? false : true); + should(isValidBasename(formatFileName('COM7.dacpac'))).equal(isWindows ? false : true); + should(isValidBasename(formatFileName('COM8.dacpac'))).equal(isWindows ? false : true); + should(isValidBasename(formatFileName('COM9.dacpac'))).equal(isWindows ? false : true); + should(isValidBasename(formatFileName('LPT1.dacpac'))).equal(isWindows ? false : true); + should(isValidBasename(formatFileName('LPT2.dacpac'))).equal(isWindows ? false : true); + should(isValidBasename(formatFileName('LPT3.dacpac'))).equal(isWindows ? false : true); + should(isValidBasename(formatFileName('LPT4.dacpac'))).equal(isWindows ? false : true); + should(isValidBasename(formatFileName('LPT5.dacpac'))).equal(isWindows ? false : true); + should(isValidBasename(formatFileName('LPT6.dacpac'))).equal(isWindows ? false : true); + should(isValidBasename(formatFileName('LPT7.dacpac'))).equal(isWindows ? false : true); + should(isValidBasename(formatFileName('LPT8.dacpac'))).equal(isWindows ? false : true); + should(isValidBasename(formatFileName('LPT9.dacpac'))).equal(isWindows ? false : true); + }); +}); + +describe('Check for invalid filename error tests', function (): void { + it('Should determine invalid filenames', async () => { + // valid filename + should(isValidBasenameErrorMessage(formatFileName('ValidName.dacpac'))).equal(''); + + // invalid for both Windows and non-Windows + should(isValidBasenameErrorMessage(formatFileName(' .dacpac'))).equal(loc.whitespaceFilenameErrorMessage); + should(isValidBasenameErrorMessage(formatFileName(' .dacpac'))).equal(loc.whitespaceFilenameErrorMessage); + should(isValidBasenameErrorMessage(formatFileName(' .dacpac'))).equal(loc.whitespaceFilenameErrorMessage); + should(isValidBasenameErrorMessage(formatFileName('..dacpac'))).equal(loc.reservedValueErrorMessage); + should(isValidBasenameErrorMessage(formatFileName('...dacpac'))).equal(loc.reservedValueErrorMessage); + should(isValidBasenameErrorMessage(null)).equal(loc.undefinedFilenameErrorMessage); + should(isValidBasenameErrorMessage(undefined)).equal(loc.undefinedFilenameErrorMessage); + should(isValidBasenameErrorMessage('\\')).equal(isWindows ? loc.whitespaceFilenameErrorMessage : loc.invalidFileCharsErrorMessage); + should(isValidBasenameErrorMessage('/')).equal(loc.whitespaceFilenameErrorMessage); + + // most file systems do not allow files > 255 length + should(isValidBasenameErrorMessage(formatFileName('aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.dacpac'))).equal(loc.tooLongFilenameErrorMessage); + }); + + it('Should determine invalid Windows filenames', async () => { + // invalid characters only for Windows + should(isValidBasenameErrorMessage(formatFileName('?.dacpac'))).equal(isWindows ? loc.invalidFileCharsErrorMessage : ''); + should(isValidBasenameErrorMessage(formatFileName(':.dacpac'))).equal(isWindows ? loc.invalidFileCharsErrorMessage : ''); + should(isValidBasenameErrorMessage(formatFileName('*.dacpac'))).equal(isWindows ? loc.invalidFileCharsErrorMessage : ''); + should(isValidBasenameErrorMessage(formatFileName('<.dacpac'))).equal(isWindows ? loc.invalidFileCharsErrorMessage : ''); + should(isValidBasenameErrorMessage(formatFileName('>.dacpac'))).equal(isWindows ? loc.invalidFileCharsErrorMessage : ''); + should(isValidBasenameErrorMessage(formatFileName('|.dacpac'))).equal(isWindows ? loc.invalidFileCharsErrorMessage : ''); + should(isValidBasenameErrorMessage(formatFileName('".dacpac'))).equal(isWindows ? loc.invalidFileCharsErrorMessage : ''); + + // Windows filenames cannot end with a whitespace + should(isValidBasenameErrorMessage(formatFileName('test .dacpac'))).equal(isWindows ? loc.trailingWhitespaceErrorMessage : ''); + should(isValidBasenameErrorMessage(formatFileName('test .dacpac'))).equal(isWindows ? loc.trailingWhitespaceErrorMessage : ''); + }); + + it('Should determine Windows forbidden filenames', async () => { + // invalid only for Windows + should(isValidBasenameErrorMessage(formatFileName('CON.dacpac'))).equal(isWindows ? loc.reservedWindowsFilenameErrorMessage : ''); + should(isValidBasenameErrorMessage(formatFileName('PRN.dacpac'))).equal(isWindows ? loc.reservedWindowsFilenameErrorMessage : ''); + should(isValidBasenameErrorMessage(formatFileName('AUX.dacpac'))).equal(isWindows ? loc.reservedWindowsFilenameErrorMessage : ''); + should(isValidBasenameErrorMessage(formatFileName('NUL.dacpac'))).equal(isWindows ? loc.reservedWindowsFilenameErrorMessage : ''); + should(isValidBasenameErrorMessage(formatFileName('COM1.dacpac'))).equal(isWindows ? loc.reservedWindowsFilenameErrorMessage : ''); + should(isValidBasenameErrorMessage(formatFileName('COM2.dacpac'))).equal(isWindows ? loc.reservedWindowsFilenameErrorMessage : ''); + should(isValidBasenameErrorMessage(formatFileName('COM3.dacpac'))).equal(isWindows ? loc.reservedWindowsFilenameErrorMessage : ''); + should(isValidBasenameErrorMessage(formatFileName('COM4.dacpac'))).equal(isWindows ? loc.reservedWindowsFilenameErrorMessage : ''); + should(isValidBasenameErrorMessage(formatFileName('COM5.dacpac'))).equal(isWindows ? loc.reservedWindowsFilenameErrorMessage : ''); + should(isValidBasenameErrorMessage(formatFileName('COM6.dacpac'))).equal(isWindows ? loc.reservedWindowsFilenameErrorMessage : ''); + should(isValidBasenameErrorMessage(formatFileName('COM7.dacpac'))).equal(isWindows ? loc.reservedWindowsFilenameErrorMessage : ''); + should(isValidBasenameErrorMessage(formatFileName('COM8.dacpac'))).equal(isWindows ? loc.reservedWindowsFilenameErrorMessage : ''); + should(isValidBasenameErrorMessage(formatFileName('COM9.dacpac'))).equal(isWindows ? loc.reservedWindowsFilenameErrorMessage : ''); + should(isValidBasenameErrorMessage(formatFileName('LPT1.dacpac'))).equal(isWindows ? loc.reservedWindowsFilenameErrorMessage : ''); + should(isValidBasenameErrorMessage(formatFileName('LPT2.dacpac'))).equal(isWindows ? loc.reservedWindowsFilenameErrorMessage : ''); + should(isValidBasenameErrorMessage(formatFileName('LPT3.dacpac'))).equal(isWindows ? loc.reservedWindowsFilenameErrorMessage : ''); + should(isValidBasenameErrorMessage(formatFileName('LPT4.dacpac'))).equal(isWindows ? loc.reservedWindowsFilenameErrorMessage : ''); + should(isValidBasenameErrorMessage(formatFileName('LPT5.dacpac'))).equal(isWindows ? loc.reservedWindowsFilenameErrorMessage : ''); + should(isValidBasenameErrorMessage(formatFileName('LPT6.dacpac'))).equal(isWindows ? loc.reservedWindowsFilenameErrorMessage : ''); + should(isValidBasenameErrorMessage(formatFileName('LPT7.dacpac'))).equal(isWindows ? loc.reservedWindowsFilenameErrorMessage : ''); + should(isValidBasenameErrorMessage(formatFileName('LPT8.dacpac'))).equal(isWindows ? loc.reservedWindowsFilenameErrorMessage : ''); + should(isValidBasenameErrorMessage(formatFileName('LPT9.dacpac'))).equal(isWindows ? loc.reservedWindowsFilenameErrorMessage : ''); + }); +}); + + +describe('Generate database name from file path tests', function (): void { + it('Should generate database name correctly', async () => { + should(generateDatabaseName('')).equal(''); + should(generateDatabaseName('c:\\test\\name.dacpac')).equal(isWindows ? 'name' : 'c:\\test\\name'); + should(generateDatabaseName('c:\\test\\name.bacpac')).equal(isWindows ? 'name' : 'c:\\test\\name'); + should(generateDatabaseName('~/users/test/name.dacpac')).equal('name'); + should(generateDatabaseName('~/users/test/name.bacpac')).equal('name'); + should(generateDatabaseName('name.dacpac')).equal('name'); + }); +}); + +describe('Check for unique database name tests', function (): void { + it('Should determine if database name is unique correctly', async () => { + let page: DeployConfigPage = new DeployConfigPage(undefined, undefined, undefined, undefined); + page.databaseValues = ['db1', 'test']; + should(page.databaseNameExists('db1')).equal(true); + should(page.databaseNameExists('test')).equal(true); + should(page.databaseNameExists('Test')).equal(true); + should(page.databaseNameExists('TEST')).equal(true); + should(page.databaseNameExists('db2')).equal(false); + }); +}); + +function formatFileName(filename: string): string { + return path.join(os.tmpdir(), filename); +} diff --git a/extensions/dacpac/src/test/wizard.test.ts b/extensions/dacpac/src/test/wizard.test.ts new file mode 100644 index 0000000000..20893df070 --- /dev/null +++ b/extensions/dacpac/src/test/wizard.test.ts @@ -0,0 +1,25 @@ +/*--------------------------------------------------------------------------------------------- + * 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 * as loc from '../localizedConstants'; +import { DataTierApplicationWizard, Operation } from '../wizard/dataTierApplicationWizard'; + +describe('Dacfx wizard', function (): void { + it('Should initialize wizard correctly', async () => { + let wizard = new DataTierApplicationWizard(); + should.notEqual(wizard.wizard, undefined); + should.equal(wizard.wizard.title, loc.wizardTitle); + + wizard.setPages(); + should.notEqual(wizard.pages, undefined); + should.equal(wizard.pages.size, 7); + should.equal(wizard.wizard.pages.length, 4); + + wizard.setDoneButton(Operation.deploy); + should.equal(wizard.selectedOperation, Operation.deploy); + }); +}); diff --git a/extensions/dacpac/src/wizard/api/basePage.ts b/extensions/dacpac/src/wizard/api/basePage.ts index 1e13b8a68f..159bdf2f27 100644 --- a/extensions/dacpac/src/wizard/api/basePage.ts +++ b/extensions/dacpac/src/wizard/api/basePage.ts @@ -12,7 +12,7 @@ export abstract class BasePage { protected readonly wizardPage: azdata.window.WizardPage; protected readonly model: DacFxDataModel; protected readonly view: azdata.ModelView; - protected databaseValues: string[]; + public databaseValues: string[]; /** * This method constructs all the elements of the page. diff --git a/extensions/dacpac/src/wizard/api/dacFxConfigPage.ts b/extensions/dacpac/src/wizard/api/dacFxConfigPage.ts index 53146838c0..8fe5efc220 100644 --- a/extensions/dacpac/src/wizard/api/dacFxConfigPage.ts +++ b/extensions/dacpac/src/wizard/api/dacFxConfigPage.ts @@ -207,7 +207,7 @@ export abstract class DacFxConfigPage extends BasePage { } // Compares database name with existing databases on the server - protected databaseNameExists(n: string): boolean { + public databaseNameExists(n: string): boolean { for (let i = 0; i < this.databaseValues.length; ++i) { if (this.databaseValues[i].toLowerCase() === n.toLowerCase()) { // database name exists diff --git a/extensions/dacpac/src/wizard/api/utils.ts b/extensions/dacpac/src/wizard/api/utils.ts index 315aaf03cd..d0f2ce9b1c 100644 --- a/extensions/dacpac/src/wizard/api/utils.ts +++ b/extensions/dacpac/src/wizard/api/utils.ts @@ -120,7 +120,7 @@ export function isValidBasenameErrorMessage(name: string | null | undefined): st } if (basename === '.' || basename === '..') { - return loc.reservedWindowsFilenameErrorMessage; // check for reserved values + return loc.reservedValueErrorMessage; // check for reserved values } if (isWindows && basename.length !== basename.trim().length) { @@ -133,3 +133,7 @@ export function isValidBasenameErrorMessage(name: string | null | undefined): st return ''; } + +export function generateDatabaseName(filePath: string): string { + return path.parse(filePath).name; +} diff --git a/extensions/dacpac/src/wizard/dataTierApplicationWizard.ts b/extensions/dacpac/src/wizard/dataTierApplicationWizard.ts index ea443bad47..b0232b7faf 100644 --- a/extensions/dacpac/src/wizard/dataTierApplicationWizard.ts +++ b/extensions/dacpac/src/wizard/dataTierApplicationWizard.ts @@ -84,6 +84,7 @@ export class DataTierApplicationWizard { public selectedOperation: Operation; constructor() { + this.wizard = azdata.window.createWizard(loc.wizardTitle); } public async start(p: any, ...args: any[]) { @@ -107,8 +108,16 @@ export class DataTierApplicationWizard { } this.model.serverId = this.connection.connectionId; + this.setPages(); - this.wizard = azdata.window.createWizard(loc.wizardTitle); + this.wizard.generateScriptButton.hidden = true; + this.wizard.generateScriptButton.onClick(async () => await this.generateDeployScript()); + this.wizard.doneButton.onClick(async () => await this.executeOperation()); + + this.wizard.open(); + } + + public setPages(): void { let selectOperationWizardPage = azdata.window.createWizardPage(loc.selectOperationPageName); let deployConfigWizardPage = azdata.window.createWizardPage(loc.deployConfigPageName); let deployPlanWizardPage = azdata.window.createWizardPage(loc.deployPlanPageName); @@ -186,11 +195,6 @@ export class DataTierApplicationWizard { }); this.wizard.pages = [selectOperationWizardPage, deployConfigWizardPage, deployPlanWizardPage, summaryWizardPage]; - this.wizard.generateScriptButton.hidden = true; - this.wizard.generateScriptButton.onClick(async () => await this.generateDeployScript()); - this.wizard.doneButton.onClick(async () => await this.executeOperation()); - - this.wizard.open(); } public registerNavigationValidator(validator: (pageChangeInfo: azdata.window.WizardPageChangeInfo) => boolean) { diff --git a/extensions/dacpac/src/wizard/pages/deployConfigPage.ts b/extensions/dacpac/src/wizard/pages/deployConfigPage.ts index 7e045601e4..28d5f77903 100644 --- a/extensions/dacpac/src/wizard/pages/deployConfigPage.ts +++ b/extensions/dacpac/src/wizard/pages/deployConfigPage.ts @@ -5,11 +5,11 @@ import * as azdata from 'azdata'; import * as vscode from 'vscode'; -import * as path from 'path'; import * as loc from '../../localizedConstants'; import { DacFxDataModel } from '../api/models'; import { DataTierApplicationWizard, DeployOperationPath, Operation, DeployNewOperationPath, PageName } from '../dataTierApplicationWizard'; import { DacFxConfigPage } from '../api/dacFxConfigPage'; +import { generateDatabaseName } from '../api/utils'; export class DeployConfigPage extends DacFxConfigPage { @@ -88,7 +88,7 @@ export class DeployConfigPage extends DacFxConfigPage { this.fileTextBox.onTextChanged(async () => { this.model.filePath = this.fileTextBox.value; - this.databaseTextBox.value = this.generateDatabaseName(this.model.filePath); + this.databaseTextBox.value = generateDatabaseName(this.model.filePath); if (!this.model.upgradeExisting) { this.model.database = this.databaseTextBox.value; } @@ -200,9 +200,4 @@ export class DeployConfigPage extends DacFxConfigPage { this.databaseLoader.loading = false; return true; } - - private generateDatabaseName(filePath: string): string { - let result = path.parse(filePath); - return result.name; - } } diff --git a/extensions/dacpac/src/wizard/pages/importConfigPage.ts b/extensions/dacpac/src/wizard/pages/importConfigPage.ts index 89c7ce9dee..ddc6f99a44 100644 --- a/extensions/dacpac/src/wizard/pages/importConfigPage.ts +++ b/extensions/dacpac/src/wizard/pages/importConfigPage.ts @@ -5,11 +5,11 @@ import * as azdata from 'azdata'; import * as vscode from 'vscode'; -import * as path from 'path'; import * as loc from '../../localizedConstants'; import { DacFxDataModel } from '../api/models'; import { DataTierApplicationWizard } from '../dataTierApplicationWizard'; import { DacFxConfigPage } from '../api/dacFxConfigPage'; +import { generateDatabaseName } from '../api/utils'; export class ImportConfigPage extends DacFxConfigPage { @@ -75,13 +75,13 @@ export class ImportConfigPage extends DacFxConfigPage { let fileUri = fileUris[0]; this.fileTextBox.value = fileUri.fsPath; this.model.filePath = fileUri.fsPath; - this.model.database = this.generateDatabaseName(this.model.filePath); + this.model.database = generateDatabaseName(this.model.filePath); this.databaseTextBox.value = this.model.database; }); this.fileTextBox.onTextChanged(async () => { this.model.filePath = this.fileTextBox.value; - this.model.database = this.generateDatabaseName(this.model.filePath); + this.model.database = generateDatabaseName(this.model.filePath); this.databaseTextBox.value = this.model.database; }); @@ -91,9 +91,4 @@ export class ImportConfigPage extends DacFxConfigPage { actions: [this.fileButton] }; } - - private generateDatabaseName(filePath: string): string { - let result = path.parse(filePath); - return result.name; - } }