From d658af153d73143ede276e4ce854d98ed756602f Mon Sep 17 00:00:00 2001 From: Kim Santiago <31145923+kisantia@users.noreply.github.com> Date: Fri, 19 Mar 2021 13:17:51 -0700 Subject: [PATCH] fix publish profile with connection string ending in semicolon not loading (#14797) --- .../models/dataSources/sqlConnectionStringSource.ts | 3 ++- .../publishProfileSqlLoginBaseline.publish.xml | 3 +-- .../sql-database-projects/src/test/datasource.test.ts | 10 ++++++++-- 3 files changed, 11 insertions(+), 5 deletions(-) diff --git a/extensions/sql-database-projects/src/models/dataSources/sqlConnectionStringSource.ts b/extensions/sql-database-projects/src/models/dataSources/sqlConnectionStringSource.ts index 2c139266a3..3865c7ae14 100644 --- a/extensions/sql-database-projects/src/models/dataSources/sqlConnectionStringSource.ts +++ b/extensions/sql-database-projects/src/models/dataSources/sqlConnectionStringSource.ts @@ -67,7 +67,8 @@ export class SqlConnectionDataSource extends DataSource { // TODO: do we have a common construct for connection strings? this.connectionString = connectionString; - for (const component of this.connectionString.split(';')) { + const components = this.connectionString.split(';').filter(c => c !== ''); + for (const component of components) { const split = component.split('='); if (split.length !== 2) { diff --git a/extensions/sql-database-projects/src/test/baselines/publishProfileSqlLoginBaseline.publish.xml b/extensions/sql-database-projects/src/test/baselines/publishProfileSqlLoginBaseline.publish.xml index 480b980b97..8aeb0be40d 100644 --- a/extensions/sql-database-projects/src/test/baselines/publishProfileSqlLoginBaseline.publish.xml +++ b/extensions/sql-database-projects/src/test/baselines/publishProfileSqlLoginBaseline.publish.xml @@ -4,8 +4,7 @@ True targetDb DatabaseProject1.sql - - Data Source=testserver;User Id=testUser;Password=abcd123;Integrated Security=false;Persist Security Info=False;Pooling=False;MultipleActiveResultSets=False;Connect Timeout=60;Encrypt=False;TrustServerCertificate=True + Data Source=testserver;User Id=testUser;Password=PLACEHOLDER;Integrated Security=false;Persist Security Info=False;Pooling=False;MultipleActiveResultSets=False;Connect Timeout=60;Encrypt=False;TrustServerCertificate=True 1 diff --git a/extensions/sql-database-projects/src/test/datasource.test.ts b/extensions/sql-database-projects/src/test/datasource.test.ts index 8aac591ba4..d6ca7f30ad 100644 --- a/extensions/sql-database-projects/src/test/datasource.test.ts +++ b/extensions/sql-database-projects/src/test/datasource.test.ts @@ -9,12 +9,12 @@ import * as testUtils from './testUtils'; import * as sql from '../models/dataSources/sqlConnectionStringSource'; import * as dataSources from '../models/dataSources/dataSources'; -describe.skip('Data Sources: DataSource operations', function (): void { +describe('Data Sources: DataSource operations', function (): void { before(async function () : Promise { await baselines.loadBaselines(); }); - it('Should read DataSources from datasource.json', async function (): Promise { + it.skip('Should read DataSources from datasource.json', async function (): Promise { const dataSourcePath = await testUtils.createTestDataSources(baselines.openDataSourcesBaseline); const dataSourceList = await dataSources.load(dataSourcePath); @@ -31,4 +31,10 @@ describe.skip('Data Sources: DataSource operations', function (): void { should((dataSourceList[2] as sql.SqlConnectionDataSource).integratedSecurity).equal(false); should((dataSourceList[2] as sql.SqlConnectionDataSource).azureMFA).equal(true); }); + + it ('Should be able to create sql data source from connection strings with and without ending semicolon', function (): void { + should.doesNotThrow(() => new sql.SqlConnectionDataSource('no ending semicolon', 'Data Source=(LOCAL);Initial Catalog=testdb;User id=sa;Password=PLACEHOLDER')); + should.doesNotThrow(() => new sql.SqlConnectionDataSource('ending in semicolon', 'Data Source=(LOCAL);Initial Catalog=testdb;User id=sa;Password=PLACEHOLDER;')); + should.throws(() => new sql.SqlConnectionDataSource('invalid extra equals sign', 'Data Source=(LOCAL);Initial Catalog=testdb=extra;User id=sa;Password=PLACEHOLDER')); + }); });