Code refactoring for extension testing (#10529)

* Setting up tests on import extension

* -Added API wrappers for all the azdata and vscode APIs to make them easily mockable
-Added some unit tests for the import extension
-Some code logic separations

* -added code report for the import extension in ci

* Did some more code refractoring

* -Added json report generation

* updated vscodetestcoverage to latest version in import extension.

* -remove duplicate codecoverageConfig.json
This commit is contained in:
Aasim Khan
2020-06-16 13:24:48 -07:00
committed by GitHub
parent 94bc0d9559
commit f725ee96b9
22 changed files with 1356 additions and 231 deletions

View File

@@ -0,0 +1,88 @@
/*---------------------------------------------------------------------------------------------
* 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);
}
}

View File

@@ -0,0 +1,60 @@
/*---------------------------------------------------------------------------------------------
* Copyright (c) Microsoft Corporation. All rights reserved.
* Licensed under the Source EULA. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/
import * as nls from 'vscode-nls';
const localize = nls.loadMessageBundle();
export const extensionConfigSectionName = 'flatFileImport';
export const serviceName = 'Flat File Import Service';
export const providerId = 'FlatFileImport';
export const configLogDebugInfo = 'logDebugInfo';
export const sqlConfigSectionName = 'sql';
export const mssqlProvider = 'MSSQL';
export const supportedProviders = [mssqlProvider];
// Links
export const serviceCrashLink = 'https://github.com/Microsoft/azuredatastudio/issues/2090';
// Tasks
export const flatFileImportStartCommand = 'flatFileImport.start';
// Localized texts
export const crashButtonText = localize('import.serviceCrashButton', "Give Feedback");
export const serviceCrashMessageText = localize('serviceCrashMessage', "service component could not start");
export const serverDropDownTitleText = localize('flatFileImport.serverDropdownTitle', "Server the database is in");
export const databaseDropdownTitleText = localize('flatFileImport.databaseDropdownTitle', "Database the table is created in");
export const browseFilesText = localize('flatFileImport.browseFiles', "Browse");
export const openFileText = localize('flatFileImport.openFile', "Open");
export const fileTextboxTitleText = localize('flatFileImport.fileTextboxTitle', "Location of the file to be imported");
export const tableTextboxTitleText = localize('flatFileImport.tableTextboxTitle', "New table name");
export const schemaTextboxTitleText = localize('flatFileImport.schemaTextboxTitle', "Table schema");
export const importDataText = localize('flatFileImport.importData', "Import Data");
export const nextText = localize('flatFileImport.next', "Next");
export const columnNameText = localize('flatFileImport.columnName', "Column Name");
export const dataTypeText = localize('flatFileImport.dataType', "Data Type");
export const primaryKeyText = localize('flatFileImport.primaryKey', "Primary Key");
export const allowNullsText = localize('flatFileImport.allowNulls', "Allow Nulls");
export const successTitleText = localize('flatFileImport.prosePreviewMessage', "This operation analyzed the input file structure to generate the preview below for up to the first 50 rows.");
export const failureTitleText = localize('flatFileImport.prosePreviewMessageFail', "This operation was unsuccessful. Please try a different input file.");
export const refreshText = localize('flatFileImport.refresh', "Refresh");
export const importInformationText = localize('flatFileImport.importInformation', "Import information");
export const importStatusText = localize('flatFileImport.importStatus', "Import status");
export const serverNameText = localize('flatFileImport.serverName', "Server name");
export const databaseText = localize('flatFileImport.databaseName', "Database name");
export const tableNameText = localize('flatFileImport.tableName', "Table name");
export const tableSchemaText = localize('flatFileImport.tableSchema', "Table schema");
export const fileImportText = localize('flatFileImport.fileImport', "File to be imported");
export const updateText = localize('flatFileImport.success.norows', "✔ You have successfully inserted the data into a table.");
export const needConnectionText = localize('import.needConnection', "Please connect to a server before using this wizard.");
export const needSqlConnectionText = localize('import.needSQLConnection', "SQL Server Import extension does not support this type of connection");
export const wizardNameText = localize('flatFileImport.wizardName', "Import flat file wizard");
export const page1NameText = localize('flatFileImport.page1Name', "Specify Input File");
export const page2NameText = localize('flatFileImport.page2Name', "Preview Data");
export const page3NameText = localize('flatFileImport.page3Name', "Modify Columns");
export const page4NameText = localize('flatFileImport.page4Name', "Summary");
export const importNewFileText = localize('flatFileImport.importNewFile', "Import new file");
// SQL Queries
export const selectSchemaQuery = `SELECT name FROM sys.schemas`;