From f7fd4788572bc2c457b80fa8ddcc8223e1bfdc0d Mon Sep 17 00:00:00 2001 From: Benjin Dubishar Date: Thu, 23 Feb 2023 16:25:01 -0800 Subject: [PATCH] Adding getters for project items in SqlProject service (#1879) * Adding getters for project items * updated comment --- .../GetDatabaseReferences.cs | 39 ++++++++ .../Contracts/Folders/GetFolders.cs | 28 ++++++ .../GetPostDeploymentScripts.cs | 16 +++ .../GetPreDeploymentScripts.cs | 16 +++ .../SqlCmdVariables/GetSqlCmdVariables.cs | 29 ++++++ .../SqlObjectScripts/GetSqlObjectScripts.cs | 28 ++++++ .../SqlProjects/SqlProjectsService.cs | 97 ++++++++++++++++++- .../SqlProjects/SqlProjectsServiceTests.cs | 97 ++++++++++++++++++- 8 files changed, 341 insertions(+), 9 deletions(-) create mode 100644 src/Microsoft.SqlTools.ServiceLayer/SqlProjects/Contracts/DatabaseReferences/GetDatabaseReferences.cs create mode 100644 src/Microsoft.SqlTools.ServiceLayer/SqlProjects/Contracts/Folders/GetFolders.cs create mode 100644 src/Microsoft.SqlTools.ServiceLayer/SqlProjects/Contracts/PrePostDeploymentScripts/GetPostDeploymentScripts.cs create mode 100644 src/Microsoft.SqlTools.ServiceLayer/SqlProjects/Contracts/PrePostDeploymentScripts/GetPreDeploymentScripts.cs create mode 100644 src/Microsoft.SqlTools.ServiceLayer/SqlProjects/Contracts/SqlCmdVariables/GetSqlCmdVariables.cs create mode 100644 src/Microsoft.SqlTools.ServiceLayer/SqlProjects/Contracts/SqlObjectScripts/GetSqlObjectScripts.cs diff --git a/src/Microsoft.SqlTools.ServiceLayer/SqlProjects/Contracts/DatabaseReferences/GetDatabaseReferences.cs b/src/Microsoft.SqlTools.ServiceLayer/SqlProjects/Contracts/DatabaseReferences/GetDatabaseReferences.cs new file mode 100644 index 00000000..09d1ac68 --- /dev/null +++ b/src/Microsoft.SqlTools.ServiceLayer/SqlProjects/Contracts/DatabaseReferences/GetDatabaseReferences.cs @@ -0,0 +1,39 @@ +// +// Copyright (c) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. +// + +#nullable disable + +using Microsoft.SqlServer.Dac.Projects; +using Microsoft.SqlTools.Hosting.Protocol.Contracts; +using Microsoft.SqlTools.ServiceLayer.Utility; + +namespace Microsoft.SqlTools.ServiceLayer.SqlProjects.Contracts +{ + public class GetDatabaseReferencesRequest + { + public static readonly RequestType Type = RequestType.Create("sqlProjects/getDatabaseReferences"); + } + + /// + /// Result containing database references in the project + /// + public class GetDatabaseReferencesResult : ResultStatus + { + /// + /// Array of system database references contained in the project + /// + public SystemDatabaseReference[] SystemDatabaseReferences { get; set; } + + /// + /// Array of dacpac references contained in the project + /// + public DacpacReference[] DacpacReferences { get; set; } + + /// + /// Array of SQL project references contained in the project + /// + public SqlProjectReference[] SqlProjectReferences { get; set; } + } +} diff --git a/src/Microsoft.SqlTools.ServiceLayer/SqlProjects/Contracts/Folders/GetFolders.cs b/src/Microsoft.SqlTools.ServiceLayer/SqlProjects/Contracts/Folders/GetFolders.cs new file mode 100644 index 00000000..12df1c57 --- /dev/null +++ b/src/Microsoft.SqlTools.ServiceLayer/SqlProjects/Contracts/Folders/GetFolders.cs @@ -0,0 +1,28 @@ +// +// Copyright (c) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. +// + +#nullable disable + +using Microsoft.SqlTools.Hosting.Protocol.Contracts; +using Microsoft.SqlTools.ServiceLayer.Utility; + +namespace Microsoft.SqlTools.ServiceLayer.SqlProjects.Contracts +{ + public class GetFoldersRequest + { + public static readonly RequestType Type = RequestType.Create("sqlProjects/getFolders"); + } + + /// + /// Result containing folders in the project + /// + public class GetFoldersResult : ResultStatus + { + /// + /// Array of folders contained in the project + /// + public string[] Folders { get; set; } + } +} diff --git a/src/Microsoft.SqlTools.ServiceLayer/SqlProjects/Contracts/PrePostDeploymentScripts/GetPostDeploymentScripts.cs b/src/Microsoft.SqlTools.ServiceLayer/SqlProjects/Contracts/PrePostDeploymentScripts/GetPostDeploymentScripts.cs new file mode 100644 index 00000000..f8c214f9 --- /dev/null +++ b/src/Microsoft.SqlTools.ServiceLayer/SqlProjects/Contracts/PrePostDeploymentScripts/GetPostDeploymentScripts.cs @@ -0,0 +1,16 @@ +// +// Copyright (c) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. +// + +#nullable disable + +using Microsoft.SqlTools.Hosting.Protocol.Contracts; + +namespace Microsoft.SqlTools.ServiceLayer.SqlProjects.Contracts +{ + public class GetPostDeploymentScriptsRequest + { + public static readonly RequestType Type = RequestType.Create("sqlProjects/getPostDeploymentScripts"); + } +} diff --git a/src/Microsoft.SqlTools.ServiceLayer/SqlProjects/Contracts/PrePostDeploymentScripts/GetPreDeploymentScripts.cs b/src/Microsoft.SqlTools.ServiceLayer/SqlProjects/Contracts/PrePostDeploymentScripts/GetPreDeploymentScripts.cs new file mode 100644 index 00000000..44b14529 --- /dev/null +++ b/src/Microsoft.SqlTools.ServiceLayer/SqlProjects/Contracts/PrePostDeploymentScripts/GetPreDeploymentScripts.cs @@ -0,0 +1,16 @@ +// +// Copyright (c) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. +// + +#nullable disable + +using Microsoft.SqlTools.Hosting.Protocol.Contracts; + +namespace Microsoft.SqlTools.ServiceLayer.SqlProjects.Contracts +{ + public class GetPreDeploymentScriptsRequest + { + public static readonly RequestType Type = RequestType.Create("sqlProjects/getPreDeploymentScripts"); + } +} diff --git a/src/Microsoft.SqlTools.ServiceLayer/SqlProjects/Contracts/SqlCmdVariables/GetSqlCmdVariables.cs b/src/Microsoft.SqlTools.ServiceLayer/SqlProjects/Contracts/SqlCmdVariables/GetSqlCmdVariables.cs new file mode 100644 index 00000000..1b5c554d --- /dev/null +++ b/src/Microsoft.SqlTools.ServiceLayer/SqlProjects/Contracts/SqlCmdVariables/GetSqlCmdVariables.cs @@ -0,0 +1,29 @@ +// +// Copyright (c) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. +// + +#nullable disable + +using Microsoft.SqlServer.Dac.Projects; +using Microsoft.SqlTools.Hosting.Protocol.Contracts; +using Microsoft.SqlTools.ServiceLayer.Utility; + +namespace Microsoft.SqlTools.ServiceLayer.SqlProjects.Contracts +{ + public class GetSqlCmdVariablesRequest + { + public static readonly RequestType Type = RequestType.Create("sqlProjects/getSqlCmdVariables"); + } + + /// + /// Result containing SQLCMD variables in the project + /// + public class GetSqlCmdVariablesResult : ResultStatus + { + /// + /// Array of SQLCMD variables contained in the project + /// + public SqlCmdVariable[] SqlCmdVariables { get; set; } + } +} diff --git a/src/Microsoft.SqlTools.ServiceLayer/SqlProjects/Contracts/SqlObjectScripts/GetSqlObjectScripts.cs b/src/Microsoft.SqlTools.ServiceLayer/SqlProjects/Contracts/SqlObjectScripts/GetSqlObjectScripts.cs new file mode 100644 index 00000000..71d1813a --- /dev/null +++ b/src/Microsoft.SqlTools.ServiceLayer/SqlProjects/Contracts/SqlObjectScripts/GetSqlObjectScripts.cs @@ -0,0 +1,28 @@ +// +// Copyright (c) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. +// + +#nullable disable + +using Microsoft.SqlTools.Hosting.Protocol.Contracts; +using Microsoft.SqlTools.ServiceLayer.Utility; + +namespace Microsoft.SqlTools.ServiceLayer.SqlProjects.Contracts +{ + public class GetSqlObjectScriptsRequest + { + public static readonly RequestType Type = RequestType.Create("sqlProjects/getSqlObjectScripts"); + } + + /// + /// Result containing scripts in the project + /// + public class GetScriptsResult : ResultStatus + { + /// + /// Array of scripts contained in the project + /// + public string[] Scripts { get; set; } + } +} diff --git a/src/Microsoft.SqlTools.ServiceLayer/SqlProjects/SqlProjectsService.cs b/src/Microsoft.SqlTools.ServiceLayer/SqlProjects/SqlProjectsService.cs index 70ad1f71..d706682f 100644 --- a/src/Microsoft.SqlTools.ServiceLayer/SqlProjects/SqlProjectsService.cs +++ b/src/Microsoft.SqlTools.ServiceLayer/SqlProjects/SqlProjectsService.cs @@ -5,6 +5,7 @@ using System; using System.Collections.Concurrent; +using System.Linq; using System.Threading.Tasks; using Microsoft.SqlServer.Dac.Projects; using Microsoft.SqlTools.Hosting.Protocol; @@ -47,32 +48,38 @@ namespace Microsoft.SqlTools.ServiceLayer.SqlProjects serviceHost.SetRequestHandler(UpdateProjectForCrossPlatformRequest.Type, HandleUpdateProjectForCrossPlatformRequest, isParallelProcessingSupported: false); // SQL object script functions + serviceHost.SetRequestHandler(GetSqlObjectScriptsRequest.Type, HandleGetSqlObjectScriptsRequest, isParallelProcessingSupported: true); serviceHost.SetRequestHandler(AddSqlObjectScriptRequest.Type, HandleAddSqlObjectScriptRequest, isParallelProcessingSupported: false); serviceHost.SetRequestHandler(DeleteSqlObjectScriptRequest.Type, HandleDeleteSqlObjectScriptRequest, isParallelProcessingSupported: false); serviceHost.SetRequestHandler(ExcludeSqlObjectScriptRequest.Type, HandleExcludeSqlObjectScriptRequest, isParallelProcessingSupported: false); serviceHost.SetRequestHandler(MoveSqlObjectScriptRequest.Type, HandleMoveSqlObjectScriptRequest, isParallelProcessingSupported: false); // Pre/Post-deployment script functions + serviceHost.SetRequestHandler(GetPreDeploymentScriptsRequest.Type, HandleGetPreDeploymentScriptsRequest, isParallelProcessingSupported: true); serviceHost.SetRequestHandler(AddPreDeploymentScriptRequest.Type, HandleAddPreDeploymentScriptRequest, isParallelProcessingSupported: false); serviceHost.SetRequestHandler(DeletePreDeploymentScriptRequest.Type, HandleDeletePreDeploymentScriptRequest, isParallelProcessingSupported: false); serviceHost.SetRequestHandler(ExcludePreDeploymentScriptRequest.Type, HandleExcludePreDeploymentScriptRequest, isParallelProcessingSupported: false); serviceHost.SetRequestHandler(MovePreDeploymentScriptRequest.Type, HandleMovePreDeploymentScriptRequest, isParallelProcessingSupported: false); + serviceHost.SetRequestHandler(GetPostDeploymentScriptsRequest.Type, HandleGetPostDeploymentScriptsRequest, isParallelProcessingSupported: true); serviceHost.SetRequestHandler(AddPostDeploymentScriptRequest.Type, HandleAddPostDeploymentScriptRequest, isParallelProcessingSupported: false); serviceHost.SetRequestHandler(DeletePostDeploymentScriptRequest.Type, HandleDeletePostDeploymentScriptRequest, isParallelProcessingSupported: false); serviceHost.SetRequestHandler(ExcludePostDeploymentScriptRequest.Type, HandleExcludePostDeploymentScriptRequest, isParallelProcessingSupported: false); serviceHost.SetRequestHandler(MovePostDeploymentScriptRequest.Type, HandleMovePostDeploymentScriptRequest, isParallelProcessingSupported: false); // Folder functions + serviceHost.SetRequestHandler(GetFoldersRequest.Type, HandleGetFoldersRequest, isParallelProcessingSupported: true); serviceHost.SetRequestHandler(AddFolderRequest.Type, HandleAddFolderRequest, isParallelProcessingSupported: false); serviceHost.SetRequestHandler(DeleteFolderRequest.Type, HandleDeleteFolderRequest, isParallelProcessingSupported: false); // SQLCMD variable functions + serviceHost.SetRequestHandler(GetSqlCmdVariablesRequest.Type, HandleGetSqlCmdVariablesRequest, isParallelProcessingSupported: true); serviceHost.SetRequestHandler(AddSqlCmdVariableRequest.Type, HandleAddSqlCmdVariableRequest, isParallelProcessingSupported: false); serviceHost.SetRequestHandler(DeleteSqlCmdVariableRequest.Type, HandleDeleteSqlCmdVariableRequest, isParallelProcessingSupported: false); serviceHost.SetRequestHandler(UpdateSqlCmdVariableRequest.Type, HandleUpdateSqlCmdVariableRequest, isParallelProcessingSupported: false); // Database reference functions + serviceHost.SetRequestHandler(GetDatabaseReferencesRequest.Type, HandleGetDatabaseReferencesRequest, isParallelProcessingSupported: true); serviceHost.SetRequestHandler(AddSystemDatabaseReferenceRequest.Type, HandleAddSystemDatabaseReferenceRequest, isParallelProcessingSupported: false); serviceHost.SetRequestHandler(AddDacpacReferenceRequest.Type, HandleAddDacpacReferenceRequest, isParallelProcessingSupported: false); serviceHost.SetRequestHandler(AddSqlProjectReferenceRequest.Type, HandleAddSqlProjectReferenceRequest, isParallelProcessingSupported: false); @@ -109,14 +116,14 @@ namespace Microsoft.SqlTools.ServiceLayer.SqlProjects { Success = true, ErrorMessage = null, - IsCrossPlatformCompatible = GetProject(requestParams.ProjectUri!).CrossPlatformCompatible + IsCrossPlatformCompatible = GetProject(requestParams.ProjectUri).CrossPlatformCompatible }; }, requestContext); } internal async Task HandleUpdateProjectForCrossPlatformRequest(SqlProjectParams requestParams, RequestContext requestContext) { - await RunWithErrorHandling(() => GetProject(requestParams.ProjectUri!).UpdateForCrossPlatform(), requestContext); + await RunWithErrorHandling(() => GetProject(requestParams.ProjectUri).UpdateForCrossPlatform(), requestContext); } #endregion @@ -125,19 +132,32 @@ namespace Microsoft.SqlTools.ServiceLayer.SqlProjects #region SQL object script functions + internal async Task HandleGetSqlObjectScriptsRequest(SqlProjectParams requestParams, RequestContext requestContext) + { + await RunWithErrorHandling(() => + { + return new GetScriptsResult() + { + Success = true, + ErrorMessage = null, + Scripts = GetProject(requestParams.ProjectUri).SqlObjectScripts.Select(x => x.Path).ToArray() + }; + }, requestContext); + } + internal async Task HandleAddSqlObjectScriptRequest(SqlProjectScriptParams requestParams, RequestContext requestContext) { - await RunWithErrorHandling(() => GetProject(requestParams.ProjectUri!).SqlObjectScripts.Add(new SqlObjectScript(requestParams.Path!)), requestContext); + await RunWithErrorHandling(() => GetProject(requestParams.ProjectUri).SqlObjectScripts.Add(new SqlObjectScript(requestParams.Path!)), requestContext); } internal async Task HandleDeleteSqlObjectScriptRequest(SqlProjectScriptParams requestParams, RequestContext requestContext) { - await RunWithErrorHandling(() => GetProject(requestParams.ProjectUri!).SqlObjectScripts.Delete(requestParams.Path!), requestContext); + await RunWithErrorHandling(() => GetProject(requestParams.ProjectUri).SqlObjectScripts.Delete(requestParams.Path!), requestContext); } internal async Task HandleExcludeSqlObjectScriptRequest(SqlProjectScriptParams requestParams, RequestContext requestContext) { - await RunWithErrorHandling(() => GetProject(requestParams.ProjectUri!).SqlObjectScripts.Exclude(requestParams.Path!), requestContext); + await RunWithErrorHandling(() => GetProject(requestParams.ProjectUri).SqlObjectScripts.Exclude(requestParams.Path!), requestContext); } internal async Task HandleMoveSqlObjectScriptRequest(MoveItemParams requestParams, RequestContext requestContext) @@ -149,6 +169,19 @@ namespace Microsoft.SqlTools.ServiceLayer.SqlProjects #region Pre/Post-deployment script functions + internal async Task HandleGetPreDeploymentScriptsRequest(SqlProjectParams requestParams, RequestContext requestContext) + { + await RunWithErrorHandling(() => + { + return new GetScriptsResult() + { + Success = true, + ErrorMessage = null, + Scripts = GetProject(requestParams.ProjectUri).PreDeployScripts.Select(x => x.Path).ToArray() + }; + }, requestContext); + } + internal async Task HandleAddPreDeploymentScriptRequest(SqlProjectScriptParams requestParams, RequestContext requestContext) { await RunWithErrorHandling(() => GetProject(requestParams.ProjectUri).PreDeployScripts.Add(new PreDeployScript(requestParams.Path)), requestContext); @@ -169,6 +202,19 @@ namespace Microsoft.SqlTools.ServiceLayer.SqlProjects await RunWithErrorHandling(() => GetProject(requestParams.ProjectUri).PreDeployScripts.Move(requestParams.Path, requestParams.DestinationPath), requestContext); } + internal async Task HandleGetPostDeploymentScriptsRequest(SqlProjectParams requestParams, RequestContext requestContext) + { + await RunWithErrorHandling(() => + { + return new GetScriptsResult() + { + Success = true, + ErrorMessage = null, + Scripts = GetProject(requestParams.ProjectUri).PostDeployScripts.Select(x => x.Path).ToArray() + }; + }, requestContext); + } + internal async Task HandleAddPostDeploymentScriptRequest(SqlProjectScriptParams requestParams, RequestContext requestContext) { await RunWithErrorHandling(() => GetProject(requestParams.ProjectUri).PostDeployScripts.Add(new PostDeployScript(requestParams.Path)), requestContext); @@ -193,6 +239,19 @@ namespace Microsoft.SqlTools.ServiceLayer.SqlProjects #region Folder functions + internal async Task HandleGetFoldersRequest(SqlProjectParams requestParams, RequestContext requestContext) + { + await RunWithErrorHandling(() => + { + return new GetFoldersResult() + { + Success = true, + ErrorMessage = null, + Folders = GetProject(requestParams.ProjectUri).Folders.Select(x => x.Path).ToArray() + }; + }, requestContext); + } + internal async Task HandleAddFolderRequest(FolderParams requestParams, RequestContext requestContext) { await RunWithErrorHandling(() => GetProject(requestParams.ProjectUri).Folders.Add(new Folder(requestParams.Path)), requestContext); @@ -209,6 +268,21 @@ namespace Microsoft.SqlTools.ServiceLayer.SqlProjects #region Database Reference functions + internal async Task HandleGetDatabaseReferencesRequest(SqlProjectParams requestParams, RequestContext requestContext) + { + await RunWithErrorHandling(() => + { + return new GetDatabaseReferencesResult() + { + Success = true, + ErrorMessage = null, + SystemDatabaseReferences = GetProject(requestParams.ProjectUri).DatabaseReferences.OfType().ToArray(), + DacpacReferences = GetProject(requestParams.ProjectUri).DatabaseReferences.OfType().ToArray(), + SqlProjectReferences = GetProject(requestParams.ProjectUri).DatabaseReferences.OfType().ToArray() + }; + }, requestContext); + } + internal async Task HandleAddSystemDatabaseReferenceRequest(AddSystemDatabaseReferenceParams requestParams, RequestContext requestContext) { await RunWithErrorHandling(() => GetProject(requestParams.ProjectUri!).DatabaseReferences.Add( @@ -299,6 +373,19 @@ namespace Microsoft.SqlTools.ServiceLayer.SqlProjects #region SQLCMD variable functions + internal async Task HandleGetSqlCmdVariablesRequest(SqlProjectParams requestParams, RequestContext requestContext) + { + await RunWithErrorHandling(() => + { + return new GetSqlCmdVariablesResult() + { + Success = true, + ErrorMessage = null, + SqlCmdVariables = GetProject(requestParams.ProjectUri).SqlCmdVariables.ToArray() + }; + }, requestContext); + } + internal async Task HandleAddSqlCmdVariableRequest(AddSqlCmdVariableParams requestParams, RequestContext requestContext) { await RunWithErrorHandling(() => GetProject(requestParams.ProjectUri!).SqlCmdVariables.Add(new SqlCmdVariable(requestParams.Name, requestParams.DefaultValue, requestParams.Value)), requestContext); diff --git a/test/Microsoft.SqlTools.ServiceLayer.IntegrationTests/SqlProjects/SqlProjectsServiceTests.cs b/test/Microsoft.SqlTools.ServiceLayer.IntegrationTests/SqlProjects/SqlProjectsServiceTests.cs index 7e055fb2..debd76b8 100644 --- a/test/Microsoft.SqlTools.ServiceLayer.IntegrationTests/SqlProjects/SqlProjectsServiceTests.cs +++ b/test/Microsoft.SqlTools.ServiceLayer.IntegrationTests/SqlProjects/SqlProjectsServiceTests.cs @@ -101,7 +101,7 @@ namespace Microsoft.SqlTools.ServiceLayer.IntegrationTests.SqlProjects } [Test] - public async Task TestSqlObjectScriptAddDeleteExcludeMove() + public async Task TestSqlObjectScriptOperations() { // Setup SqlProjectsService service = new(); @@ -125,6 +125,17 @@ namespace Microsoft.SqlTools.ServiceLayer.IntegrationTests.SqlProjects Assert.AreEqual(1, service.Projects[projectUri].SqlObjectScripts.Count, "SqlObjectScripts count after add"); Assert.IsTrue(service.Projects[projectUri].SqlObjectScripts.Contains(scriptRelativePath), $"SqlObjectScripts expected to contain {scriptRelativePath}"); + // Validate getting a list of the SQL object scripts + MockRequest getMock = new(); + await service.HandleGetSqlObjectScriptsRequest(new SqlProjectParams() + { + ProjectUri = projectUri + }, getMock.Object); + + getMock.AssertSuccess(nameof(service.HandleGetSqlObjectScriptsRequest)); + Assert.AreEqual(1, getMock.Result.Scripts.Length); + Assert.AreEqual(scriptRelativePath, getMock.Result.Scripts[0]); + // Validate excluding a SQL object script requestMock = new(); await service.HandleExcludeSqlObjectScriptRequest(new SqlProjectScriptParams() @@ -179,7 +190,7 @@ namespace Microsoft.SqlTools.ServiceLayer.IntegrationTests.SqlProjects } [Test] - public async Task TestPreDeploymentScriptAddDeleteExcludeMove() + public async Task TestPreDeploymentScriptOperations() { // Setup SqlProjectsService service = new(); @@ -203,6 +214,17 @@ namespace Microsoft.SqlTools.ServiceLayer.IntegrationTests.SqlProjects Assert.AreEqual(1, service.Projects[projectUri].PreDeployScripts.Count, "PreDeployScript count after add"); Assert.IsTrue(service.Projects[projectUri].PreDeployScripts.Contains(scriptRelativePath), $"PreDeployScripts expected to contain {scriptRelativePath}"); + // Validate getting a list of the pre-deployment scripts + MockRequest getMock = new(); + await service.HandleGetPreDeploymentScriptsRequest(new SqlProjectParams() + { + ProjectUri = projectUri + }, getMock.Object); + + getMock.AssertSuccess(nameof(service.HandleGetPreDeploymentScriptsRequest)); + Assert.AreEqual(1, getMock.Result.Scripts.Length); + Assert.AreEqual(scriptRelativePath, getMock.Result.Scripts[0]); + // Validate excluding a pre-deployment script requestMock = new(); await service.HandleExcludePreDeploymentScriptRequest(new SqlProjectScriptParams() @@ -281,6 +303,17 @@ namespace Microsoft.SqlTools.ServiceLayer.IntegrationTests.SqlProjects Assert.AreEqual(1, service.Projects[projectUri].PostDeployScripts.Count, "PostDeployScript count after add"); Assert.IsTrue(service.Projects[projectUri].PostDeployScripts.Contains(scriptRelativePath), $"PostDeployScripts expected to contain {scriptRelativePath}"); + // Validate getting a list of the post-deployment scripts + MockRequest getMock = new(); + await service.HandleGetPostDeploymentScriptsRequest(new SqlProjectParams() + { + ProjectUri = projectUri + }, getMock.Object); + + getMock.AssertSuccess(nameof(service.HandleGetPostDeploymentScriptsRequest)); + Assert.AreEqual(1, getMock.Result.Scripts.Length); + Assert.AreEqual(scriptRelativePath, getMock.Result.Scripts[0]); + // Validate excluding a Post-deployment script requestMock = new(); await service.HandleExcludePostDeploymentScriptRequest(new SqlProjectScriptParams() @@ -336,6 +369,40 @@ namespace Microsoft.SqlTools.ServiceLayer.IntegrationTests.SqlProjects #region Database reference tests + [Test] + public async Task TestGetDatabaseReferences() + { + var (service, projectUri, _, _) = await SetUpDatabaseReferenceTest(); + + // directly add some database references + + SystemDatabaseReference systemDatabaseReference = new SystemDatabaseReference(SystemDatabase.MSDB, suppressMissingDependencies: true); + DacpacReference dacpacReference = new DacpacReference("OtherDatabaseDacpac.dacpac", suppressMissingDependencies: true); + SqlProjectReference sqlProjectReference = new SqlProjectReference("OtherDatabaseProject.sqlproj", projectGuid: TEST_GUID, suppressMissingDependencies: true); + + service.Projects[projectUri].DatabaseReferences.Add(systemDatabaseReference); + service.Projects[projectUri].DatabaseReferences.Add(dacpacReference); + service.Projects[projectUri].DatabaseReferences.Add(sqlProjectReference); + + // Validate getting a list of the post-deployment scripts + MockRequest getMock = new(); + await service.HandleGetDatabaseReferencesRequest(new SqlProjectParams() + { + ProjectUri = projectUri + }, getMock.Object); + + getMock.AssertSuccess(nameof(service.HandleGetDatabaseReferencesRequest)); + + Assert.AreEqual(1, getMock.Result.SystemDatabaseReferences.Length); + Assert.AreEqual(systemDatabaseReference, getMock.Result.SystemDatabaseReferences[0]); + + Assert.AreEqual(1, getMock.Result.DacpacReferences.Length); + Assert.AreEqual(dacpacReference, getMock.Result.DacpacReferences[0]); + + Assert.AreEqual(1, getMock.Result.SqlProjectReferences.Length); + Assert.AreEqual(sqlProjectReference, getMock.Result.SqlProjectReferences[0]); + } + [Test] public async Task TestDatabaseReferenceDelete() { @@ -516,7 +583,7 @@ namespace Microsoft.SqlTools.ServiceLayer.IntegrationTests.SqlProjects #endregion [Test] - public async Task TestFolderAddDelete() + public async Task TestFolderOperations() { // Setup SqlProjectsService service = new(); @@ -538,6 +605,17 @@ namespace Microsoft.SqlTools.ServiceLayer.IntegrationTests.SqlProjects Assert.IsTrue(Directory.Exists(Path.Join(Path.GetDirectoryName(projectUri), folderParams.Path)), $"Subfolder '{folderParams.Path}' expected to exist on disk"); Assert.IsTrue(service.Projects[projectUri].Folders.Contains(folderParams.Path), $"SqlObjectScripts expected to contain {folderParams.Path}"); + // Validate getting a list of the post-deployment scripts + MockRequest getMock = new(); + await service.HandleGetFoldersRequest(new SqlProjectParams() + { + ProjectUri = projectUri + }, getMock.Object); + + getMock.AssertSuccess(nameof(service.HandleGetFoldersRequest)); + Assert.AreEqual(1, getMock.Result.Folders.Length); + Assert.AreEqual(folderParams.Path, getMock.Result.Folders[0]); + // Validate deleting a folder requestMock = new(); await service.HandleDeleteFolderRequest(folderParams, requestMock.Object); @@ -547,7 +625,7 @@ namespace Microsoft.SqlTools.ServiceLayer.IntegrationTests.SqlProjects } [Test] - public async Task TestSqlCmdVariablesAddDelete() + public async Task TestSqlCmdVariablesOperations() { SqlProjectsService service = new(); string projectUri = await service.CreateSqlProject(); @@ -571,6 +649,17 @@ namespace Microsoft.SqlTools.ServiceLayer.IntegrationTests.SqlProjects Assert.AreEqual(1, service.Projects[projectUri].SqlCmdVariables.Count, "Number of SQLCMD variables after addition not as expected"); Assert.IsTrue(service.Projects[projectUri].SqlCmdVariables.Contains(variableName), $"List of SQLCMD variables expected to contain {variableName}"); + // Validate getting a list of the SQLCMD variables + MockRequest getMock = new(); + await service.HandleGetSqlCmdVariablesRequest(new SqlProjectParams() + { + ProjectUri = projectUri + }, getMock.Object); + + getMock.AssertSuccess(nameof(service.HandleGetSqlCmdVariablesRequest)); + Assert.AreEqual(1, getMock.Result.SqlCmdVariables.Length); + Assert.AreEqual(variableName, getMock.Result.SqlCmdVariables[0].VarName); + // Validate updating a SQLCMD variable const string updatedDefaultValue = "$(UpdatedDefaultValue)"; const string updatedValue = "$(UpdatedValue)";