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 {