diff --git a/extensions/import/package.json b/extensions/import/package.json index 58eee186dd..85aed74cfe 100644 --- a/extensions/import/package.json +++ b/extensions/import/package.json @@ -73,10 +73,12 @@ "devDependencies": { "@types/mocha": "^5.2.5", "@types/node": "^12.11.7", + "@types/sinon": "^9.0.4", "mocha": "^5.2.0", "mocha-junit-reporter": "^1.17.0", "mocha-multi-reporters": "^1.1.7", "should": "^13.2.1", + "sinon": "^9.0.2", "typemoq": "^2.1.0", "vscodetestcover": "^1.0.9" }, diff --git a/extensions/import/src/common/apiWrapper.ts b/extensions/import/src/common/apiWrapper.ts deleted file mode 100644 index a6e6ab7cb8..0000000000 --- a/extensions/import/src/common/apiWrapper.ts +++ /dev/null @@ -1,88 +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'; -import * as azdata from 'azdata'; -/** - * Wrapper class to act as a facade over VSCode and Data APIs and allow us to test/mock callbacks into - * this API from our code - */ - -export class ApiWrapper { - - public createOutputChannel(name: string): vscode.OutputChannel { - return vscode.window.createOutputChannel(name); - } - - public getExtension(extensionId: string): vscode.Extension | undefined { - return vscode.extensions.getExtension(extensionId); - } - - public getUriForConnection(connectionId: string): Thenable { - return azdata.connection.getUriForConnection(connectionId); - } - - public getProvider(providerId: string, providerType: azdata.DataProviderType): T { - return azdata.dataprotocol.getProvider(providerId, providerType); - } - - public getCurrentConnection(): Thenable { - return azdata.connection.getCurrentConnection(); - } - - public openConnectionDialog(providers?: string[]): Thenable { - return azdata.connection.openConnectionDialog(providers); - } - - public showErrorMessage(message: string, ...items: string[]): Thenable { - return vscode.window.showErrorMessage(message, ...items); - } - - public createWizard(title: string): azdata.window.Wizard { - return azdata.window.createWizard(title); - } - - public createWizardPage(title: string): azdata.window.WizardPage { - return azdata.window.createWizardPage(title); - } - - public createButton(lable: string) { - return azdata.window.createButton(lable); - } - - public showOpenDialog(options: vscode.OpenDialogOptions): Thenable { - return vscode.window.showOpenDialog(options); - } - - public getActiveConnections(): Thenable { - return azdata.connection.getActiveConnections(); - } - - public listDatabases(connectionId: string): Thenable { - return azdata.connection.listDatabases(connectionId); - } - - public openExternal(target: vscode.Uri): Thenable { - return vscode.env.openExternal(target); - } - - public getConfiguration(section?: string, resource?: vscode.Uri | null): vscode.WorkspaceConfiguration { - return vscode.workspace.getConfiguration(section, resource); - } - - public registerTask(task: string, callback: azdata.tasks.ITaskHandler) { - azdata.tasks.registerTask(task, callback); - } - - public getCredentials(connectionId: string) { - return azdata.connection.getCredentials(connectionId); - } - - public getConnectionString(connectionId: string, includePassword: boolean) { - return azdata.connection.getConnectionString(connectionId, includePassword); - } - - -} diff --git a/extensions/import/src/controllers/mainController.ts b/extensions/import/src/controllers/mainController.ts index 8b31f99fd7..8dddc21ccc 100644 --- a/extensions/import/src/controllers/mainController.ts +++ b/extensions/import/src/controllers/mainController.ts @@ -11,22 +11,18 @@ import { FlatFileWizard } from '../wizard/flatFileWizard'; import { ServiceClient } from '../services/serviceClient'; import { ApiType, managerInstance } from '../services/serviceApiManager'; import { FlatFileProvider } from '../services/contracts'; -import { ApiWrapper } from '../common/apiWrapper'; /** * The main controller class that initializes the extension */ export default class MainController extends ControllerBase { private _outputChannel: vscode.OutputChannel; - private _apiWrapper: ApiWrapper; public constructor( context: vscode.ExtensionContext, - apiWrapper: ApiWrapper ) { super(context); - this._apiWrapper = apiWrapper; - this._outputChannel = this._apiWrapper.createOutputChannel(constants.serviceName); + this._outputChannel = vscode.window.createOutputChannel(constants.serviceName); } /** */ @@ -39,13 +35,13 @@ export default class MainController extends ControllerBase { this.initializeFlatFileProvider(provider); resolve(true); }); - await new ServiceClient(this._outputChannel, this._apiWrapper).startService(this._context); + await new ServiceClient(this._outputChannel).startService(this._context); }); } private initializeFlatFileProvider(provider: FlatFileProvider) { - this._apiWrapper.registerTask(constants.flatFileImportStartCommand, (profile: azdata.IConnectionProfile, ...args: any[]) => new FlatFileWizard(provider, this._apiWrapper).start(profile, args)); + azdata.tasks.registerTask(constants.flatFileImportStartCommand, (profile: azdata.IConnectionProfile, ...args: any[]) => new FlatFileWizard(provider).start(profile, args)); } } diff --git a/extensions/import/src/main.ts b/extensions/import/src/main.ts index 074ef16f65..473333f4e6 100644 --- a/extensions/import/src/main.ts +++ b/extensions/import/src/main.ts @@ -7,16 +7,13 @@ import * as vscode from 'vscode'; import ControllerBase from './controllers/controllerBase'; import MainController from './controllers/mainController'; -import { ApiWrapper } from './common/apiWrapper'; let controllers: ControllerBase[] = []; export async function activate(context: vscode.ExtensionContext): Promise { - let apiWrapper = new ApiWrapper(); - // Start the main controller - let mainController = new MainController(context, apiWrapper); + let mainController = new MainController(context); controllers.push(mainController); context.subscriptions.push(mainController); diff --git a/extensions/import/src/services/serviceClient.ts b/extensions/import/src/services/serviceClient.ts index 3f63eb2296..ece428274c 100644 --- a/extensions/import/src/services/serviceClient.ts +++ b/extensions/import/src/services/serviceClient.ts @@ -16,14 +16,12 @@ import { Telemetry, LanguageClientErrorHandler } from './telemetry'; import * as Constants from '../common/constants'; import { TelemetryFeature, FlatFileImportFeature } from './features'; import { promises as fs } from 'fs'; -import { ApiWrapper } from '../common/apiWrapper'; export class ServiceClient { private statusView: vscode.StatusBarItem; constructor( private outputChannel: vscode.OutputChannel, - private _apiWrapper: ApiWrapper ) { this.statusView = vscode.window.createStatusBarItem(vscode.StatusBarAlignment.Left); } @@ -69,8 +67,8 @@ export class ServiceClient { public async downloadBinaries(context: vscode.ExtensionContext, rawConfig: Buffer): Promise { const config = JSON.parse(rawConfig.toString()); config.installDirectory = path.join(context.extensionPath, config.installDirectory); - config.proxy = this._apiWrapper.getConfiguration('http').get('proxy'); - config.strictSSL = this._apiWrapper.getConfiguration('http').get('proxyStrictSSL') || true; + config.proxy = vscode.workspace.getConfiguration('http').get('proxy'); + config.strictSSL = vscode.workspace.getConfiguration('http').get('proxyStrictSSL') || true; const serverdownloader = new ServerProvider(config); serverdownloader.eventEmitter.onAny(this.generateHandleServerProviderEvent()); return serverdownloader.getOrDownloadServer(); diff --git a/extensions/import/src/test/controllers/mainController.test.ts b/extensions/import/src/test/controllers/mainController.test.ts index 15ae0b4e5e..dc766d803b 100644 --- a/extensions/import/src/test/controllers/mainController.test.ts +++ b/extensions/import/src/test/controllers/mainController.test.ts @@ -3,42 +3,21 @@ * Licensed under the Source EULA. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as TypeMoq from 'typemoq'; -import { ApiWrapper } from '../../common/apiWrapper'; import MainController from '../../controllers/mainController'; -import * as constants from '../../common/constants'; -import * as should from 'should'; -import * as path from 'path'; import { ImportTestUtils, TestExtensionContext } from '../utils.test'; +import * as should from 'should'; describe('Main Controller', function () { let testExtensionContext: TestExtensionContext; - let mockApiWrapper: TypeMoq.IMock; - let extensionPath: string; beforeEach(async function () { - extensionPath = await ImportTestUtils.getExtensionPath(); // creating a mock Extension Context with current extensionPath testExtensionContext = await ImportTestUtils.getTestExtensionContext(); - mockApiWrapper = TypeMoq.Mock.ofType(ApiWrapper); }); - it('Should download required binaries and register flatFileImportStartCommand after activate is called', async function () { - this.timeout(50000); - - - // using vscode and azdata APIs available during tests - mockApiWrapper.callBase = true; - - let mainController = new MainController(testExtensionContext, mockApiWrapper.object); - - await mainController.activate(); - - // verifying that the task is registered. - mockApiWrapper.verify(x => x.registerTask(constants.flatFileImportStartCommand, TypeMoq.It.isAny()), TypeMoq.Times.once()); - - //Checking if .net code files are downloaded - should.equal(await ImportTestUtils.checkPathExists(path.join(extensionPath, 'flatfileimportservice')), true); + it('Should register task flatFileImportStartCommand after activate is called', async function () { + let mainController = new MainController(testExtensionContext); + should.doesNotThrow(() => mainController.activate()); }); }); diff --git a/extensions/import/src/test/utils.test.ts b/extensions/import/src/test/utils.test.ts index 58810c77f3..a7354f5bcb 100644 --- a/extensions/import/src/test/utils.test.ts +++ b/extensions/import/src/test/utils.test.ts @@ -7,7 +7,6 @@ import * as azdata from 'azdata'; import * as vscode from 'vscode'; import { ImportDataModel, ColumnMetadata } from '../wizard/api/models'; import { FlatFileProvider, PROSEDiscoveryParams, InsertDataParams, GetColumnInfoParams, ChangeColumnSettingsParams, PROSEDiscoveryResponse, InsertDataResponse, ChangeColumnSettingsResponse, GetColumnInfoResponse } from '../services/contracts'; -import * as fs from 'fs'; export class ImportTestUtils { @@ -37,12 +36,6 @@ export class ImportTestUtils { } as azdata.connection.ConnectionProfile; } - public static async checkPathExists(path: string): Promise { - return fs.promises.access(path, fs.constants.F_OK) - .then(() => true) - .catch(() => false); - } - public static async getExtensionPath(): Promise { return await vscode.extensions.getExtension('Microsoft.import').extensionPath; } @@ -134,73 +127,10 @@ export class TestQueryProvider implements azdata.QueryProvider { throw new Error('Method not implemented.'); } handle?: number; - providerId: string; + providerId: string = 'testProviderId'; } -export class TestWizard implements azdata.window.Wizard { - title: string; - pages: azdata.window.WizardPage[]; - currentPage: number; - doneButton: azdata.window.Button; - cancelButton: azdata.window.Button; - generateScriptButton: azdata.window.Button = azdata.window.createButton('testButton'); - nextButton: azdata.window.Button; - backButton: azdata.window.Button; - customButtons: azdata.window.Button[]; - displayPageTitles: boolean; - onPageChanged: vscode.Event = new vscode.EventEmitter().event; - addPage(page: azdata.window.WizardPage, index?: number): Thenable { - throw new Error('Method not implemented.'); - } - removePage(index: number): Thenable { - throw new Error('Method not implemented.'); - } - setCurrentPage(index: number): Thenable { - throw new Error('Method not implemented.'); - } - open(): Thenable { - throw new Error('Method not implemented.'); - } - close(): Thenable { - throw new Error('Method not implemented.'); - } - registerNavigationValidator(validator: (pageChangeInfo: azdata.window.WizardPageChangeInfo) => boolean | Thenable): void { - throw new Error('Method not implemented.'); - } - message: azdata.window.DialogMessage; - registerOperation(operationInfo: azdata.BackgroundOperationInfo): void { - throw new Error('Method not implemented.'); - } - -} - -export class TestWizardPage implements azdata.window.WizardPage { - title: string; - content: string; - customButtons: azdata.window.Button[]; - enabled: boolean; - description: string; - registerContent(handler: (view: azdata.ModelView) => Thenable): void { - throw new Error('Method not implemented.'); - } - modelView: azdata.ModelView; - valid: boolean; - onValidityChanged: vscode.Event; - -} - -export class TestButton implements azdata.window.Button { - label: string; - enabled: boolean; - hidden: boolean; - focused?: boolean; - constructor(private onClickEmitter: vscode.EventEmitter) { - } - onClick: vscode.Event = this.onClickEmitter.event; - position?: azdata.window.DialogButtonPosition; -} - export class TestExtensionContext implements vscode.ExtensionContext { extensionMode: vscode.ExtensionMode; subscriptions: { dispose(): any; }[]; diff --git a/extensions/import/src/test/wizard/api/basePage.test.ts b/extensions/import/src/test/wizard/api/basePage.test.ts index 6184479031..ca12b7a77d 100644 --- a/extensions/import/src/test/wizard/api/basePage.test.ts +++ b/extensions/import/src/test/wizard/api/basePage.test.ts @@ -6,32 +6,34 @@ import * as TypeMoq from 'typemoq'; import * as azdata from 'azdata'; import { FlatFileWizard } from '../../../wizard/flatFileWizard'; -import { ApiWrapper } from '../../../common/apiWrapper'; import { ImportDataModel } from '../../../wizard/api/models'; import { TestImportDataModel, ImportTestUtils } from '../../utils.test'; import { FileConfigPage } from '../../../wizard/pages/fileConfigPage'; import * as should from 'should'; +import * as sinon from 'sinon'; -describe('import extension wizard pages', function () { +describe('Base page tests', function () { let mockFlatFileWizard: TypeMoq.IMock; - let mockApiWrapper: TypeMoq.IMock; let mockImportModel: TypeMoq.IMock; beforeEach(function () { - mockApiWrapper = TypeMoq.Mock.ofType(ApiWrapper); - mockFlatFileWizard = TypeMoq.Mock.ofType(FlatFileWizard, TypeMoq.MockBehavior.Loose, undefined, TypeMoq.It.isAny(), mockApiWrapper.object); + mockFlatFileWizard = TypeMoq.Mock.ofType(FlatFileWizard, TypeMoq.MockBehavior.Loose, undefined, TypeMoq.It.isAny()); mockImportModel = TypeMoq.Mock.ofType(TestImportDataModel, TypeMoq.MockBehavior.Loose); }); + afterEach(function (): void { + sinon.restore(); + }); + it('getDatabaseValue returns active database first', async function () { // setting up the environment let databases: string[] = ['testdb1', 'testdb2', 'testdb3']; let activeDatabase: string = 'testdb2'; // setting up mocks - let importPage = new FileConfigPage(mockFlatFileWizard.object, TypeMoq.It.isAny(), mockImportModel.object, TypeMoq.It.isAny(), TypeMoq.It.isAny(), mockApiWrapper.object); - mockApiWrapper.setup(x => x.listDatabases(TypeMoq.It.isAnyString())).returns(async () => { return databases; }); + let importPage = new FileConfigPage(mockFlatFileWizard.object, TypeMoq.It.isAny(), mockImportModel.object, TypeMoq.It.isAny(), TypeMoq.It.isAny()); + sinon.stub(azdata.connection, 'listDatabases').returns(Promise.resolve(databases)); mockImportModel.object.server = { providerName: 'MSSQL', connectionId: 'testConnectionId', @@ -52,10 +54,10 @@ describe('import extension wizard pages', function () { it('getServerValue returns null on no active connection', async function () { - let importPage = new FileConfigPage(mockFlatFileWizard.object, TypeMoq.It.isAny(), mockImportModel.object, TypeMoq.It.isAny(), TypeMoq.It.isAny(), mockApiWrapper.object); + let importPage = new FileConfigPage(mockFlatFileWizard.object, TypeMoq.It.isAny(), mockImportModel.object, TypeMoq.It.isAny(), TypeMoq.It.isAny()); // mocking getActive connection to return null - mockApiWrapper.setup(x => x.getActiveConnections()).returns(async () => { return undefined; }); + let getActiveConnectionStub = sinon.stub(azdata.connection, 'getActiveConnections').returns(Promise.resolve(undefined)); let serverValues = await importPage.getServerValues(); @@ -63,7 +65,7 @@ describe('import extension wizard pages', function () { should.equal(serverValues, undefined, 'getServer should be undefined for no active connections'); // mocking getActive connection returns empty array - mockApiWrapper.setup(x => x.getActiveConnections()).returns(async () => { return [] as azdata.connection.Connection[]; }); + getActiveConnectionStub.returns(Promise.resolve([] as azdata.connection.Connection[])); serverValues = await importPage.getServerValues(); @@ -100,8 +102,8 @@ describe('import extension wizard pages', function () { } ]; - let importPage = new FileConfigPage(mockFlatFileWizard.object, TypeMoq.It.isAny(), mockImportModel.object, TypeMoq.It.isAny(), TypeMoq.It.isAny(), mockApiWrapper.object); - mockApiWrapper.setup(x => x.getActiveConnections()).returns(async () => { return testActiveConnections; }); + let importPage = new FileConfigPage(mockFlatFileWizard.object, TypeMoq.It.isAny(), mockImportModel.object, TypeMoq.It.isAny(), TypeMoq.It.isAny()); + sinon.stub(azdata.connection, 'getActiveConnections').returns(Promise.resolve(testActiveConnections)); mockImportModel.object.server = ImportTestUtils.getTestServer(); // the second connection should be the first element in the array as it is active diff --git a/extensions/import/src/test/wizard/flatFileWizard.test.ts b/extensions/import/src/test/wizard/flatFileWizard.test.ts index eb75a260ef..bb7965478e 100644 --- a/extensions/import/src/test/wizard/flatFileWizard.test.ts +++ b/extensions/import/src/test/wizard/flatFileWizard.test.ts @@ -6,16 +6,22 @@ import * as TypeMoq from 'typemoq'; import * as vscode from 'vscode'; import * as azdata from 'azdata'; -import { ApiWrapper } from '../../common/apiWrapper'; import { FlatFileWizard } from '../../wizard/flatFileWizard'; -import { ImportTestUtils, TestWizard, TestWizardPage, TestButton } from '../utils.test'; +import { ImportTestUtils } from '../utils.test'; import * as should from 'should'; +import * as sinon from 'sinon'; describe('import extension flat file wizard', function () { - let mockApiWrapper: TypeMoq.IMock; - this.beforeEach(function () { - mockApiWrapper = TypeMoq.Mock.ofType(ApiWrapper); + let showErrorMessageSpy: sinon.SinonSpy; + + this.beforeEach(function() { + showErrorMessageSpy = sinon.spy(vscode.window, 'showErrorMessage'); }); + + this.afterEach(function () { + sinon.restore(); + }); + it('opens connectionDialog when there are no active connections', async function () { let testConnection: azdata.connection.Connection = { providerName: 'MSSQL', @@ -24,46 +30,43 @@ describe('import extension flat file wizard', function () { }; // There is no current connection. - mockApiWrapper.setup(x => x.getCurrentConnection()).returns(() => { return undefined; }); - + sinon.stub(azdata.connection, 'getCurrentConnection').returns(undefined); // openConnectionDialog returns a test connection - mockApiWrapper.setup(x => x.openConnectionDialog(TypeMoq.It.isAny())).returns(async () => { return testConnection; }); + let openConnectionDialogSpy = sinon.stub(azdata.connection, 'openConnectionDialog').returns(Promise.resolve(testConnection)); - let testFlatFileWizard = new FlatFileWizard(TypeMoq.It.isAny(), mockApiWrapper.object); + let testFlatFileWizard = new FlatFileWizard(TypeMoq.It.isAny()); await testFlatFileWizard.getConnectionId(); // openConnectionDialog will be called once - mockApiWrapper.verify(x => x.openConnectionDialog(TypeMoq.It.isAny()), TypeMoq.Times.once()); - + sinon.assert.calledOnce(openConnectionDialogSpy); }); it('shows error message when an invalid connection is selected', async function () { // The active connection doesn't have a valid Provider let testConnectionProfile: azdata.connection.ConnectionProfile = ImportTestUtils.getTestConnectionProfile(); - mockApiWrapper.setup(x => x.getCurrentConnection()).returns(() => { return Promise.resolve(testConnectionProfile); }); - mockApiWrapper.setup(x => x.openConnectionDialog(TypeMoq.It.isAny())).returns(() => { return undefined; }); + sinon.stub(azdata.connection, 'getCurrentConnection').returns(Promise.resolve(testConnectionProfile)); + sinon.stub(azdata.connection, 'openConnectionDialog').returns(undefined); - let testFlatFileWizard = new FlatFileWizard(TypeMoq.It.isAny(), mockApiWrapper.object); + let testFlatFileWizard = new FlatFileWizard(TypeMoq.It.isAny()); await testFlatFileWizard.getConnectionId(); - mockApiWrapper.verify(x => x.showErrorMessage(TypeMoq.It.isAny()), TypeMoq.Times.once()); + sinon.assert.calledOnce(showErrorMessageSpy); }); it('shows error message when no connection is selected', async function () { // The active connection doesn't have a valid Provider - mockApiWrapper.setup(x => x.getCurrentConnection()).returns(() => { return undefined; }); - mockApiWrapper.setup(x => x.openConnectionDialog(TypeMoq.It.isAny())).returns(() => { return undefined; }); + sinon.stub(azdata.connection, 'getCurrentConnection').returns(Promise.resolve(undefined)); + sinon.stub(azdata.connection, 'openConnectionDialog').returns(undefined); - let testFlatFileWizard = new FlatFileWizard(TypeMoq.It.isAny(), mockApiWrapper.object); + let testFlatFileWizard = new FlatFileWizard(TypeMoq.It.isAny()); await testFlatFileWizard.getConnectionId(); - mockApiWrapper.verify(x => x.showErrorMessage(TypeMoq.It.isAny()), TypeMoq.Times.once()); - + sinon.assert.calledOnce(showErrorMessageSpy); }); it('getConnection returns active connection', async function () { @@ -71,9 +74,9 @@ describe('import extension flat file wizard', function () { testConnectionProfile.providerId = 'MSSQL'; //mocking an active connection - mockApiWrapper.setup(x => x.getCurrentConnection()).returns(async () => { return testConnectionProfile; }) + sinon.stub(azdata.connection, 'getCurrentConnection').returns(Promise.resolve(testConnectionProfile)); - let testFlatFileWizard = new FlatFileWizard(TypeMoq.It.isAny(), mockApiWrapper.object); + let testFlatFileWizard = new FlatFileWizard(TypeMoq.It.isAny()); //getConnectionID should return the connectionId of active connection let connectionId = await testFlatFileWizard.getConnectionId(); @@ -83,23 +86,15 @@ describe('import extension flat file wizard', function () { it('should initialize all pages', async function () { let testConnectionProfile = ImportTestUtils.getTestConnectionProfile(); testConnectionProfile.providerId = 'MSSQL'; - mockApiWrapper.setup(x => x.getCurrentConnection()).returns(async () => { return testConnectionProfile; }); - let onClick: vscode.EventEmitter = new vscode.EventEmitter(); - let mockWizard = TypeMoq.Mock.ofType(TestWizard); - let mockWizardPage = TypeMoq.Mock.ofType(TestWizardPage); - let mockButton = TypeMoq.Mock.ofType(TestButton, TypeMoq.MockBehavior.Loose, undefined, onClick); + + sinon.stub(azdata.connection, 'getCurrentConnection').returns(Promise.resolve(testConnectionProfile)); let testProvider = { providerId: 'testProviderId', connectionProfile: ImportTestUtils.getTestConnectionProfile() }; - // Mocking wizard component creation - mockApiWrapper.setup(x => x.createWizard(TypeMoq.It.isAnyString())).returns(() => { return mockWizard.object; }); - mockApiWrapper.setup(x => x.createWizardPage(TypeMoq.It.isAnyString())).returns(() => { return mockWizardPage.object; }); - mockApiWrapper.setup(x => x.createButton(TypeMoq.It.isAnyString())).returns(() => { return mockButton.object; }); - - let testFlatFileWizard = new FlatFileWizard(TypeMoq.It.isAny(), mockApiWrapper.object); + let testFlatFileWizard = new FlatFileWizard(TypeMoq.It.isAny()); await testFlatFileWizard.start(testProvider); diff --git a/extensions/import/src/test/wizard/pages/fileConfigPage.test.ts b/extensions/import/src/test/wizard/pages/fileConfigPage.test.ts index 2158e6e740..b677239966 100644 --- a/extensions/import/src/test/wizard/pages/fileConfigPage.test.ts +++ b/extensions/import/src/test/wizard/pages/fileConfigPage.test.ts @@ -6,18 +6,17 @@ import * as TypeMoq from 'typemoq'; import * as azdata from 'azdata'; import { FlatFileWizard } from '../../../wizard/flatFileWizard'; -import { ApiWrapper } from '../../../common/apiWrapper'; import { ImportDataModel } from '../../../wizard/api/models'; import { TestImportDataModel, TestQueryProvider } from '../../utils.test'; import { FileConfigPage } from '../../../wizard/pages/fileConfigPage'; import * as should from 'should'; +import * as sinon from 'sinon'; import { ImportPage } from '../../../wizard/api/importPage'; import * as constants from '../../../common/constants'; describe('File config page', function () { let mockFlatFileWizard: TypeMoq.IMock; - let mockApiWrapper: TypeMoq.IMock; let mockImportModel: TypeMoq.IMock; let fileConfigPage: FileConfigPage; @@ -26,15 +25,15 @@ describe('File config page', function () { let pages: Map = new Map(); this.beforeEach(function () { - mockApiWrapper = TypeMoq.Mock.ofType(ApiWrapper); - mockFlatFileWizard = TypeMoq.Mock.ofType(FlatFileWizard, TypeMoq.MockBehavior.Loose, undefined, TypeMoq.It.isAny(), mockApiWrapper.object); + mockFlatFileWizard = TypeMoq.Mock.ofType(FlatFileWizard, TypeMoq.MockBehavior.Loose, undefined, TypeMoq.It.isAny()); mockImportModel = TypeMoq.Mock.ofType(TestImportDataModel, TypeMoq.MockBehavior.Loose); - // using the actual vscode and azdata apis. - mockApiWrapper.callBase = true; + wizard = azdata.window.createWizard(constants.wizardNameText); + page = azdata.window.createWizardPage(constants.page1NameText); + }); - wizard = mockApiWrapper.object.createWizard(constants.wizardNameText); - page = mockApiWrapper.object.createWizardPage(constants.page1NameText); + afterEach(function (): void { + sinon.restore(); }); it('getSchema returns active schema first', async function () { @@ -77,9 +76,9 @@ describe('File config page', function () { // setting up mocks to return test objects created earlier mockQueryProvider.setup(x => x.runQueryAndReturn(TypeMoq.It.isAny(), TypeMoq.It.isAny())).returns(async () => { return schemaQueryResult; }); - mockApiWrapper.setup(x => x.getProvider(TypeMoq.It.isAny(), TypeMoq.It.isAny())).returns(() => { return mockQueryProvider.object; }); + sinon.stub(azdata.dataprotocol, 'getProvider' ).returns(mockQueryProvider.object); - let fileConfigPage = new FileConfigPage(mockFlatFileWizard.object, TypeMoq.It.isAny(), mockImportModel.object, TypeMoq.It.isAny(), TypeMoq.It.isAny(), mockApiWrapper.object); + let fileConfigPage = new FileConfigPage(mockFlatFileWizard.object, TypeMoq.It.isAny(), mockImportModel.object, TypeMoq.It.isAny(), TypeMoq.It.isAny()); let actualSchemaValues = await fileConfigPage.getSchemaValues(); should(expectedSchemaValues).deepEqual(actualSchemaValues); @@ -89,7 +88,7 @@ describe('File config page', function () { await new Promise(function (resolve) { page.registerContent(async (view) => { - fileConfigPage = new FileConfigPage(mockFlatFileWizard.object, page, mockImportModel.object, view, TypeMoq.It.isAny(), mockApiWrapper.object); + fileConfigPage = new FileConfigPage(mockFlatFileWizard.object, page, mockImportModel.object, view, TypeMoq.It.isAny()); pages.set(1, fileConfigPage); await fileConfigPage.start(); resolve(); @@ -118,11 +117,8 @@ describe('File config page', function () { it('Dropdown values are correctly set', async function () { - // using the actual vscode and azdata apis. - mockApiWrapper.callBase = true; - - wizard = mockApiWrapper.object.createWizard(constants.wizardNameText); - page = mockApiWrapper.object.createWizardPage(constants.page1NameText); + wizard = azdata.window.createWizard(constants.wizardNameText); + page = azdata.window.createWizardPage(constants.page1NameText); // creating mock server values let testActiveConnections: azdata.connection.Connection[] = [ @@ -154,7 +150,7 @@ describe('File config page', function () { } } ]; - mockApiWrapper.setup(x => x.getActiveConnections()).returns(async () => { return testActiveConnections; }); + sinon.stub(azdata.connection, 'getActiveConnections').returns(Promise.resolve(testActiveConnections)); // creating a test active connection. This connection will be the first value in server dropdown array let testServerConnection: azdata.connection.Connection = { @@ -191,7 +187,7 @@ describe('File config page', function () { // creating mock database values let databases: string[] = ['testdb1', 'testdb2', 'testdb3']; - mockApiWrapper.setup(x => x.listDatabases(TypeMoq.It.isAnyString())).returns(async () => { return databases; }); + sinon.stub(azdata.connection, 'listDatabases').returns(Promise.resolve(databases)); mockImportModel.object.database = 'testdb2'; // expected values for the database dropdown @@ -236,12 +232,12 @@ describe('File config page', function () { ]; let mockQueryProvider = TypeMoq.Mock.ofType(TestQueryProvider); - mockApiWrapper.setup(x => x.getProvider(TypeMoq.It.isAny(), TypeMoq.It.isAny())).returns(() => { return mockQueryProvider.object; }); + sinon.stub(azdata.dataprotocol, 'getProvider').returns(mockQueryProvider.object); mockQueryProvider.setup(x => x.runQueryAndReturn(TypeMoq.It.isAny(), TypeMoq.It.isAny())).returns(async () => { return schemaQueryResult; }); await new Promise(function (resolve) { page.registerContent(async (view) => { - fileConfigPage = new FileConfigPage(mockFlatFileWizard.object, page, mockImportModel.object, view, TypeMoq.It.isAny(), mockApiWrapper.object); + fileConfigPage = new FileConfigPage(mockFlatFileWizard.object, page, mockImportModel.object, view, TypeMoq.It.isAny()); pages.set(1, fileConfigPage); await fileConfigPage.start(); await fileConfigPage.setupNavigationValidator(); diff --git a/extensions/import/src/test/wizard/pages/modifyColumnsPage.test.ts b/extensions/import/src/test/wizard/pages/modifyColumnsPage.test.ts index d7cef23ea9..707691f1e8 100644 --- a/extensions/import/src/test/wizard/pages/modifyColumnsPage.test.ts +++ b/extensions/import/src/test/wizard/pages/modifyColumnsPage.test.ts @@ -5,7 +5,6 @@ import * as TypeMoq from 'typemoq'; import * as azdata from 'azdata'; -import { ApiWrapper } from '../../../common/apiWrapper'; import * as constants from '../../../common/constants'; import { FlatFileWizard } from '../../../wizard/flatFileWizard'; import * as should from 'should'; @@ -21,21 +20,17 @@ describe('import extension modify Column Page', function () { let modifyColumnsPage: ModifyColumnsPage; let mockFlatFileWizard: TypeMoq.IMock; let mockImportModel: TypeMoq.IMock; - let mockApiWrapper: TypeMoq.IMock; let pages: Map = new Map(); let mockFlatFileProvider: TypeMoq.IMock; beforeEach(function () { - // Keeping the original behaviour of apiWrapper until some setup is needed to mock stuff - mockApiWrapper = TypeMoq.Mock.ofType(ApiWrapper, TypeMoq.MockBehavior.Loose); - mockApiWrapper.callBase = true; mockFlatFileProvider = TypeMoq.Mock.ofType(TestFlatFileProvider); - mockFlatFileWizard = TypeMoq.Mock.ofType(FlatFileWizard, TypeMoq.MockBehavior.Loose, undefined, mockFlatFileProvider.object, mockApiWrapper.object); + mockFlatFileWizard = TypeMoq.Mock.ofType(FlatFileWizard, TypeMoq.MockBehavior.Loose, undefined, mockFlatFileProvider.object); mockImportModel = TypeMoq.Mock.ofType(TestImportDataModel, TypeMoq.MockBehavior.Loose); - wizard = mockApiWrapper.object.createWizard(constants.wizardNameText); - page = mockApiWrapper.object.createWizardPage(constants.page3NameText); + wizard = azdata.window.createWizard(constants.wizardNameText); + page = azdata.window.createWizardPage(constants.page3NameText); }); @@ -43,7 +38,7 @@ describe('import extension modify Column Page', function () { await new Promise(function (resolve) { page.registerContent(async (view) => { - modifyColumnsPage = new ModifyColumnsPage(mockFlatFileWizard.object, page, mockImportModel.object, view, TypeMoq.It.isAny(), mockApiWrapper.object); + modifyColumnsPage = new ModifyColumnsPage(mockFlatFileWizard.object, page, mockImportModel.object, view, TypeMoq.It.isAny()); pages.set(1, modifyColumnsPage); await modifyColumnsPage.start(); resolve(); @@ -88,7 +83,7 @@ describe('import extension modify Column Page', function () { await new Promise(function (resolve) { page.registerContent(async (view) => { - modifyColumnsPage = new ModifyColumnsPage(mockFlatFileWizard.object, page, mockImportModel.object, view, TypeMoq.It.isAny(), mockApiWrapper.object); + modifyColumnsPage = new ModifyColumnsPage(mockFlatFileWizard.object, page, mockImportModel.object, view, TypeMoq.It.isAny()); pages.set(1, modifyColumnsPage); await modifyColumnsPage.start(); resolve(); diff --git a/extensions/import/src/test/wizard/pages/prosePreviewPage.test.ts b/extensions/import/src/test/wizard/pages/prosePreviewPage.test.ts index 3f1e71cf2f..dde3e99289 100644 --- a/extensions/import/src/test/wizard/pages/prosePreviewPage.test.ts +++ b/extensions/import/src/test/wizard/pages/prosePreviewPage.test.ts @@ -5,7 +5,6 @@ import * as TypeMoq from 'typemoq'; import * as azdata from 'azdata'; -import { ApiWrapper } from '../../../common/apiWrapper'; import * as constants from '../../../common/constants'; import { FlatFileWizard } from '../../../wizard/flatFileWizard'; import * as should from 'should'; @@ -19,7 +18,6 @@ describe('import extension prose preview tests', function () { // declaring mock variables let mockFlatFileWizard: TypeMoq.IMock; let mockImportModel: TypeMoq.IMock; - let mockApiWrapper: TypeMoq.IMock; // declaring instance variables let wizard: azdata.window.Wizard; @@ -31,16 +29,12 @@ describe('import extension prose preview tests', function () { beforeEach(async function () { // initializing mock variables - mockApiWrapper = TypeMoq.Mock.ofType(ApiWrapper); - mockFlatFileWizard = TypeMoq.Mock.ofType(FlatFileWizard, TypeMoq.MockBehavior.Loose, undefined, TypeMoq.It.isAny(), mockApiWrapper); + mockFlatFileWizard = TypeMoq.Mock.ofType(FlatFileWizard, TypeMoq.MockBehavior.Loose, undefined, TypeMoq.It.isAny()); mockImportModel = TypeMoq.Mock.ofType(TestImportDataModel, TypeMoq.MockBehavior.Loose); - // using the actual vscode and azdata apis. - mockApiWrapper.callBase = true; - // creating a wizard and adding page that will contain the fileConfigPage - wizard = mockApiWrapper.object.createWizard(constants.wizardNameText); - page = mockApiWrapper.object.createWizardPage(constants.page2NameText); + wizard = azdata.window.createWizard(constants.wizardNameText); + page = azdata.window.createWizardPage(constants.page2NameText); }); @@ -49,7 +43,7 @@ describe('import extension prose preview tests', function () { // Opening the wizard and initializing the page as ProsePreviewPage await new Promise(function (resolve) { page.registerContent(async (view) => { - prosePreviewPage = new ProsePreviewPage(mockFlatFileWizard.object, page, mockImportModel.object, view, TypeMoq.It.isAny(), mockApiWrapper.object); + prosePreviewPage = new ProsePreviewPage(mockFlatFileWizard.object, page, mockImportModel.object, view, TypeMoq.It.isAny()); pages.set(1, prosePreviewPage); await prosePreviewPage.start(); await prosePreviewPage.setupNavigationValidator(); diff --git a/extensions/import/src/test/wizard/pages/summaryPage.test.ts b/extensions/import/src/test/wizard/pages/summaryPage.test.ts index 4c89c4c57c..28870f27c5 100644 --- a/extensions/import/src/test/wizard/pages/summaryPage.test.ts +++ b/extensions/import/src/test/wizard/pages/summaryPage.test.ts @@ -5,7 +5,6 @@ import * as TypeMoq from 'typemoq'; import * as azdata from 'azdata'; -import { ApiWrapper } from '../../../common/apiWrapper'; import * as constants from '../../../common/constants'; import { FlatFileWizard } from '../../../wizard/flatFileWizard'; import * as should from 'should'; @@ -19,7 +18,6 @@ describe('import extension summary page tests', function () { let mockFlatFileWizard: TypeMoq.IMock; let mockImportModel: TypeMoq.IMock; - let mockApiWrapper: TypeMoq.IMock; let mockFlatFileProvider: TypeMoq.IMock; let summaryPage: SummaryPage; @@ -28,16 +26,13 @@ describe('import extension summary page tests', function () { let pages: Map = new Map(); beforeEach(async function () { - // Keeping the original behaviour of apiWrapper until some setup is needed to mock stuff - mockApiWrapper = TypeMoq.Mock.ofType(ApiWrapper, TypeMoq.MockBehavior.Loose); - mockApiWrapper.callBase = true; mockFlatFileProvider = TypeMoq.Mock.ofType(TestFlatFileProvider); - mockFlatFileWizard = TypeMoq.Mock.ofType(FlatFileWizard, TypeMoq.MockBehavior.Loose, undefined, mockFlatFileProvider.object, mockApiWrapper.object); + mockFlatFileWizard = TypeMoq.Mock.ofType(FlatFileWizard, TypeMoq.MockBehavior.Loose, undefined, mockFlatFileProvider.object); mockImportModel = TypeMoq.Mock.ofType(TestImportDataModel, TypeMoq.MockBehavior.Loose); - wizard = mockApiWrapper.object.createWizard(constants.wizardNameText); - page = mockApiWrapper.object.createWizardPage(constants.page4NameText); + wizard = azdata.window.createWizard(constants.wizardNameText); + page = azdata.window.createWizardPage(constants.page4NameText); }); @@ -45,7 +40,7 @@ describe('import extension summary page tests', function () { await new Promise(function (resolve) { page.registerContent(async (view) => { - summaryPage = new SummaryPage(mockFlatFileWizard.object, page, mockImportModel.object, view, TypeMoq.It.isAny(), mockApiWrapper.object); + summaryPage = new SummaryPage(mockFlatFileWizard.object, page, mockImportModel.object, view, TypeMoq.It.isAny()); pages.set(1, summaryPage); await summaryPage.start(); resolve(); @@ -112,7 +107,7 @@ describe('import extension summary page tests', function () { await new Promise(function (resolve) { page.registerContent(async (view) => { - summaryPage = new SummaryPage(mockFlatFileWizard.object, page, mockImportModel.object, view, mockFlatFileProvider.object, mockApiWrapper.object); + summaryPage = new SummaryPage(mockFlatFileWizard.object, page, mockImportModel.object, view, mockFlatFileProvider.object); pages.set(1, summaryPage); await summaryPage.start(); summaryPage.setupNavigationValidator(); diff --git a/extensions/import/src/wizard/api/basePage.ts b/extensions/import/src/wizard/api/basePage.ts index 5765315770..d9e736f698 100644 --- a/extensions/import/src/wizard/api/basePage.ts +++ b/extensions/import/src/wizard/api/basePage.ts @@ -5,14 +5,12 @@ import * as azdata from 'azdata'; import { ImportDataModel } from './models'; -import { ApiWrapper } from '../../common/apiWrapper'; export abstract class BasePage { protected readonly wizardPage: azdata.window.WizardPage; protected readonly model: ImportDataModel; protected readonly view: azdata.ModelView; - protected _apiWrapper: ApiWrapper; /** * This method constructs all the elements of the page. @@ -45,7 +43,7 @@ export abstract class BasePage { public abstract setupNavigationValidator(): void; public async getServerValues(): Promise<{ connection: azdata.connection.Connection, displayName: string, name: string }[]> { - let cons = await this._apiWrapper.getActiveConnections(); + let cons = await azdata.connection.getActiveConnections(); // This user has no active connections ABORT MISSION if (!cons || cons.length === 0) { return undefined; @@ -95,7 +93,7 @@ export abstract class BasePage { public async getDatabaseValues(): Promise<{ displayName: string, name: string }[]> { let idx = -1; let count = -1; - let values = (await this._apiWrapper.listDatabases(this.model.server.connectionId)).map(db => { + let values = (await azdata.connection.listDatabases(this.model.server.connectionId)).map(db => { count++; if (this.model.database && db === this.model.database) { idx = count; diff --git a/extensions/import/src/wizard/api/importPage.ts b/extensions/import/src/wizard/api/importPage.ts index cb3be259d4..2bcbe77ad1 100644 --- a/extensions/import/src/wizard/api/importPage.ts +++ b/extensions/import/src/wizard/api/importPage.ts @@ -8,7 +8,6 @@ import * as azdata from 'azdata'; import { FlatFileProvider } from '../../services/contracts'; import { FlatFileWizard } from '../flatFileWizard'; import { BasePage } from './basePage'; -import { ApiWrapper } from '../../common/apiWrapper'; export abstract class ImportPage extends BasePage { @@ -19,13 +18,12 @@ export abstract class ImportPage extends BasePage { protected readonly provider: FlatFileProvider; - constructor(instance: FlatFileWizard, wizardPage: azdata.window.WizardPage, model: ImportDataModel, view: azdata.ModelView, provider: FlatFileProvider, apiWrapper: ApiWrapper) { + constructor(instance: FlatFileWizard, wizardPage: azdata.window.WizardPage, model: ImportDataModel, view: azdata.ModelView, provider: FlatFileProvider) { super(); this.instance = instance; this.wizardPage = wizardPage; this.model = model; this.view = view; this.provider = provider; - this._apiWrapper = apiWrapper; } } diff --git a/extensions/import/src/wizard/flatFileWizard.ts b/extensions/import/src/wizard/flatFileWizard.ts index a447b6d804..e4d00c5357 100644 --- a/extensions/import/src/wizard/flatFileWizard.ts +++ b/extensions/import/src/wizard/flatFileWizard.ts @@ -4,6 +4,7 @@ *--------------------------------------------------------------------------------------------*/ import * as azdata from 'azdata'; +import * as vscode from 'vscode'; import { FlatFileProvider } from '../services/contracts'; import { ImportDataModel } from './api/models'; import { ImportPage } from './api/importPage'; @@ -12,7 +13,6 @@ import { FileConfigPage } from './pages/fileConfigPage'; import { ProsePreviewPage } from './pages/prosePreviewPage'; import { ModifyColumnsPage } from './pages/modifyColumnsPage'; import { SummaryPage } from './pages/summaryPage'; -import { ApiWrapper } from '../common/apiWrapper'; import * as constants from '../common/constants'; export class FlatFileWizard { @@ -27,7 +27,6 @@ export class FlatFileWizard { constructor( provider: FlatFileProvider, - private _apiWrapper: ApiWrapper ) { this.provider = provider; } @@ -51,16 +50,16 @@ export class FlatFileWizard { model.serverId = connectionId; - this.wizard = this._apiWrapper.createWizard(constants.wizardNameText); - this.page1 = this._apiWrapper.createWizardPage(constants.page1NameText); - this.page2 = this._apiWrapper.createWizardPage(constants.page2NameText); - this.page3 = this._apiWrapper.createWizardPage(constants.page3NameText); - this.page4 = this._apiWrapper.createWizardPage(constants.page4NameText); + this.wizard = azdata.window.createWizard(constants.wizardNameText); + this.page1 = azdata.window.createWizardPage(constants.page1NameText); + this.page2 = azdata.window.createWizardPage(constants.page2NameText); + this.page3 = azdata.window.createWizardPage(constants.page3NameText); + this.page4 = azdata.window.createWizardPage(constants.page4NameText); let fileConfigPage: FileConfigPage; this.page1.registerContent(async (view) => { - fileConfigPage = new FileConfigPage(this, this.page1, model, view, this.provider, this._apiWrapper); + fileConfigPage = new FileConfigPage(this, this.page1, model, view, this.provider); pages.set(0, fileConfigPage); await fileConfigPage.start().then(() => { fileConfigPage.setupNavigationValidator(); @@ -70,14 +69,14 @@ export class FlatFileWizard { let prosePreviewPage: ProsePreviewPage; this.page2.registerContent(async (view) => { - prosePreviewPage = new ProsePreviewPage(this, this.page2, model, view, this.provider, this._apiWrapper); + prosePreviewPage = new ProsePreviewPage(this, this.page2, model, view, this.provider); pages.set(1, prosePreviewPage); await prosePreviewPage.start(); }); let modifyColumnsPage: ModifyColumnsPage; this.page3.registerContent(async (view) => { - modifyColumnsPage = new ModifyColumnsPage(this, this.page3, model, view, this.provider, this._apiWrapper); + modifyColumnsPage = new ModifyColumnsPage(this, this.page3, model, view, this.provider); pages.set(2, modifyColumnsPage); await modifyColumnsPage.start(); }); @@ -85,13 +84,13 @@ export class FlatFileWizard { let summaryPage: SummaryPage; this.page4.registerContent(async (view) => { - summaryPage = new SummaryPage(this, this.page4, model, view, this.provider, this._apiWrapper); + summaryPage = new SummaryPage(this, this.page4, model, view, this.provider); pages.set(3, summaryPage); await summaryPage.start(); }); - this.importAnotherFileButton = this._apiWrapper.createButton(constants.importNewFileText); + this.importAnotherFileButton = azdata.window.createButton(constants.importNewFileText); this.importAnotherFileButton.onClick(() => { //TODO replace this with proper cleanup for all the pages this.wizard.close(); @@ -124,20 +123,20 @@ export class FlatFileWizard { } public async getConnectionId(): Promise { - let currentConnection = await this._apiWrapper.getCurrentConnection(); + let currentConnection = await azdata.connection.getCurrentConnection(); let connectionId: string; if (!currentConnection) { - let connection = await this._apiWrapper.openConnectionDialog(constants.supportedProviders); + let connection = await azdata.connection.openConnectionDialog(constants.supportedProviders); if (!connection) { - this._apiWrapper.showErrorMessage(constants.needConnectionText); + vscode.window.showErrorMessage(constants.needConnectionText); return undefined; } connectionId = connection.connectionId; } else { if (currentConnection.providerId !== 'MSSQL') { - this._apiWrapper.showErrorMessage(constants.needSqlConnectionText); + vscode.window.showErrorMessage(constants.needSqlConnectionText); return undefined; } connectionId = currentConnection.connectionId; diff --git a/extensions/import/src/wizard/pages/fileConfigPage.ts b/extensions/import/src/wizard/pages/fileConfigPage.ts index 6a146228d7..3e52c5ba04 100644 --- a/extensions/import/src/wizard/pages/fileConfigPage.ts +++ b/extensions/import/src/wizard/pages/fileConfigPage.ts @@ -188,8 +188,8 @@ export class FileConfigPage extends ImportPage { this.databaseDropdown.onValueChanged(async (db) => { this.model.database = (this.databaseDropdown.value).name; //this.populateTableNames(); - let connectionProvider = this._apiWrapper.getProvider(this.model.server.providerName, azdata.DataProviderType.ConnectionProvider); - let connectionUri = await this._apiWrapper.getUriForConnection(this.model.server.connectionId); + let connectionProvider = azdata.dataprotocol.getProvider(this.model.server.providerName, azdata.DataProviderType.ConnectionProvider); + let connectionUri = await azdata.connection.getUriForConnection(this.model.server.connectionId); connectionProvider.changeDatabase(connectionUri, this.model.database); this.populateSchemaDropdown(); }); @@ -372,8 +372,8 @@ export class FileConfigPage extends ImportPage { } public async getSchemaValues(): Promise<{ displayName: string, name: string }[]> { - let connectionUri = await this._apiWrapper.getUriForConnection(this.model.server.connectionId); - let queryProvider = this._apiWrapper.getProvider(this.model.server.providerName, azdata.DataProviderType.QueryProvider); + let connectionUri = await azdata.connection.getUriForConnection(this.model.server.connectionId); + let queryProvider = azdata.dataprotocol.getProvider(this.model.server.providerName, azdata.DataProviderType.QueryProvider); let results = await queryProvider.runQueryAndReturn(connectionUri, constants.selectSchemaQuery); diff --git a/extensions/import/src/wizard/pages/summaryPage.ts b/extensions/import/src/wizard/pages/summaryPage.ts index 1868cc347c..138f67844e 100644 --- a/extensions/import/src/wizard/pages/summaryPage.ts +++ b/extensions/import/src/wizard/pages/summaryPage.ts @@ -123,7 +123,7 @@ export class SummaryPage extends ImportPage { try { result = await this.provider.sendInsertDataRequest({ - connectionString: await this._apiWrapper.getConnectionString(this.model.server.connectionId, includePasswordInConnectionString), + connectionString: await azdata.connection.getConnectionString(this.model.server.connectionId, includePasswordInConnectionString), //TODO check what SSMS uses as batch size batchSize: 500 }); diff --git a/extensions/import/yarn.lock b/extensions/import/yarn.lock index 06ec129a42..9f3c42f328 100644 --- a/extensions/import/yarn.lock +++ b/extensions/import/yarn.lock @@ -182,6 +182,42 @@ resolved "https://registry.yarnpkg.com/@istanbuljs/schema/-/schema-0.1.2.tgz#26520bf09abe4a5644cd5414e37125a8954241dd" integrity sha512-tsAQNx32a8CoFhjhijUIhI4kccIAgmGhy8LZMZgGfmXcpMbPRUqn5LWmgRttILi6yeGmBJd2xsPkFMs0PzgPCw== +"@sinonjs/commons@^1", "@sinonjs/commons@^1.6.0", "@sinonjs/commons@^1.7.0", "@sinonjs/commons@^1.7.2": + version "1.8.0" + resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-1.8.0.tgz#c8d68821a854c555bba172f3b06959a0039b236d" + integrity sha512-wEj54PfsZ5jGSwMX68G8ZXFawcSglQSXqCftWX3ec8MDUzQdHgcKvw97awHbY0efQEL5iKUOAmmVtoYgmrSG4Q== + dependencies: + type-detect "4.0.8" + +"@sinonjs/fake-timers@^6.0.0", "@sinonjs/fake-timers@^6.0.1": + version "6.0.1" + resolved "https://registry.yarnpkg.com/@sinonjs/fake-timers/-/fake-timers-6.0.1.tgz#293674fccb3262ac782c7aadfdeca86b10c75c40" + integrity sha512-MZPUxrmFubI36XS1DI3qmI0YdN1gks62JtFZvxR67ljjSNCeK6U08Zx4msEWOXuofgqUt6zPHSi1H9fbjR/NRA== + dependencies: + "@sinonjs/commons" "^1.7.0" + +"@sinonjs/formatio@^5.0.1": + version "5.0.1" + resolved "https://registry.yarnpkg.com/@sinonjs/formatio/-/formatio-5.0.1.tgz#f13e713cb3313b1ab965901b01b0828ea6b77089" + integrity sha512-KaiQ5pBf1MpS09MuA0kp6KBQt2JUOQycqVG1NZXvzeaXe5LGFqAKueIS0bw4w0P9r7KuBSVdUk5QjXsUdu2CxQ== + dependencies: + "@sinonjs/commons" "^1" + "@sinonjs/samsam" "^5.0.2" + +"@sinonjs/samsam@^5.0.2", "@sinonjs/samsam@^5.0.3": + version "5.0.3" + resolved "https://registry.yarnpkg.com/@sinonjs/samsam/-/samsam-5.0.3.tgz#86f21bdb3d52480faf0892a480c9906aa5a52938" + integrity sha512-QucHkc2uMJ0pFGjJUDP3F9dq5dx8QIaqISl9QgwLOh6P9yv877uONPGXh/OH/0zmM3tW1JjuJltAZV2l7zU+uQ== + dependencies: + "@sinonjs/commons" "^1.6.0" + lodash.get "^4.4.2" + type-detect "^4.0.8" + +"@sinonjs/text-encoding@^0.7.1": + version "0.7.1" + resolved "https://registry.yarnpkg.com/@sinonjs/text-encoding/-/text-encoding-0.7.1.tgz#8da5c6530915653f3a1f38fd5f101d8c3f8079c5" + integrity sha512-+iTbntw2IZPb/anVDbypzfQa+ay64MW0Zo8aJ8gZPWMMK6/OubMVb6lUPMagqjOPnmtauXnFCACVl3O7ogjeqQ== + "@types/mocha@^5.2.5": version "5.2.7" resolved "https://registry.yarnpkg.com/@types/mocha/-/mocha-5.2.7.tgz#315d570ccb56c53452ff8638738df60726d5b6ea" @@ -192,6 +228,18 @@ resolved "https://registry.yarnpkg.com/@types/node/-/node-12.12.7.tgz#01e4ea724d9e3bd50d90c11fd5980ba317d8fa11" integrity sha512-E6Zn0rffhgd130zbCbAr/JdXfXkoOUFAKNs/rF8qnafSJ8KYaA/j3oz7dcwal+lYjLA7xvdd5J4wdYpCTlP8+w== +"@types/sinon@^9.0.4": + version "9.0.4" + resolved "https://registry.yarnpkg.com/@types/sinon/-/sinon-9.0.4.tgz#e934f904606632287a6e7f7ab0ce3f08a0dad4b1" + integrity sha512-sJmb32asJZY6Z2u09bl0G2wglSxDlROlAejCjsnor+LzBMz17gu8IU7vKC/vWDnv9zEq2wqADHVXFjf4eE8Gdw== + dependencies: + "@types/sinonjs__fake-timers" "*" + +"@types/sinonjs__fake-timers@*": + version "6.0.1" + resolved "https://registry.yarnpkg.com/@types/sinonjs__fake-timers/-/sinonjs__fake-timers-6.0.1.tgz#681df970358c82836b42f989188d133e218c458e" + integrity sha512-yYezQwGWty8ziyYLdZjwxyMb0CZR49h8JALHGrxjQHWlqGgc8kLdHEgWrgL0uZ29DMvEVBDnHU2Wg36zKSIUtA== + agent-base@4: version "4.2.1" resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-4.2.1.tgz#d89e5999f797875674c07d87f260fc41e83e8ca9" @@ -392,6 +440,11 @@ diff@3.5.0: resolved "https://registry.yarnpkg.com/diff/-/diff-3.5.0.tgz#800c0dd1e0a8bfbc95835c202ad220fe317e5a12" integrity sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA== +diff@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/diff/-/diff-4.0.2.tgz#60f3aecb89d5fae520c11aa19efc2bb982aade7d" + integrity sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A== + dom-serializer@0: version "0.1.1" resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-0.1.1.tgz#1ec4059e284babed36eec2941d4a970a189ce7c0" @@ -576,6 +629,11 @@ is-buffer@~1.1.1: resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w== +isarray@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf" + integrity sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8= + istanbul-lib-coverage@^2.0.5: version "2.0.5" resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.5.tgz#675f0ab69503fad4b1d849f736baaca803344f49" @@ -651,6 +709,16 @@ json5@^2.1.2: dependencies: minimist "^1.2.5" +just-extend@^4.0.2: + version "4.1.0" + resolved "https://registry.yarnpkg.com/just-extend/-/just-extend-4.1.0.tgz#7278a4027d889601640ee0ce0e5a00b992467da4" + integrity sha512-ApcjaOdVTJ7y4r08xI5wIqpvwS48Q0PBG4DJROcEkH1f8MdAiNFyFxz3xoL0LWAVwjrwPYZdVHHxhRHcx/uGLA== + +lodash.get@^4.4.2: + version "4.4.2" + resolved "https://registry.yarnpkg.com/lodash.get/-/lodash.get-4.4.2.tgz#2d177f652fa31e939b4438d5341499dfa3825e99" + integrity sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk= + lodash@^4.16.4, lodash@^4.17.13, lodash@^4.17.4: version "4.17.15" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.15.tgz#b447f6670a0455bbfeedd11392eff330ea097548" @@ -777,6 +845,17 @@ ms@^2.1.1: resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.1.tgz#30a5864eb3ebb0a66f2ebe6d727af06a09d86e0a" integrity sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg== +nise@^4.0.1: + version "4.0.4" + resolved "https://registry.yarnpkg.com/nise/-/nise-4.0.4.tgz#d73dea3e5731e6561992b8f570be9e363c4512dd" + integrity sha512-bTTRUNlemx6deJa+ZyoCUTRvH3liK5+N6VQZ4NIw90AgDXY6iPnsqplNFf6STcj+ePk0H/xqxnP75Lr0J0Fq3A== + dependencies: + "@sinonjs/commons" "^1.7.0" + "@sinonjs/fake-timers" "^6.0.0" + "@sinonjs/text-encoding" "^0.7.1" + just-extend "^4.0.2" + path-to-regexp "^1.7.0" + once@^1.3.0: version "1.4.0" resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" @@ -799,6 +878,13 @@ path-parse@^1.0.6: resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.6.tgz#d62dbb5679405d72c4737ec58600e9ddcf06d24c" integrity sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw== +path-to-regexp@^1.7.0: + version "1.8.0" + resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-1.8.0.tgz#887b3ba9d84393e87a0a0b9f4cb756198b53548a" + integrity sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA== + dependencies: + isarray "0.0.1" + pend@~1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/pend/-/pend-1.2.0.tgz#7a57eb550a6783f9115331fcf4663d5c8e007a50" @@ -920,6 +1006,19 @@ should@^13.2.1: should-type-adaptors "^1.0.1" should-util "^1.0.0" +sinon@^9.0.2: + version "9.0.2" + resolved "https://registry.yarnpkg.com/sinon/-/sinon-9.0.2.tgz#b9017e24633f4b1c98dfb6e784a5f0509f5fd85d" + integrity sha512-0uF8Q/QHkizNUmbK3LRFqx5cpTttEVXudywY9Uwzy8bTfZUhljZ7ARzSxnRHWYWtVTeh4Cw+tTb3iU21FQVO9A== + dependencies: + "@sinonjs/commons" "^1.7.2" + "@sinonjs/fake-timers" "^6.0.1" + "@sinonjs/formatio" "^5.0.1" + "@sinonjs/samsam" "^5.0.3" + diff "^4.0.2" + nise "^4.0.1" + supports-color "^7.1.0" + source-map@^0.5.0: version "0.5.7" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" @@ -994,6 +1093,11 @@ to-fast-properties@^2.0.0: resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" integrity sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4= +type-detect@4.0.8, type-detect@^4.0.8: + version "4.0.8" + resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c" + integrity sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g== + typemoq@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/typemoq/-/typemoq-2.1.0.tgz#4452ce360d92cf2a1a180f0c29de2803f87af1e8"