mirror of
https://github.com/ckaczor/azuredatastudio.git
synced 2026-01-28 01:25:39 -05:00
Removing ApiWrapper and adding sinon (#11340)
* Added sinon removed api wrapper removed unnecesaary utils * merged from testfix * merged from aasim/import/downloadTestFix * merge from aasim/import/downloadTestFix
This commit is contained in:
@@ -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"
|
||||
},
|
||||
|
||||
@@ -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<any> | undefined {
|
||||
return vscode.extensions.getExtension(extensionId);
|
||||
}
|
||||
|
||||
public getUriForConnection(connectionId: string): Thenable<string> {
|
||||
return azdata.connection.getUriForConnection(connectionId);
|
||||
}
|
||||
|
||||
public getProvider<T extends azdata.DataProvider>(providerId: string, providerType: azdata.DataProviderType): T {
|
||||
return azdata.dataprotocol.getProvider<T>(providerId, providerType);
|
||||
}
|
||||
|
||||
public getCurrentConnection(): Thenable<azdata.connection.ConnectionProfile> {
|
||||
return azdata.connection.getCurrentConnection();
|
||||
}
|
||||
|
||||
public openConnectionDialog(providers?: string[]): Thenable<azdata.connection.Connection> {
|
||||
return azdata.connection.openConnectionDialog(providers);
|
||||
}
|
||||
|
||||
public showErrorMessage(message: string, ...items: string[]): Thenable<string | undefined> {
|
||||
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<vscode.Uri[] | undefined> {
|
||||
return vscode.window.showOpenDialog(options);
|
||||
}
|
||||
|
||||
public getActiveConnections(): Thenable<azdata.connection.Connection[]> {
|
||||
return azdata.connection.getActiveConnections();
|
||||
}
|
||||
|
||||
public listDatabases(connectionId: string): Thenable<string[]> {
|
||||
return azdata.connection.listDatabases(connectionId);
|
||||
}
|
||||
|
||||
public openExternal(target: vscode.Uri): Thenable<boolean> {
|
||||
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);
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
@@ -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));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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<void> {
|
||||
|
||||
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);
|
||||
|
||||
|
||||
@@ -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<string> {
|
||||
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();
|
||||
|
||||
@@ -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<ApiWrapper>;
|
||||
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());
|
||||
});
|
||||
});
|
||||
|
||||
|
||||
@@ -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<boolean> {
|
||||
return fs.promises.access(path, fs.constants.F_OK)
|
||||
.then(() => true)
|
||||
.catch(() => false);
|
||||
}
|
||||
|
||||
public static async getExtensionPath(): Promise<string> {
|
||||
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<azdata.window.WizardPageChangeInfo> = new vscode.EventEmitter<any>().event;
|
||||
addPage(page: azdata.window.WizardPage, index?: number): Thenable<void> {
|
||||
throw new Error('Method not implemented.');
|
||||
}
|
||||
removePage(index: number): Thenable<void> {
|
||||
throw new Error('Method not implemented.');
|
||||
}
|
||||
setCurrentPage(index: number): Thenable<void> {
|
||||
throw new Error('Method not implemented.');
|
||||
}
|
||||
open(): Thenable<void> {
|
||||
throw new Error('Method not implemented.');
|
||||
}
|
||||
close(): Thenable<void> {
|
||||
throw new Error('Method not implemented.');
|
||||
}
|
||||
registerNavigationValidator(validator: (pageChangeInfo: azdata.window.WizardPageChangeInfo) => boolean | Thenable<boolean>): 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>): void {
|
||||
throw new Error('Method not implemented.');
|
||||
}
|
||||
modelView: azdata.ModelView;
|
||||
valid: boolean;
|
||||
onValidityChanged: vscode.Event<boolean>;
|
||||
|
||||
}
|
||||
|
||||
export class TestButton implements azdata.window.Button {
|
||||
label: string;
|
||||
enabled: boolean;
|
||||
hidden: boolean;
|
||||
focused?: boolean;
|
||||
constructor(private onClickEmitter: vscode.EventEmitter<void>) {
|
||||
}
|
||||
onClick: vscode.Event<void> = this.onClickEmitter.event;
|
||||
position?: azdata.window.DialogButtonPosition;
|
||||
}
|
||||
|
||||
export class TestExtensionContext implements vscode.ExtensionContext {
|
||||
extensionMode: vscode.ExtensionMode;
|
||||
subscriptions: { dispose(): any; }[];
|
||||
|
||||
@@ -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<FlatFileWizard>;
|
||||
let mockApiWrapper: TypeMoq.IMock<ApiWrapper>;
|
||||
let mockImportModel: TypeMoq.IMock<ImportDataModel>;
|
||||
|
||||
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
|
||||
|
||||
@@ -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<ApiWrapper>;
|
||||
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<any> = new vscode.EventEmitter<any>();
|
||||
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);
|
||||
|
||||
|
||||
@@ -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<FlatFileWizard>;
|
||||
let mockApiWrapper: TypeMoq.IMock<ApiWrapper>;
|
||||
let mockImportModel: TypeMoq.IMock<ImportDataModel>;
|
||||
|
||||
let fileConfigPage: FileConfigPage;
|
||||
@@ -26,15 +25,15 @@ describe('File config page', function () {
|
||||
let pages: Map<number, ImportPage> = new Map<number, ImportPage>();
|
||||
|
||||
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<azdata.QueryProvider>(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();
|
||||
|
||||
@@ -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<FlatFileWizard>;
|
||||
let mockImportModel: TypeMoq.IMock<ImportDataModel>;
|
||||
let mockApiWrapper: TypeMoq.IMock<ApiWrapper>;
|
||||
let pages: Map<number, ImportPage> = new Map<number, ImportPage>();
|
||||
let mockFlatFileProvider: TypeMoq.IMock<FlatFileProvider>;
|
||||
|
||||
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();
|
||||
|
||||
@@ -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<FlatFileWizard>;
|
||||
let mockImportModel: TypeMoq.IMock<ImportDataModel>;
|
||||
let mockApiWrapper: TypeMoq.IMock<ApiWrapper>;
|
||||
|
||||
// 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();
|
||||
|
||||
@@ -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<FlatFileWizard>;
|
||||
let mockImportModel: TypeMoq.IMock<ImportDataModel>;
|
||||
let mockApiWrapper: TypeMoq.IMock<ApiWrapper>;
|
||||
let mockFlatFileProvider: TypeMoq.IMock<FlatFileProvider>;
|
||||
|
||||
let summaryPage: SummaryPage;
|
||||
@@ -28,16 +26,13 @@ describe('import extension summary page tests', function () {
|
||||
let pages: Map<number, ImportPage> = new Map<number, ImportPage>();
|
||||
|
||||
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();
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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<string> {
|
||||
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;
|
||||
|
||||
@@ -188,8 +188,8 @@ export class FileConfigPage extends ImportPage {
|
||||
this.databaseDropdown.onValueChanged(async (db) => {
|
||||
this.model.database = (<azdata.CategoryValue>this.databaseDropdown.value).name;
|
||||
//this.populateTableNames();
|
||||
let connectionProvider = this._apiWrapper.getProvider<azdata.ConnectionProvider>(this.model.server.providerName, azdata.DataProviderType.ConnectionProvider);
|
||||
let connectionUri = await this._apiWrapper.getUriForConnection(this.model.server.connectionId);
|
||||
let connectionProvider = azdata.dataprotocol.getProvider<azdata.ConnectionProvider>(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<azdata.QueryProvider>(this.model.server.providerName, azdata.DataProviderType.QueryProvider);
|
||||
let connectionUri = await azdata.connection.getUriForConnection(this.model.server.connectionId);
|
||||
let queryProvider = azdata.dataprotocol.getProvider<azdata.QueryProvider>(this.model.server.providerName, azdata.DataProviderType.QueryProvider);
|
||||
|
||||
let results = await queryProvider.runQueryAndReturn(connectionUri, constants.selectSchemaQuery);
|
||||
|
||||
|
||||
@@ -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
|
||||
});
|
||||
|
||||
@@ -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"
|
||||
|
||||
Reference in New Issue
Block a user