From f05608666205c27e073924a0471cce66cead461c Mon Sep 17 00:00:00 2001 From: Anthony Dresser Date: Tue, 7 Apr 2020 14:50:20 -0700 Subject: [PATCH] Remove checks for integration testing (#9856) * remove checks for testing * fix schema compare tests * move some files * fix file location * fixc another file path --- build/lib/testSetup.js | 57 ---- build/lib/testSetup.ts | 67 ----- extensions/integration-tests/package.json | 25 -- .../integration-tests/src/testContext.ts | 10 - .../integration-tests/src/tests/cms.test.ts | 279 +++++++++--------- .../src/tests/dacpac.test.ts | 199 ++++++------- .../src/tests/notebook.test.ts | 180 ++++++----- .../src/{ => tests}/notebook.util.ts | 0 .../src/tests/objectExplorer.test.ts | 45 ++- .../src/tests/schemaCompare.test.ts | 67 ++--- .../src/{ => tests}/testConfig.ts | 0 .../src/{ => tests}/utils.ts | 0 .../integration-tests/src/{ => tests}/uuid.ts | 0 13 files changed, 378 insertions(+), 551 deletions(-) delete mode 100644 build/lib/testSetup.js delete mode 100644 build/lib/testSetup.ts delete mode 100644 extensions/integration-tests/src/testContext.ts rename extensions/integration-tests/src/{ => tests}/notebook.util.ts (100%) rename extensions/integration-tests/src/{ => tests}/testConfig.ts (100%) rename extensions/integration-tests/src/{ => tests}/utils.ts (100%) rename extensions/integration-tests/src/{ => tests}/uuid.ts (100%) diff --git a/build/lib/testSetup.js b/build/lib/testSetup.js deleted file mode 100644 index c1072d8495..0000000000 --- a/build/lib/testSetup.js +++ /dev/null @@ -1,57 +0,0 @@ -"use strict"; -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the Source EULA. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ -const fs = require('fs').promises; -const path = require('path'); -const readConfiguration = (async () => { - const parseConfigString = ((content) => { - try { - const result = JSON.parse(content); - return result; - } - catch (ex) { - console.log('Could NOT parse TEST_RUN_LIST:', content); - } - }); - // Attempt to read from an enviornment variable - const testRunlist = process.env['TEST_RUN_LIST']; - if (testRunlist && testRunlist !== '') { - const result = parseConfigString(testRunlist); - if (result) { - console.log('Using the environment test run list:', result); - return result; - } - } - // Attempt to read from a config file - let testRunPath = process.env['TEST_RUN_LIST_FILE']; - if (!testRunPath || testRunPath === '') { - testRunPath = path.resolve(__dirname, '..', 'runlist.json'); - } - try { - const contents = await fs.readFile(testRunPath); - return parseConfigString(contents); - } - catch (ex) { - console.log(`error reading file ${testRunPath}:`, ex); - } -}); -(async () => { - const keys = process.argv.slice(2); - const configuration = await readConfiguration(); - if (!configuration) { - console.log('no configuration was setup'); - return; - } - const testList = []; - keys.forEach((key) => { - const arr = configuration[key]; - if (arr) { - testList.push(...arr); - } - }); - const result = `(${testList.join('|')})`; - console.log(result); - process.env['TEST_GREP'] = result; -})(); diff --git a/build/lib/testSetup.ts b/build/lib/testSetup.ts deleted file mode 100644 index 1620319d25..0000000000 --- a/build/lib/testSetup.ts +++ /dev/null @@ -1,67 +0,0 @@ -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the Source EULA. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ -const fs = require('fs').promises; -const path = require('path'); - -interface IntegrationTestConfig { - [key: string]: string[]; -} - -const readConfiguration = (async (): Promise => { - const parseConfigString = ((content: string): (IntegrationTestConfig | void) => { - try { - const result = JSON.parse(content); - return result as IntegrationTestConfig; - } catch (ex) { - console.log('Could NOT parse TEST_RUN_LIST:', content); - } - }); - - // Attempt to read from an enviornment variable - const testRunlist = process.env['TEST_RUN_LIST']; - if (testRunlist && testRunlist !== '') { - const result = parseConfigString(testRunlist); - if (result) { - console.log('Using the environment test run list:', result); - return result; - } - } - - // Attempt to read from a config file - let testRunPath = process.env['TEST_RUN_LIST_FILE']; - if (!testRunPath || testRunPath === '') { - testRunPath = path.resolve(__dirname, '..', 'runlist.json'); - } - - try { - const contents = await fs.readFile(testRunPath); - return parseConfigString(contents); - } catch (ex) { - console.log(`error reading file ${testRunPath}:`, ex); - } -}); - -(async (): Promise => { - const keys = process.argv.slice(2); - - const configuration = await readConfiguration(); - - if (!configuration) { - console.log('no configuration was setup'); - return; - } - - const testList: string[] = []; - keys.forEach((key) => { - const arr = configuration[key]; - if (arr) { - testList.push(...arr); - } - }); - - const result = `(${testList.join('|')})`; - console.log(result); - process.env['TEST_GREP'] = result; -})(); diff --git a/extensions/integration-tests/package.json b/extensions/integration-tests/package.json index d34987d36d..5d989f3d78 100644 --- a/extensions/integration-tests/package.json +++ b/extensions/integration-tests/package.json @@ -21,31 +21,6 @@ "Microsoft.notebook", "Microsoft.azuredatastudio-postgresql" ], - "contributes": { - "configuration": { - "type": "object", - "title": "ADS Integration Test Configuration", - "properties": { - "test.testSetupCompleted": { - "type": "boolean", - "default": false, - "description": "" - } - } - }, - "commands": [ - { - "command": "test.setupIntegrationTest", - "title": "Setup Integration Test", - "category": "Test" - }, - { - "command": "test.waitForExtensionsToLoad", - "title": "Wait For Extensions To Load", - "category": "Test" - } - ] - }, "scripts": { "vscode:prepublish": "node ../../node_modules/gulp/bin/gulp.js --gulpfile ../../build/gulpfile.extensions.js compile-extension:vscode-colorize-tests ./tsconfig.json", "postinstall": "node ./node_modules/vscode/bin/install" diff --git a/extensions/integration-tests/src/testContext.ts b/extensions/integration-tests/src/testContext.ts deleted file mode 100644 index ef3da02321..0000000000 --- a/extensions/integration-tests/src/testContext.ts +++ /dev/null @@ -1,10 +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'; - -export function isTestSetupCompleted(): boolean { - return vscode.workspace.getConfiguration('test')['testSetupCompleted']; -} diff --git a/extensions/integration-tests/src/tests/cms.test.ts b/extensions/integration-tests/src/tests/cms.test.ts index e439d7fb67..abfab188a3 100644 --- a/extensions/integration-tests/src/tests/cms.test.ts +++ b/extensions/integration-tests/src/tests/cms.test.ts @@ -7,11 +7,10 @@ import 'mocha'; import * as vscode from 'vscode'; import * as azdata from 'azdata'; import * as mssql from '../../../mssql'; -import * as utils from '../utils'; -import * as uuid from '../uuid'; -import { isTestSetupCompleted } from '../testContext'; +import * as utils from './utils'; +import * as uuid from './uuid'; import assert = require('assert'); -import { getStandaloneServer, TestServerProfile } from '../testConfig'; +import { getStandaloneServer, TestServerProfile } from './testConfig'; let cmsService: mssql.ICmsService; let server: TestServerProfile; @@ -23,143 +22,141 @@ const TEST_CMS_GROUP = `adsTestCmsGroup_${uuid.v4().asHex()}`; const TEST_CMS_SERVER = `adsTestCmsServer_${uuid.v4().asHex()}`; const TEST_CMS_REG_SERVER = `adsTestCmsRegisteredServer_${uuid.v4().asHex()}`; -if (isTestSetupCompleted()) { - suite('CMS integration test suite', () => { +suite('CMS integration test suite', () => { - setup(async function () { - // Set up CMS provider - if (!cmsService) { - cmsService = ((await vscode.extensions.getExtension(mssql.extension.name).activate() as mssql.IExtension)).cmsService; - assert(cmsService !== undefined); - } + setup(async function () { + // Set up CMS provider + if (!cmsService) { + cmsService = ((await vscode.extensions.getExtension(mssql.extension.name).activate() as mssql.IExtension)).cmsService; + assert(cmsService !== undefined); + } - // Set up connection - if (!server) { - server = await getStandaloneServer(); - connectionId = await utils.connectToServer(server, SERVER_CONNECTION_TIMEOUT); - ownerUri = await azdata.connection.getConnectionString(connectionId, true); - console.log('Start CMS tests'); - } - if (!ownerUri) { - ownerUri = await azdata.connection.getConnectionString(connectionId, true); - } - }); - - test('Create CMS Server', async function () { - // Should fail - await utils.assertThrowsAsync( - async () => await cmsService.createCmsServer(undefined, 'test_description', undefined, ownerUri), - 'Cannot add a CMS server without a name or connection'); - let connection = { - serverName: server.serverName, - userName: server.userName, - password: server.password, - authenticationType: server.authenticationTypeName, - database: server.database, - provider: server.provider, - version: server.version, - engineType: server.engineType, - options: {} - }; - - // Should create a CMS Server without an error - await cmsService.createCmsServer(TEST_CMS_NAME, 'test_description', connection, ownerUri); - }); - - test('Add and delete registered group to/from CMS server', async function () { - await utils.assertThrowsAsync( - async () => await cmsService.addServerGroup(ownerUri, '', undefined, 'test_description'), - 'Cannot add a server group without a name'); - - // Should create a server group - let result = await cmsService.addServerGroup(ownerUri, '', TEST_CMS_GROUP, 'test_description'); - assert(result === true, `Server group ${TEST_CMS_GROUP} was not added to CMS server successfully`); - - let existingRegisteredServerGroupCount = (await cmsService.getRegisteredServers(ownerUri, '')).registeredServerGroups.length; - - // Shouldn't be able to create a new server group with same name - await utils.assertThrowsAsync( - async () => await cmsService.addServerGroup(ownerUri, '', TEST_CMS_GROUP, 'test_description'), - 'Cannot add a server group with existing name'); - - let cmsResources = await cmsService.getRegisteredServers(ownerUri, ''); - assert(cmsResources.registeredServerGroups.length === existingRegisteredServerGroupCount, - `Unexpected number of Registered Server Groups after attempting to add group that already exists. Groups : [${cmsResources.registeredServerGroups.map(g => g.name).join(', ')}]`); - - // Should remove the server group we added above - let deleteResult = await cmsService.removeServerGroup(ownerUri, '', TEST_CMS_GROUP); - assert(deleteResult === true, `Server group ${TEST_CMS_GROUP} was not removed successfully`); - - cmsResources = await cmsService.getRegisteredServers(ownerUri, ''); - assert(cmsResources.registeredServerGroups.find(g => g.name === TEST_CMS_GROUP) === undefined, - `The server group ${TEST_CMS_GROUP} was not removed successfully. Groups : [${cmsResources.registeredServerGroups.map(g => g.name).join(', ')}]`); - }); - - test('Add and delete registered server to/from CMS server', async function () { - - await utils.assertThrowsAsync( - async () => cmsService.addRegisteredServer(ownerUri, '', undefined, 'test_description', undefined), - 'Cannot add a registered without a name or connection'); - - let server = await getStandaloneServer('2019'); - let connection = { - serverName: server.serverName, - userName: server.userName, - password: server.password, - authenticationType: server.authenticationTypeName, - database: server.database, - provider: server.provider, - version: server.version, - engineType: server.engineType, - options: {} - }; - - // Should create a registered server - let result = await cmsService.addRegisteredServer(ownerUri, '', TEST_CMS_SERVER, 'test_description', connection); - assert(result === true, `Registered server ${TEST_CMS_SERVER} was not added to CMS server successfully`); - - // Shouldn't be able to create a new registered server with same name - await utils.assertThrowsAsync( - async () => await cmsService.addRegisteredServer(ownerUri, '', TEST_CMS_SERVER, 'test_description', connection), - 'Cannot add a registered server with existing name'); - - // Should remove the registered server we added above - let deleteResult = await cmsService.removeRegisteredServer(ownerUri, '', TEST_CMS_SERVER); - assert(deleteResult === true, `Registered server ${TEST_CMS_SERVER} was not removed correctly`); - }); - - test('Add and delete registered server to/from server group', async function () { - - // Should create a server group - let result = await cmsService.addServerGroup(ownerUri, '', TEST_CMS_GROUP, 'test_description'); - assert(result === true, `Server group ${TEST_CMS_GROUP} was not created successfully`); - - // Make sure server group is created - let cmsResources = await cmsService.getRegisteredServers(ownerUri, ''); - assert(cmsResources.registeredServerGroups.find(g => g.name === TEST_CMS_GROUP), - `Registered Server Group ${TEST_CMS_GROUP} was not found after being added. Groups : [${cmsResources.registeredServerGroups.map(g => g.name).join(', ')}]`); - - // Should create a registered server under the group - let server = await getStandaloneServer('2019'); - let connection = { - serverName: server.serverName, - userName: server.userName, - password: server.password, - authenticationType: server.authenticationTypeName, - database: server.database, - provider: server.provider, - version: server.version, - engineType: server.engineType, - options: {} - }; - let relativePath = cmsResources.registeredServerGroups[0].relativePath; - - result = await cmsService.addRegisteredServer(ownerUri, relativePath, TEST_CMS_REG_SERVER, 'test_description', connection); - assert(result === true, `Registered server ${TEST_CMS_REG_SERVER} was not added to server group successfully`); - - // Should remove the server group we added above - let deleteResult = await cmsService.removeServerGroup(ownerUri, '', TEST_CMS_GROUP); - assert(deleteResult === true, `Server group ${TEST_CMS_GROUP} was not deleted from CMS server successfully`); - }); + // Set up connection + if (!server) { + server = await getStandaloneServer(); + connectionId = await utils.connectToServer(server, SERVER_CONNECTION_TIMEOUT); + ownerUri = await azdata.connection.getConnectionString(connectionId, true); + console.log('Start CMS tests'); + } + if (!ownerUri) { + ownerUri = await azdata.connection.getConnectionString(connectionId, true); + } }); -} + + test('Create CMS Server', async function () { + // Should fail + await utils.assertThrowsAsync( + async () => await cmsService.createCmsServer(undefined, 'test_description', undefined, ownerUri), + 'Cannot add a CMS server without a name or connection'); + let connection = { + serverName: server.serverName, + userName: server.userName, + password: server.password, + authenticationType: server.authenticationTypeName, + database: server.database, + provider: server.provider, + version: server.version, + engineType: server.engineType, + options: {} + }; + + // Should create a CMS Server without an error + await cmsService.createCmsServer(TEST_CMS_NAME, 'test_description', connection, ownerUri); + }); + + test('Add and delete registered group to/from CMS server', async function () { + await utils.assertThrowsAsync( + async () => await cmsService.addServerGroup(ownerUri, '', undefined, 'test_description'), + 'Cannot add a server group without a name'); + + // Should create a server group + let result = await cmsService.addServerGroup(ownerUri, '', TEST_CMS_GROUP, 'test_description'); + assert(result === true, `Server group ${TEST_CMS_GROUP} was not added to CMS server successfully`); + + let existingRegisteredServerGroupCount = (await cmsService.getRegisteredServers(ownerUri, '')).registeredServerGroups.length; + + // Shouldn't be able to create a new server group with same name + await utils.assertThrowsAsync( + async () => await cmsService.addServerGroup(ownerUri, '', TEST_CMS_GROUP, 'test_description'), + 'Cannot add a server group with existing name'); + + let cmsResources = await cmsService.getRegisteredServers(ownerUri, ''); + assert(cmsResources.registeredServerGroups.length === existingRegisteredServerGroupCount, + `Unexpected number of Registered Server Groups after attempting to add group that already exists. Groups : [${cmsResources.registeredServerGroups.map(g => g.name).join(', ')}]`); + + // Should remove the server group we added above + let deleteResult = await cmsService.removeServerGroup(ownerUri, '', TEST_CMS_GROUP); + assert(deleteResult === true, `Server group ${TEST_CMS_GROUP} was not removed successfully`); + + cmsResources = await cmsService.getRegisteredServers(ownerUri, ''); + assert(cmsResources.registeredServerGroups.find(g => g.name === TEST_CMS_GROUP) === undefined, + `The server group ${TEST_CMS_GROUP} was not removed successfully. Groups : [${cmsResources.registeredServerGroups.map(g => g.name).join(', ')}]`); + }); + + test('Add and delete registered server to/from CMS server', async function () { + + await utils.assertThrowsAsync( + async () => cmsService.addRegisteredServer(ownerUri, '', undefined, 'test_description', undefined), + 'Cannot add a registered without a name or connection'); + + let server = await getStandaloneServer('2019'); + let connection = { + serverName: server.serverName, + userName: server.userName, + password: server.password, + authenticationType: server.authenticationTypeName, + database: server.database, + provider: server.provider, + version: server.version, + engineType: server.engineType, + options: {} + }; + + // Should create a registered server + let result = await cmsService.addRegisteredServer(ownerUri, '', TEST_CMS_SERVER, 'test_description', connection); + assert(result === true, `Registered server ${TEST_CMS_SERVER} was not added to CMS server successfully`); + + // Shouldn't be able to create a new registered server with same name + await utils.assertThrowsAsync( + async () => await cmsService.addRegisteredServer(ownerUri, '', TEST_CMS_SERVER, 'test_description', connection), + 'Cannot add a registered server with existing name'); + + // Should remove the registered server we added above + let deleteResult = await cmsService.removeRegisteredServer(ownerUri, '', TEST_CMS_SERVER); + assert(deleteResult === true, `Registered server ${TEST_CMS_SERVER} was not removed correctly`); + }); + + test('Add and delete registered server to/from server group', async function () { + + // Should create a server group + let result = await cmsService.addServerGroup(ownerUri, '', TEST_CMS_GROUP, 'test_description'); + assert(result === true, `Server group ${TEST_CMS_GROUP} was not created successfully`); + + // Make sure server group is created + let cmsResources = await cmsService.getRegisteredServers(ownerUri, ''); + assert(cmsResources.registeredServerGroups.find(g => g.name === TEST_CMS_GROUP), + `Registered Server Group ${TEST_CMS_GROUP} was not found after being added. Groups : [${cmsResources.registeredServerGroups.map(g => g.name).join(', ')}]`); + + // Should create a registered server under the group + let server = await getStandaloneServer('2019'); + let connection = { + serverName: server.serverName, + userName: server.userName, + password: server.password, + authenticationType: server.authenticationTypeName, + database: server.database, + provider: server.provider, + version: server.version, + engineType: server.engineType, + options: {} + }; + let relativePath = cmsResources.registeredServerGroups[0].relativePath; + + result = await cmsService.addRegisteredServer(ownerUri, relativePath, TEST_CMS_REG_SERVER, 'test_description', connection); + assert(result === true, `Registered server ${TEST_CMS_REG_SERVER} was not added to server group successfully`); + + // Should remove the server group we added above + let deleteResult = await cmsService.removeServerGroup(ownerUri, '', TEST_CMS_GROUP); + assert(deleteResult === true, `Server group ${TEST_CMS_GROUP} was not deleted from CMS server successfully`); + }); +}); diff --git a/extensions/integration-tests/src/tests/dacpac.test.ts b/extensions/integration-tests/src/tests/dacpac.test.ts index a541f83a52..b508909845 100644 --- a/extensions/integration-tests/src/tests/dacpac.test.ts +++ b/extensions/integration-tests/src/tests/dacpac.test.ts @@ -5,114 +5,111 @@ import 'mocha'; import * as azdata from 'azdata'; -import * as utils from '../utils'; +import * as utils from './utils'; import * as path from 'path'; import * as fs from 'fs'; import * as os from 'os'; import * as mssql from '../../../mssql'; import * as vscode from 'vscode'; -import { isTestSetupCompleted } from '../testContext'; -import { getStandaloneServer } from '../testConfig'; +import { getStandaloneServer } from './testConfig'; import * as assert from 'assert'; import { promisify } from 'util'; const retryCount = 24; // 2 minutes -const dacpac1: string = path.join(__dirname, '../testData/Database1.dacpac'); -if (isTestSetupCompleted()) { - suite('Dacpac integration test suite', () => { - suiteSetup(async function () { - await utils.sleep(5000); // To ensure the providers are registered. - console.log(`Start dacpac tests`); - }); - - test('Deploy and extract dacpac', async function () { - const server = await getStandaloneServer(); - await utils.connectToServer(server); - - const nodes = await azdata.objectexplorer.getActiveConnectionNodes(); - const index = nodes.findIndex(node => node.nodePath.includes(server.serverName)); - const ownerUri = await azdata.connection.getUriForConnection(nodes[index].connectionId); - const now = new Date(); - const databaseName = 'ADS_deployDacpac_' + now.getTime().toString(); - - try { - const dacfxService = ((await vscode.extensions.getExtension(mssql.extension.name).activate() as mssql.IExtension)).dacFx; - assert(dacfxService, 'DacFx Service Provider is not available'); - - // Deploy dacpac - const deployResult = await dacfxService.deployDacpac(dacpac1, databaseName, false, ownerUri, azdata.TaskExecutionMode.execute); - await utils.assertDatabaseCreationResult(databaseName, ownerUri, retryCount); - const dbConnectionId = await utils.connectToServer({ - serverName: server.serverName, - database: databaseName, - userName: server.userName, - password: server.password, - authenticationTypeName: server.authenticationTypeName, - providerName: server.providerName - }); - const dbConnectionOwnerUri = await azdata.connection.getUriForConnection(dbConnectionId); - await utils.assertTableCreationResult('dbo', 'Table1', dbConnectionOwnerUri, retryCount); - await utils.assertTableCreationResult('dbo', 'Table2', dbConnectionOwnerUri, retryCount); - assert(deployResult.success === true && deployResult.errorMessage === '', `Deploy dacpac should succeed Expected: there should be no error. Actual Error message: "${deployResult.errorMessage}"`); - - // Extract dacpac - const folderPath = path.join(os.tmpdir(), 'DacFxTest'); - if (!(await promisify(fs.exists)(folderPath))) { - await fs.promises.mkdir(folderPath); - } - const packageFilePath = path.join(folderPath, `${databaseName}.dacpac`); - const extractResult = await dacfxService.extractDacpac(databaseName, packageFilePath, databaseName, '1.0.0.0', ownerUri, azdata.TaskExecutionMode.execute); - await utils.assertFileGenerationResult(packageFilePath, retryCount); - - assert(extractResult.success === true && extractResult.errorMessage === '', `Extract dacpac should succeed. Expected: there should be no error. Actual Error message: "${extractResult.errorMessage}"`); - } finally { - await utils.deleteDB(server, databaseName, ownerUri); - } - }); - - const bacpac1: string = path.join(__dirname, '..', 'testData', 'Database1.bacpac'); - test('Import and export bacpac', async function () { - const server = await getStandaloneServer(); - await utils.connectToServer(server); - - const nodes = await azdata.objectexplorer.getActiveConnectionNodes(); - const index = nodes.findIndex(node => node.nodePath.includes(server.serverName)); - const ownerUri = await azdata.connection.getUriForConnection(nodes[index].connectionId); - const now = new Date(); - const databaseName = 'ADS_importBacpac_' + now.getTime().toString(); - - try { - let dacfxService = ((await vscode.extensions.getExtension(mssql.extension.name).activate() as mssql.IExtension)).dacFx; - assert(dacfxService, 'DacFx Service Provider is not available'); - - // Import bacpac - const importResult = await dacfxService.importBacpac(bacpac1, databaseName, ownerUri, azdata.TaskExecutionMode.execute); - await utils.assertDatabaseCreationResult(databaseName, ownerUri, retryCount); - const dbConnectionId = await utils.connectToServer({ - serverName: server.serverName, - database: databaseName, - userName: server.userName, - password: server.password, - authenticationTypeName: server.authenticationTypeName, - providerName: server.providerName - }); - const dbConnectionOwnerUri = await azdata.connection.getUriForConnection(dbConnectionId); - await utils.assertTableCreationResult('dbo', 'Table1', dbConnectionOwnerUri, retryCount, true); - await utils.assertTableCreationResult('dbo', 'Table2', dbConnectionOwnerUri, retryCount, true); - assert(importResult.success === true && importResult.errorMessage === '', `Expected: Import bacpac should succeed and there should be no error. Actual Error message: "${importResult.errorMessage}"`); - - // Export bacpac - const folderPath = path.join(os.tmpdir(), 'DacFxTest'); - if (!(await promisify(fs.exists)(folderPath))) { - await fs.promises.mkdir(folderPath); - } - const packageFilePath = path.join(folderPath, `${databaseName}.bacpac`); - const exportResult = await dacfxService.exportBacpac(databaseName, packageFilePath, ownerUri, azdata.TaskExecutionMode.execute); - await utils.assertFileGenerationResult(packageFilePath, retryCount); - assert(exportResult.success === true && exportResult.errorMessage === '', `Expected: Export bacpac should succeed and there should be no error. Actual Error message: "${exportResult.errorMessage}"`); - } finally { - await utils.deleteDB(server, databaseName, ownerUri); - } - }); +const dacpac1: string = path.join(__dirname, '../../testData/Database1.dacpac'); +suite('Dacpac integration test suite', () => { + suiteSetup(async function () { + await utils.sleep(5000); // To ensure the providers are registered. + console.log(`Start dacpac tests`); }); -} + + test('Deploy and extract dacpac', async function () { + const server = await getStandaloneServer(); + await utils.connectToServer(server); + + const nodes = await azdata.objectexplorer.getActiveConnectionNodes(); + const index = nodes.findIndex(node => node.nodePath.includes(server.serverName)); + const ownerUri = await azdata.connection.getUriForConnection(nodes[index].connectionId); + const now = new Date(); + const databaseName = 'ADS_deployDacpac_' + now.getTime().toString(); + + try { + const dacfxService = ((await vscode.extensions.getExtension(mssql.extension.name).activate() as mssql.IExtension)).dacFx; + assert(dacfxService, 'DacFx Service Provider is not available'); + + // Deploy dacpac + const deployResult = await dacfxService.deployDacpac(dacpac1, databaseName, false, ownerUri, azdata.TaskExecutionMode.execute); + await utils.assertDatabaseCreationResult(databaseName, ownerUri, retryCount); + const dbConnectionId = await utils.connectToServer({ + serverName: server.serverName, + database: databaseName, + userName: server.userName, + password: server.password, + authenticationTypeName: server.authenticationTypeName, + providerName: server.providerName + }); + const dbConnectionOwnerUri = await azdata.connection.getUriForConnection(dbConnectionId); + await utils.assertTableCreationResult('dbo', 'Table1', dbConnectionOwnerUri, retryCount); + await utils.assertTableCreationResult('dbo', 'Table2', dbConnectionOwnerUri, retryCount); + assert(deployResult.success === true && deployResult.errorMessage === '', `Deploy dacpac should succeed Expected: there should be no error. Actual Error message: "${deployResult.errorMessage}"`); + + // Extract dacpac + const folderPath = path.join(os.tmpdir(), 'DacFxTest'); + if (!(await promisify(fs.exists)(folderPath))) { + await fs.promises.mkdir(folderPath); + } + const packageFilePath = path.join(folderPath, `${databaseName}.dacpac`); + const extractResult = await dacfxService.extractDacpac(databaseName, packageFilePath, databaseName, '1.0.0.0', ownerUri, azdata.TaskExecutionMode.execute); + await utils.assertFileGenerationResult(packageFilePath, retryCount); + + assert(extractResult.success === true && extractResult.errorMessage === '', `Extract dacpac should succeed. Expected: there should be no error. Actual Error message: "${extractResult.errorMessage}"`); + } finally { + await utils.deleteDB(server, databaseName, ownerUri); + } + }); + + const bacpac1: string = path.join(__dirname, '..', '..', 'testData', 'Database1.bacpac'); + test('Import and export bacpac', async function () { + const server = await getStandaloneServer(); + await utils.connectToServer(server); + + const nodes = await azdata.objectexplorer.getActiveConnectionNodes(); + const index = nodes.findIndex(node => node.nodePath.includes(server.serverName)); + const ownerUri = await azdata.connection.getUriForConnection(nodes[index].connectionId); + const now = new Date(); + const databaseName = 'ADS_importBacpac_' + now.getTime().toString(); + + try { + let dacfxService = ((await vscode.extensions.getExtension(mssql.extension.name).activate() as mssql.IExtension)).dacFx; + assert(dacfxService, 'DacFx Service Provider is not available'); + + // Import bacpac + const importResult = await dacfxService.importBacpac(bacpac1, databaseName, ownerUri, azdata.TaskExecutionMode.execute); + await utils.assertDatabaseCreationResult(databaseName, ownerUri, retryCount); + const dbConnectionId = await utils.connectToServer({ + serverName: server.serverName, + database: databaseName, + userName: server.userName, + password: server.password, + authenticationTypeName: server.authenticationTypeName, + providerName: server.providerName + }); + const dbConnectionOwnerUri = await azdata.connection.getUriForConnection(dbConnectionId); + await utils.assertTableCreationResult('dbo', 'Table1', dbConnectionOwnerUri, retryCount, true); + await utils.assertTableCreationResult('dbo', 'Table2', dbConnectionOwnerUri, retryCount, true); + assert(importResult.success === true && importResult.errorMessage === '', `Expected: Import bacpac should succeed and there should be no error. Actual Error message: "${importResult.errorMessage}"`); + + // Export bacpac + const folderPath = path.join(os.tmpdir(), 'DacFxTest'); + if (!(await promisify(fs.exists)(folderPath))) { + await fs.promises.mkdir(folderPath); + } + const packageFilePath = path.join(folderPath, `${databaseName}.bacpac`); + const exportResult = await dacfxService.exportBacpac(databaseName, packageFilePath, ownerUri, azdata.TaskExecutionMode.execute); + await utils.assertFileGenerationResult(packageFilePath, retryCount); + assert(exportResult.success === true && exportResult.errorMessage === '', `Expected: Export bacpac should succeed and there should be no error. Actual Error message: "${exportResult.errorMessage}"`); + } finally { + await utils.deleteDB(server, databaseName, ownerUri); + } + }); +}); diff --git a/extensions/integration-tests/src/tests/notebook.test.ts b/extensions/integration-tests/src/tests/notebook.test.ts index 3fe406aa27..8a850893dc 100644 --- a/extensions/integration-tests/src/tests/notebook.test.ts +++ b/extensions/integration-tests/src/tests/notebook.test.ts @@ -7,102 +7,100 @@ import 'mocha'; import * as assert from 'assert'; import * as azdata from 'azdata'; import * as vscode from 'vscode'; -import { isTestSetupCompleted } from '../testContext'; -import { sqlNotebookContent, writeNotebookToFile, sqlKernelMetadata, getFileName, pySparkNotebookContent, pySparkKernelMetadata, pythonKernelMetadata, sqlNotebookMultipleCellsContent, notebookContentForCellLanguageTest, sqlKernelSpec, pythonKernelSpec, pySparkKernelSpec, CellTypes } from '../notebook.util'; -import { getConfigValue, EnvironmentVariable_PYTHON_PATH, TestServerProfile, getStandaloneServer } from '../testConfig'; -import { connectToServer, sleep, testServerProfileToIConnectionProfile } from '../utils'; +import { sqlNotebookContent, writeNotebookToFile, sqlKernelMetadata, getFileName, pySparkNotebookContent, pySparkKernelMetadata, pythonKernelMetadata, sqlNotebookMultipleCellsContent, notebookContentForCellLanguageTest, sqlKernelSpec, pythonKernelSpec, pySparkKernelSpec, CellTypes } from './notebook.util'; +import { getConfigValue, EnvironmentVariable_PYTHON_PATH, TestServerProfile, getStandaloneServer } from './testConfig'; +import { connectToServer, sleep, testServerProfileToIConnectionProfile } from './utils'; import * as fs from 'fs'; import { stressify } from 'adstest'; import { isNullOrUndefined, promisify } from 'util'; -if (isTestSetupCompleted()) { - suite('Notebook integration test suite', function () { - setup(async function () { - console.log(`Start "${this.currentTest.title}"`); - let server = await getStandaloneServer(); - assert(server && server.serverName, 'No server could be found'); - await connectToServer(server, 6000); - }); - teardown(async function () { - await (new NotebookTester()).cleanup(this.currentTest.title); - }); - - test('Sql NB test @UNSTABLE@', async function () { - await (new NotebookTester()).sqlNbTest(this.test.title); - }); - - test('Sql NB multiple cells test @UNSTABLE@', async function () { - await (new NotebookTester()).sqlNbMultipleCellsTest(this.test.title); - }); - - test('Sql NB run cells above and below test', async function () { - await (new NotebookTester()).sqlNbRunCellsAboveBelowTest(this.test.title); - }); - - test('Clear cell output - SQL notebook', async function () { - await (new NotebookTester()).sqlNbClearOutputs(this.test.title); - }); - - test('Clear all outputs - SQL notebook ', async function () { - await (new NotebookTester()).sqlNbClearAllOutputs(this.test.title); - }); - - test('sql language test', async function () { - await (new NotebookTester()).sqlLanguageTest(this.test.title); - }); - - // TODO: Need to make this test more reliable. - test('should not be dirty after saving notebook test @UNSTABLE@', async function () { - await (new NotebookTester().shouldNotBeDirtyAfterSavingNotebookTest(this.test.title)); - }); - - if (process.env['RUN_PYTHON3_TEST'] === '1') { - test('Python3 notebook test', async function () { - await (new NotebookTester()).python3NbTest(this.test.title); - }); - - test('Clear all outputs - Python3 notebook ', async function () { - await (new NotebookTester()).python3ClearAllOutputs(this.test.title); - }); - - test('python language test', async function () { - await (new NotebookTester()).pythonLanguageTest(this.test.title); - }); - - test('Change kernel different provider SQL to Python to SQL', async function () { - await (new NotebookTester()).sqlNbChangeKernelDifferentProviderTest(this.test.title); - }); - - test('Change kernel different provider Python to SQL to Python', async function () { - await (new NotebookTester()).pythonChangeKernelDifferentProviderTest(this.test.title); - }); - - test('Change kernel same provider Python to PySpark to Python', async function () { - await (new NotebookTester()).pythonChangeKernelSameProviderTest(this.test.title); - }); - } - - if (process.env['RUN_PYSPARK_TEST'] === '1') { - test('PySpark notebook test', async function () { - await (new NotebookTester()).pySparkNbTest(this.test.title); - }); - } - - /* After https://github.com/microsoft/azuredatastudio/issues/5598 is fixed, enable these tests. - test('scala language test', async function () { - await (new NotebookTester()).scalaLanguageTest(this.test.title); - }); - - test('empty language test', async function () { - await (new NotebookTester()).emptyLanguageTest(this.test.title); - }); - - test('cplusplus language test', async function () { - await (new NotebookTester()).cplusplusLanguageTest(this.test.title); - }); - */ +suite('Notebook integration test suite', function () { + setup(async function () { + console.log(`Start "${this.currentTest.title}"`); + let server = await getStandaloneServer(); + assert(server && server.serverName, 'No server could be found'); + await connectToServer(server, 6000); }); -} + + teardown(async function () { + await (new NotebookTester()).cleanup(this.currentTest.title); + }); + + test('Sql NB test @UNSTABLE@', async function () { + await (new NotebookTester()).sqlNbTest(this.test.title); + }); + + test('Sql NB multiple cells test @UNSTABLE@', async function () { + await (new NotebookTester()).sqlNbMultipleCellsTest(this.test.title); + }); + + test('Sql NB run cells above and below test', async function () { + await (new NotebookTester()).sqlNbRunCellsAboveBelowTest(this.test.title); + }); + + test('Clear cell output - SQL notebook', async function () { + await (new NotebookTester()).sqlNbClearOutputs(this.test.title); + }); + + test('Clear all outputs - SQL notebook ', async function () { + await (new NotebookTester()).sqlNbClearAllOutputs(this.test.title); + }); + + test('sql language test', async function () { + await (new NotebookTester()).sqlLanguageTest(this.test.title); + }); + + // TODO: Need to make this test more reliable. + test('should not be dirty after saving notebook test @UNSTABLE@', async function () { + await (new NotebookTester().shouldNotBeDirtyAfterSavingNotebookTest(this.test.title)); + }); + + if (process.env['RUN_PYTHON3_TEST'] === '1') { + test('Python3 notebook test', async function () { + await (new NotebookTester()).python3NbTest(this.test.title); + }); + + test('Clear all outputs - Python3 notebook ', async function () { + await (new NotebookTester()).python3ClearAllOutputs(this.test.title); + }); + + test('python language test', async function () { + await (new NotebookTester()).pythonLanguageTest(this.test.title); + }); + + test('Change kernel different provider SQL to Python to SQL', async function () { + await (new NotebookTester()).sqlNbChangeKernelDifferentProviderTest(this.test.title); + }); + + test('Change kernel different provider Python to SQL to Python', async function () { + await (new NotebookTester()).pythonChangeKernelDifferentProviderTest(this.test.title); + }); + + test('Change kernel same provider Python to PySpark to Python', async function () { + await (new NotebookTester()).pythonChangeKernelSameProviderTest(this.test.title); + }); + } + + if (process.env['RUN_PYSPARK_TEST'] === '1') { + test('PySpark notebook test', async function () { + await (new NotebookTester()).pySparkNbTest(this.test.title); + }); + } + + /* After https://github.com/microsoft/azuredatastudio/issues/5598 is fixed, enable these tests. + test('scala language test', async function () { + await (new NotebookTester()).scalaLanguageTest(this.test.title); + }); + + test('empty language test', async function () { + await (new NotebookTester()).emptyLanguageTest(this.test.title); + }); + + test('cplusplus language test', async function () { + await (new NotebookTester()).cplusplusLanguageTest(this.test.title); + }); + */ +}); class NotebookTester { private static ParallelCount = 1; diff --git a/extensions/integration-tests/src/notebook.util.ts b/extensions/integration-tests/src/tests/notebook.util.ts similarity index 100% rename from extensions/integration-tests/src/notebook.util.ts rename to extensions/integration-tests/src/tests/notebook.util.ts diff --git a/extensions/integration-tests/src/tests/objectExplorer.test.ts b/extensions/integration-tests/src/tests/objectExplorer.test.ts index 309e5a1d80..6d4a549651 100644 --- a/extensions/integration-tests/src/tests/objectExplorer.test.ts +++ b/extensions/integration-tests/src/tests/objectExplorer.test.ts @@ -5,34 +5,31 @@ import 'mocha'; import * as azdata from 'azdata'; -import { isTestSetupCompleted } from '../testContext'; -import { getBdcServer, TestServerProfile, getAzureServer, getStandaloneServer } from '../testConfig'; -import { connectToServer, createDB, deleteDB, DefaultConnectTimeoutInMs, asyncTimeout } from '../utils'; +import { getBdcServer, TestServerProfile, getAzureServer, getStandaloneServer } from './testConfig'; +import { connectToServer, createDB, deleteDB, DefaultConnectTimeoutInMs, asyncTimeout } from './utils'; import * as assert from 'assert'; import { stressify } from 'adstest'; -if (isTestSetupCompleted()) { - suite('Object Explorer integration suite', () => { - test.skip('BDC instance node label test', async function () { - return await (new ObjectExplorerTester()).bdcNodeLabelTest(); - }); - test('Standalone instance node label test', async function () { - return await (new ObjectExplorerTester()).standaloneNodeLabelTest(); - }); - test('Azure SQL DB instance node label test @UNSTABLE@', async function () { - return await (new ObjectExplorerTester()).sqlDbNodeLabelTest(); - }); - test.skip('BDC instance context menu test', async function () { - return await (new ObjectExplorerTester()).bdcContextMenuTest(); - }); - test('Azure SQL DB context menu test @UNSTABLE@', async function () { - return await (new ObjectExplorerTester()).sqlDbContextMenuTest(); - }); - test('Standalone database context menu test', async function () { - return await (new ObjectExplorerTester()).standaloneContextMenuTest(); - }); +suite('Object Explorer integration suite', () => { + test.skip('BDC instance node label test', async function () { + return await (new ObjectExplorerTester()).bdcNodeLabelTest(); }); -} + test('Standalone instance node label test', async function () { + return await (new ObjectExplorerTester()).standaloneNodeLabelTest(); + }); + test('Azure SQL DB instance node label test @UNSTABLE@', async function () { + return await (new ObjectExplorerTester()).sqlDbNodeLabelTest(); + }); + test.skip('BDC instance context menu test', async function () { + return await (new ObjectExplorerTester()).bdcContextMenuTest(); + }); + test('Azure SQL DB context menu test @UNSTABLE@', async function () { + return await (new ObjectExplorerTester()).sqlDbContextMenuTest(); + }); + test('Standalone database context menu test', async function () { + return await (new ObjectExplorerTester()).standaloneContextMenuTest(); + }); +}); class ObjectExplorerTester { private static ParallelCount = 1; diff --git a/extensions/integration-tests/src/tests/schemaCompare.test.ts b/extensions/integration-tests/src/tests/schemaCompare.test.ts index 79ca3788ae..95d983df57 100644 --- a/extensions/integration-tests/src/tests/schemaCompare.test.ts +++ b/extensions/integration-tests/src/tests/schemaCompare.test.ts @@ -6,58 +6,55 @@ import 'mocha'; import * as azdata from 'azdata'; import * as vscode from 'vscode'; -import * as utils from '../utils'; +import * as utils from './utils'; import * as mssql from '../../../mssql'; import * as os from 'os'; import * as fs from 'fs'; const path = require('path'); -import { isTestSetupCompleted } from '../testContext'; import * as assert from 'assert'; -import { getStandaloneServer } from '../testConfig'; +import { getStandaloneServer } from './testConfig'; import { stressify } from 'adstest'; import { promisify } from 'util'; let schemaCompareService: mssql.ISchemaCompareService; let dacfxService: mssql.IDacFxService; let schemaCompareTester: SchemaCompareTester; -const dacpac1: string = path.join(__dirname, '..','testData', 'Database1.dacpac'); -const dacpac2: string = path.join(__dirname, '..', 'testData', 'Database2.dacpac'); -const includeExcludeSourceDacpac: string = path.join(__dirname, '..', 'testData', 'SchemaCompareIncludeExcludeSource.dacpac'); -const includeExcludeTargetDacpac: string = path.join(__dirname, '..', 'testData', 'SchemaCompareIncludeExcludeTarget.dacpac'); +const dacpac1: string = path.join(__dirname, '..', '..', 'testData', 'Database1.dacpac'); +const dacpac2: string = path.join(__dirname, '..', '..', 'testData', 'Database2.dacpac'); +const includeExcludeSourceDacpac: string = path.join(__dirname, '..', '..', 'testData', 'SchemaCompareIncludeExcludeSource.dacpac'); +const includeExcludeTargetDacpac: string = path.join(__dirname, '..', '..', 'testData', 'SchemaCompareIncludeExcludeTarget.dacpac'); const SERVER_CONNECTION_TIMEOUT: number = 3000; const retryCount = 24; // 2 minutes const folderPath = path.join(os.tmpdir(), 'SchemaCompareTest'); -if (isTestSetupCompleted()) { - suite('Schema compare integration test suite', () => { - suiteSetup(async function () { - let attempts: number = 20; - while (attempts > 0) { - schemaCompareService = ((await vscode.extensions.getExtension(mssql.extension.name).activate() as mssql.IExtension)).schemaCompare; - if (schemaCompareService) { - break; - } - attempts--; - await utils.sleep(1000); // To ensure the providers are registered. +suite('Schema compare integration test suite', () => { + suiteSetup(async function () { + let attempts: number = 20; + while (attempts > 0) { + schemaCompareService = ((await vscode.extensions.getExtension(mssql.extension.name).activate() as mssql.IExtension)).schemaCompare; + if (schemaCompareService) { + break; } - dacfxService = ((await vscode.extensions.getExtension(mssql.extension.name).activate() as mssql.IExtension)).dacFx; - schemaCompareTester = new SchemaCompareTester(); - console.log(`Start schema compare tests`); - }); - test('Schema compare dacpac to dacpac comparison and scmp', async function () { - await schemaCompareTester.SchemaCompareDacpacToDacpac(); - }); - test('Schema compare database to database comparison, script generation, and scmp', async function () { - await schemaCompareTester.SchemaCompareDatabaseToDatabase(); - }); - test('Schema compare dacpac to database comparison, script generation, and scmp', async function () { - await schemaCompareTester.SchemaCompareDacpacToDatabase(); - }); - test('Schema compare dacpac to dacpac comparison with include exclude', async function () { - await schemaCompareTester.SchemaCompareIncludeExcludeDacpacToDacpac(); - }); + attempts--; + await utils.sleep(1000); // To ensure the providers are registered. + } + dacfxService = ((await vscode.extensions.getExtension(mssql.extension.name).activate() as mssql.IExtension)).dacFx; + schemaCompareTester = new SchemaCompareTester(); + console.log(`Start schema compare tests`); }); -} + test('Schema compare dacpac to dacpac comparison and scmp', async function () { + await schemaCompareTester.SchemaCompareDacpacToDacpac(); + }); + test('Schema compare database to database comparison, script generation, and scmp', async function () { + await schemaCompareTester.SchemaCompareDatabaseToDatabase(); + }); + test('Schema compare dacpac to database comparison, script generation, and scmp', async function () { + await schemaCompareTester.SchemaCompareDacpacToDatabase(); + }); + test('Schema compare dacpac to dacpac comparison with include exclude', async function () { + await schemaCompareTester.SchemaCompareIncludeExcludeDacpacToDacpac(); + }); +}); class SchemaCompareTester { private static ParallelCount = 1; diff --git a/extensions/integration-tests/src/testConfig.ts b/extensions/integration-tests/src/tests/testConfig.ts similarity index 100% rename from extensions/integration-tests/src/testConfig.ts rename to extensions/integration-tests/src/tests/testConfig.ts diff --git a/extensions/integration-tests/src/utils.ts b/extensions/integration-tests/src/tests/utils.ts similarity index 100% rename from extensions/integration-tests/src/utils.ts rename to extensions/integration-tests/src/tests/utils.ts diff --git a/extensions/integration-tests/src/uuid.ts b/extensions/integration-tests/src/tests/uuid.ts similarity index 100% rename from extensions/integration-tests/src/uuid.ts rename to extensions/integration-tests/src/tests/uuid.ts