diff --git a/extensions/sql-database-projects/src/test/project.test.ts b/extensions/sql-database-projects/src/test/project.test.ts
index 492a62dfc5..eec2709422 100644
--- a/extensions/sql-database-projects/src/test/project.test.ts
+++ b/extensions/sql-database-projects/src/test/project.test.ts
@@ -15,6 +15,7 @@ import { promises as fs } from 'fs';
import { Project, EntryType, SystemDatabase, SystemDatabaseReferenceProjectEntry, SqlProjectReferenceProjectEntry } from '../models/project';
import { exists, convertSlashesForSqlProj } from '../common/utils';
import { Uri, window } from 'vscode';
+import { IDacpacReferenceSettings, IProjectReferenceSettings, ISystemDatabaseReferenceSettings } from '../models/IDatabaseReferenceSettings';
let projFilePath: string;
@@ -369,26 +370,79 @@ describe('Project: sqlproj content operations', function (): void {
should(projFileText).containEql('otherServerName');
});
- it('Should not allow adding duplicate database references', async function (): Promise {
+ it('Should not allow adding duplicate dacpac references', async function (): Promise {
projFilePath = await testUtils.createTestSqlProjFile(baselines.newProjectFileBaseline);
const project = await Project.openProject(projFilePath);
should(project.databaseReferences.length).equal(0, 'There should be no database references to start with');
- await project.addSystemDatabaseReference({ databaseName: 'master', systemDb: SystemDatabase.master, suppressMissingDependenciesErrors: false });
+
+ const dacpacReference: IDacpacReferenceSettings = { dacpacFileLocation: Uri.file('test.dacpac'), suppressMissingDependenciesErrors: false };
+ await project.addDatabaseReference(dacpacReference);
+ should(project.databaseReferences.length).equal(1, 'There should be one database reference after adding a reference to test.dacpac');
+ should(project.databaseReferences[0].databaseName).equal('test', 'project.databaseReferences[0].databaseName should be test');
+
+ // try to add reference to test.dacpac again
+ await testUtils.shouldThrowSpecificError(async () => await project.addDatabaseReference(dacpacReference), constants.databaseReferenceAlreadyExists);
+ should(project.databaseReferences.length).equal(1, 'There should be one database reference after trying to add a reference to test.dacpac again');
+ });
+
+ it('Should not allow adding duplicate system database references', async function (): Promise {
+ projFilePath = await testUtils.createTestSqlProjFile(baselines.newProjectFileBaseline);
+ const project = await Project.openProject(projFilePath);
+
+ should(project.databaseReferences.length).equal(0, 'There should be no database references to start with');
+
+ const systemDbReference: ISystemDatabaseReferenceSettings = { databaseName: 'master', systemDb: SystemDatabase.master, suppressMissingDependenciesErrors: false };
+ await project.addSystemDatabaseReference(systemDbReference);
should(project.databaseReferences.length).equal(1, 'There should be one database reference after adding a reference to master');
should(project.databaseReferences[0].databaseName).equal(constants.master, 'project.databaseReferences[0].databaseName should be master');
// try to add reference to master again
- await testUtils.shouldThrowSpecificError(async () => await project.addSystemDatabaseReference({ databaseName: 'master', systemDb: SystemDatabase.master, suppressMissingDependenciesErrors: false }), constants.databaseReferenceAlreadyExists);
+ await testUtils.shouldThrowSpecificError(async () => await project.addSystemDatabaseReference(systemDbReference), constants.databaseReferenceAlreadyExists);
should(project.databaseReferences.length).equal(1, 'There should only be one database reference after trying to add a reference to master again');
+ });
- await project.addDatabaseReference({ dacpacFileLocation: Uri.file('test.dacpac'), suppressMissingDependenciesErrors: false });
- should(project.databaseReferences.length).equal(2, 'There should be two database references after adding a reference to test.dacpac');
- should(project.databaseReferences[1].databaseName).equal('test', 'project.databaseReferences[1].databaseName should be test');
+ it('Should not allow adding duplicate project references', async function (): Promise {
+ projFilePath = await testUtils.createTestSqlProjFile(baselines.newProjectFileBaseline);
+ const project = await Project.openProject(projFilePath);
- // try to add reference to test.dacpac again
- await testUtils.shouldThrowSpecificError(async () => await project.addDatabaseReference({ dacpacFileLocation: Uri.file('test.dacpac'), suppressMissingDependenciesErrors: false }), constants.databaseReferenceAlreadyExists);
- should(project.databaseReferences.length).equal(2, 'There should be two database references after trying to add a reference to test.dacpac again');
+ should(project.databaseReferences.length).equal(0, 'There should be no database references to start with');
+
+ const projectReference: IProjectReferenceSettings = {
+ projectName: 'testProject',
+ projectGuid: '',
+ projectRelativePath: Uri.file('testProject.sqlproj'),
+ suppressMissingDependenciesErrors: false
+ };
+ await project.addProjectReference(projectReference);
+ should(project.databaseReferences.length).equal(1, 'There should be one database reference after adding a reference to testProject.sqlproj');
+ should(project.databaseReferences[0].databaseName).equal('testProject', 'project.databaseReferences[0].databaseName should be testProject');
+
+ // try to add reference to testProject again
+ await testUtils.shouldThrowSpecificError(async () => await project.addProjectReference(projectReference), constants.databaseReferenceAlreadyExists);
+ should(project.databaseReferences.length).equal(1, 'There should be one database reference after trying to add a reference to testProject again');
+ });
+
+ it('Should handle trying to add duplicate database references when slashes are different direction', async function (): Promise {
+ projFilePath = await testUtils.createTestSqlProjFile(baselines.newProjectFileBaseline);
+ const project = await Project.openProject(projFilePath);
+
+ should(project.databaseReferences.length).equal(0, 'There should be no database references to start with');
+
+ const projectReference: IProjectReferenceSettings = {
+ projectName: 'testProject',
+ projectGuid: '',
+ projectRelativePath: Uri.file('testFolder/testProject.sqlproj'),
+ suppressMissingDependenciesErrors: false
+ };
+ await project.addProjectReference(projectReference);
+ should(project.databaseReferences.length).equal(1, 'There should be one database reference after adding a reference to testProject.sqlproj');
+ should(project.databaseReferences[0].databaseName).equal('testProject', 'project.databaseReferences[0].databaseName should be testProject');
+
+ // try to add reference to testProject again with slashes in the other direction
+ projectReference.projectRelativePath = Uri.file('testFolder\\testProject.sqlproj');
+ await testUtils.shouldThrowSpecificError(async () => await project.addProjectReference(projectReference), constants.databaseReferenceAlreadyExists);
+ should(project.databaseReferences.length).equal(1, 'There should be one database reference after trying to add a reference to testProject again');
});
it('Should update sqlcmd variable values if value changes', async function (): Promise {