mirror of
https://github.com/ckaczor/azuredatastudio.git
synced 2026-02-16 10:58:30 -05:00
Additional tests for import extension (#10953)
* 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 * changes code coverage to 36% * adding some comments * Removing unnecessary exports * -refactored test code to replicate src structure -some changes mentioned in the pr * removed unnecessary prefixes from test case name
This commit is contained in:
125
extensions/import/src/test/wizard/api/basePage.test.ts
Normal file
125
extensions/import/src/test/wizard/api/basePage.test.ts
Normal file
@@ -0,0 +1,125 @@
|
||||
/*---------------------------------------------------------------------------------------------
|
||||
* Copyright (c) Microsoft Corporation. All rights reserved.
|
||||
* Licensed under the Source EULA. See License.txt in the project root for license information.
|
||||
*--------------------------------------------------------------------------------------------*/
|
||||
|
||||
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';
|
||||
|
||||
describe('import extension wizard pages', function () {
|
||||
|
||||
let mockFlatFileWizard: TypeMoq.IMock<FlatFileWizard>;
|
||||
let mockApiWrapper: TypeMoq.IMock<ApiWrapper>;
|
||||
let mockImportModel: TypeMoq.IMock<ImportDataModel>;
|
||||
|
||||
this.beforeEach(function () {
|
||||
mockApiWrapper = TypeMoq.Mock.ofType(ApiWrapper);
|
||||
mockFlatFileWizard = TypeMoq.Mock.ofType(FlatFileWizard, TypeMoq.MockBehavior.Loose, undefined, TypeMoq.It.isAny(), mockApiWrapper.object);
|
||||
mockImportModel = TypeMoq.Mock.ofType(TestImportDataModel, TypeMoq.MockBehavior.Loose);
|
||||
});
|
||||
|
||||
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; });
|
||||
mockImportModel.object.server = {
|
||||
providerName: 'MSSQL',
|
||||
connectionId: 'testConnectionId',
|
||||
options: {}
|
||||
};
|
||||
mockImportModel.object.database = activeDatabase;
|
||||
|
||||
// Creating assert variables
|
||||
let expectedDatabaseValues = [
|
||||
{ displayName: 'testdb2', name: 'testdb2' }, // This should be the first database as it is active in the extension.
|
||||
{ displayName: 'testdb1', name: 'testdb1' },
|
||||
{ displayName: 'testdb3', name: 'testdb3' }
|
||||
];
|
||||
|
||||
let actualDatabaseValues = await importPage.getDatabaseValues();
|
||||
should(expectedDatabaseValues).deepEqual(actualDatabaseValues);
|
||||
});
|
||||
|
||||
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);
|
||||
|
||||
// mocking getActive connection to return null
|
||||
mockApiWrapper.setup(x => x.getActiveConnections()).returns(async () => { return undefined; });
|
||||
|
||||
let serverValues = await importPage.getServerValues();
|
||||
|
||||
should(serverValues).undefined();
|
||||
|
||||
// mocking getActive connection returns empty array
|
||||
mockApiWrapper.setup(x => x.getActiveConnections()).returns(async () => { return [] as azdata.connection.Connection[]; });
|
||||
|
||||
serverValues = await importPage.getServerValues();
|
||||
should(serverValues).undefined();
|
||||
});
|
||||
|
||||
it('getServerValue return active server value first', async function () {
|
||||
// settign up the enviornment
|
||||
let testActiveConnections: azdata.connection.Connection[] = [
|
||||
{
|
||||
providerName: 'MSSQL',
|
||||
connectionId: 'testConnection1Id',
|
||||
options: {
|
||||
user: 'testcon1user',
|
||||
server: 'testcon1server'
|
||||
}
|
||||
},
|
||||
{
|
||||
providerName: 'MSSQL',
|
||||
connectionId: 'testConnection2Id',
|
||||
options: {
|
||||
user: 'testcon2user',
|
||||
server: 'testcon2server'
|
||||
}
|
||||
},
|
||||
{
|
||||
providerName: 'PGSQL',
|
||||
connectionId: 'testConnection3Id',
|
||||
options: {
|
||||
user: null, // setting it null to check if function return user as 'default
|
||||
server: 'testcon3server'
|
||||
}
|
||||
}
|
||||
];
|
||||
|
||||
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; });
|
||||
mockImportModel.object.server = ImportTestUtils.getTestServer();
|
||||
|
||||
let expectedConnectionValues = [
|
||||
{
|
||||
connection: testActiveConnections[1],
|
||||
displayName: 'testcon2server (testcon2user)',
|
||||
name: 'testConnection2Id'
|
||||
},
|
||||
{
|
||||
connection: testActiveConnections[0],
|
||||
displayName: 'testcon1server (testcon1user)',
|
||||
name: 'testConnection1Id'
|
||||
},
|
||||
{
|
||||
connection: testActiveConnections[2],
|
||||
displayName: 'testcon3server (default)',
|
||||
name: 'testConnection3Id'
|
||||
}
|
||||
];
|
||||
let actualConnectionValues = await importPage.getServerValues();
|
||||
should(expectedConnectionValues).deepEqual(actualConnectionValues);
|
||||
|
||||
});
|
||||
});
|
||||
122
extensions/import/src/test/wizard/flatFileWizard.test.ts
Normal file
122
extensions/import/src/test/wizard/flatFileWizard.test.ts
Normal file
@@ -0,0 +1,122 @@
|
||||
/*---------------------------------------------------------------------------------------------
|
||||
* Copyright (c) Microsoft Corporation. All rights reserved.
|
||||
* Licensed under the Source EULA. See License.txt in the project root for license information.
|
||||
*--------------------------------------------------------------------------------------------*/
|
||||
|
||||
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 * as should from 'should';
|
||||
|
||||
describe('import extension flat file wizard', function () {
|
||||
let mockApiWrapper: TypeMoq.IMock<ApiWrapper>;
|
||||
this.beforeEach(function () {
|
||||
mockApiWrapper = TypeMoq.Mock.ofType(ApiWrapper);
|
||||
});
|
||||
it('opens connectionDialog when there are no active connections', async function () {
|
||||
let testConnection: azdata.connection.Connection = {
|
||||
providerName: 'MSSQL',
|
||||
connectionId: 'testConnectionId',
|
||||
options: {}
|
||||
};
|
||||
|
||||
// There is no current connection.
|
||||
mockApiWrapper.setup(x => x.getCurrentConnection()).returns(() => { return undefined; });
|
||||
|
||||
|
||||
// openConnectionDialog returns a test connection
|
||||
mockApiWrapper.setup(x => x.openConnectionDialog(TypeMoq.It.isAny())).returns(async () => { return testConnection; });
|
||||
|
||||
let testFlatFileWizard = new FlatFileWizard(TypeMoq.It.isAny(), mockApiWrapper.object);
|
||||
|
||||
await testFlatFileWizard.getConnectionId();
|
||||
|
||||
// openConnectionDialog will be called once
|
||||
mockApiWrapper.verify(x => x.openConnectionDialog(TypeMoq.It.isAny()), TypeMoq.Times.once());
|
||||
|
||||
});
|
||||
|
||||
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; });
|
||||
|
||||
let testFlatFileWizard = new FlatFileWizard(TypeMoq.It.isAny(), mockApiWrapper.object);
|
||||
|
||||
await testFlatFileWizard.getConnectionId();
|
||||
|
||||
mockApiWrapper.verify(x => x.showErrorMessage(TypeMoq.It.isAny()), TypeMoq.Times.once());
|
||||
|
||||
});
|
||||
|
||||
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; });
|
||||
|
||||
let testFlatFileWizard = new FlatFileWizard(TypeMoq.It.isAny(), mockApiWrapper.object);
|
||||
|
||||
await testFlatFileWizard.getConnectionId();
|
||||
|
||||
mockApiWrapper.verify(x => x.showErrorMessage(TypeMoq.It.isAny()), TypeMoq.Times.once());
|
||||
|
||||
});
|
||||
|
||||
it('getConnection returns active connection', async function () {
|
||||
let testConnectionProfile = ImportTestUtils.getTestConnectionProfile();
|
||||
testConnectionProfile.providerId = 'MSSQL';
|
||||
|
||||
//mocking an active connection
|
||||
mockApiWrapper.setup(x => x.getCurrentConnection()).returns(async () => { return testConnectionProfile; })
|
||||
|
||||
let testFlatFileWizard = new FlatFileWizard(TypeMoq.It.isAny(), mockApiWrapper.object);
|
||||
|
||||
//getConnectionID should return the connectionId of active connection
|
||||
let connectionId = await testFlatFileWizard.getConnectionId();
|
||||
should(connectionId).equals(testConnectionProfile.connectionId);
|
||||
});
|
||||
|
||||
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);
|
||||
|
||||
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);
|
||||
|
||||
await testFlatFileWizard.start(testProvider);
|
||||
|
||||
// asserting all wizard pages are getting created
|
||||
should.notEqual(testFlatFileWizard.wizard, undefined);
|
||||
should.notEqual(testFlatFileWizard.page1, undefined);
|
||||
should.notEqual(testFlatFileWizard.page2, undefined);
|
||||
should.notEqual(testFlatFileWizard.page3, undefined);
|
||||
should.notEqual(testFlatFileWizard.page4, undefined);
|
||||
|
||||
let expectedPages = [
|
||||
testFlatFileWizard.page1,
|
||||
testFlatFileWizard.page2,
|
||||
testFlatFileWizard.page3,
|
||||
testFlatFileWizard.page4
|
||||
];
|
||||
should.deepEqual(testFlatFileWizard.wizard.pages, expectedPages);
|
||||
|
||||
});
|
||||
});
|
||||
@@ -0,0 +1,66 @@
|
||||
/*---------------------------------------------------------------------------------------------
|
||||
* Copyright (c) Microsoft Corporation. All rights reserved.
|
||||
* Licensed under the Source EULA. See License.txt in the project root for license information.
|
||||
*--------------------------------------------------------------------------------------------*/
|
||||
|
||||
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';
|
||||
|
||||
describe('import extension wizard pages', function () {
|
||||
|
||||
let mockFlatFileWizard: TypeMoq.IMock<FlatFileWizard>;
|
||||
let mockApiWrapper: TypeMoq.IMock<ApiWrapper>;
|
||||
let mockImportModel: TypeMoq.IMock<ImportDataModel>;
|
||||
|
||||
this.beforeEach(function () {
|
||||
mockApiWrapper = TypeMoq.Mock.ofType(ApiWrapper);
|
||||
mockFlatFileWizard = TypeMoq.Mock.ofType(FlatFileWizard, TypeMoq.MockBehavior.Loose, undefined, TypeMoq.It.isAny(), mockApiWrapper.object);
|
||||
mockImportModel = TypeMoq.Mock.ofType(TestImportDataModel, TypeMoq.MockBehavior.Loose);
|
||||
});
|
||||
|
||||
it('get schema returns active schema first', async function () {
|
||||
mockApiWrapper.setup(x => x.getUriForConnection(TypeMoq.It.isAny()));
|
||||
let mockQueryProvider = TypeMoq.Mock.ofType(TestQueryProvider);
|
||||
let schemaQueryResult: azdata.SimpleExecuteResult = {
|
||||
rowCount: 3,
|
||||
rows: [
|
||||
[
|
||||
{ displayValue: 'schema1', isNull: false, invariantCultureDisplayValue: 'schema1' }
|
||||
],
|
||||
[
|
||||
{ displayValue: 'schema2', isNull: false, invariantCultureDisplayValue: 'schema2' }
|
||||
],
|
||||
[
|
||||
{ displayValue: 'schema3', isNull: false, invariantCultureDisplayValue: 'schema3' }
|
||||
]
|
||||
],
|
||||
columnInfo: undefined
|
||||
}
|
||||
|
||||
let expectedSchemaValues = [
|
||||
{ displayName: 'schema2', name: 'schema2' }, // This should be the first database as it is active in the extension.
|
||||
{ displayName: 'schema1', name: 'schema1' },
|
||||
{ displayName: 'schema3', name: 'schema3' }
|
||||
];
|
||||
|
||||
mockImportModel.object.schema = 'schema2';
|
||||
mockImportModel.object.server = {
|
||||
providerName: 'MSSQL',
|
||||
connectionId: 'testConnectionId',
|
||||
options: {}
|
||||
};
|
||||
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; });
|
||||
|
||||
let importPage = new FileConfigPage(mockFlatFileWizard.object, TypeMoq.It.isAny(), mockImportModel.object, TypeMoq.It.isAny(), TypeMoq.It.isAny(), mockApiWrapper.object);
|
||||
let actualSchemaValues = await importPage.getSchemaValues();
|
||||
|
||||
should(expectedSchemaValues).deepEqual(actualSchemaValues);
|
||||
});
|
||||
});
|
||||
Reference in New Issue
Block a user