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')); + }); });