Improvements to GenerateTSqlModel request and tests (#1611)

This commit is contained in:
Barbara Valdez
2022-08-01 13:50:13 -07:00
committed by GitHub
parent be37dba620
commit dc3deecbad
3 changed files with 105 additions and 109 deletions

View File

@@ -3,7 +3,6 @@
// Licensed under the MIT license. See LICENSE file in the project root for full license information. // Licensed under the MIT license. See LICENSE file in the project root for full license information.
// //
using Microsoft.SqlTools.Hosting.Protocol.Contracts; using Microsoft.SqlTools.Hosting.Protocol.Contracts;
using Microsoft.SqlTools.ServiceLayer.Utility;
namespace Microsoft.SqlTools.ServiceLayer.DacFx.Contracts namespace Microsoft.SqlTools.ServiceLayer.DacFx.Contracts
{ {
@@ -33,7 +32,7 @@ namespace Microsoft.SqlTools.ServiceLayer.DacFx.Contracts
/// </summary> /// </summary>
class GenerateTSqlModelRequest class GenerateTSqlModelRequest
{ {
public static readonly RequestType<GenerateTSqlModelParams, ResultStatus> Type = public static readonly RequestType<GenerateTSqlModelParams, bool> Type =
RequestType<GenerateTSqlModelParams, ResultStatus>.Create("dacFx/generateTSqlModel"); RequestType<GenerateTSqlModelParams, bool>.Create("dacFx/generateTSqlModel");
} }
} }

View File

@@ -12,7 +12,6 @@ using Microsoft.SqlTools.ServiceLayer.DacFx.Contracts;
using Microsoft.SqlTools.ServiceLayer.Hosting; using Microsoft.SqlTools.ServiceLayer.Hosting;
using Microsoft.SqlTools.ServiceLayer.TaskServices; using Microsoft.SqlTools.ServiceLayer.TaskServices;
using Microsoft.SqlServer.Dac.Model; using Microsoft.SqlServer.Dac.Model;
using Microsoft.SqlTools.ServiceLayer.Utility;
using DacTableDesigner = Microsoft.Data.Tools.Sql.DesignServices.TableDesigner.TableDesigner; using DacTableDesigner = Microsoft.Data.Tools.Sql.DesignServices.TableDesigner.TableDesigner;
namespace Microsoft.SqlTools.ServiceLayer.DacFx namespace Microsoft.SqlTools.ServiceLayer.DacFx
@@ -271,7 +270,7 @@ namespace Microsoft.SqlTools.ServiceLayer.DacFx
}); });
} }
public async Task HandleGenerateTSqlModelRequest(GenerateTSqlModelParams requestParams, RequestContext<ResultStatus> requestContext) public async Task HandleGenerateTSqlModelRequest(GenerateTSqlModelParams requestParams, RequestContext<bool> requestContext)
{ {
try try
{ {
@@ -279,11 +278,7 @@ namespace Microsoft.SqlTools.ServiceLayer.DacFx
TSqlModel model = operation.GenerateTSqlModel(); TSqlModel model = operation.GenerateTSqlModel();
projectModels.Value[operation.Parameters.ProjectUri] = model; projectModels.Value[operation.Parameters.ProjectUri] = model;
await requestContext.SendResult(new ResultStatus await requestContext.SendResult(true);
{
Success = true,
ErrorMessage = null
});
} }
catch (Exception e) catch (Exception e)
{ {

View File

@@ -17,7 +17,6 @@ using Microsoft.SqlTools.ServiceLayer.DacFx.Contracts;
using Microsoft.SqlTools.ServiceLayer.IntegrationTests.Utility; using Microsoft.SqlTools.ServiceLayer.IntegrationTests.Utility;
using Microsoft.SqlTools.ServiceLayer.TaskServices; using Microsoft.SqlTools.ServiceLayer.TaskServices;
using Microsoft.SqlTools.ServiceLayer.Test.Common; using Microsoft.SqlTools.ServiceLayer.Test.Common;
using Microsoft.SqlTools.ServiceLayer.Utility;
using Microsoft.SqlServer.Dac.Model; using Microsoft.SqlServer.Dac.Model;
using NUnit.Framework; using NUnit.Framework;
using Moq; using Moq;
@@ -28,7 +27,6 @@ namespace Microsoft.SqlTools.ServiceLayer.IntegrationTests.DacFx
public class DacFxServiceTests public class DacFxServiceTests
{ {
private string publishProfileFolder = Path.Combine("..", "..", "..", "DacFx", "PublishProfiles"); private string publishProfileFolder = Path.Combine("..", "..", "..", "DacFx", "PublishProfiles");
private string TSqlModelTestFolder = Path.Combine("..", "..", "..", "DacFx", "TSqlModels");
private const string SourceScript = @"CREATE TABLE [dbo].[table1] private const string SourceScript = @"CREATE TABLE [dbo].[table1]
( (
[ID] INT NOT NULL PRIMARY KEY, [ID] INT NOT NULL PRIMARY KEY,
@@ -930,102 +928,106 @@ Streaming query statement contains a reference to missing output stream 'Missing
Assert.That(actualValue, Is.EqualTo(expectedValue), $"Actual Property from Service is not equal to default property for {optionRow.Key}"); Assert.That(actualValue, Is.EqualTo(expectedValue), $"Actual Property from Service is not equal to default property for {optionRow.Key}");
} }
} }
}
/// <summary> }
/// Verify the generate Tsql model operation
/// </summary> [TestFixture]
[Test] public class TSqlModelRequestTests
public void GenerateTSqlModelFromSqlFiles() {
{ private string TSqlModelTestFolder = string.Empty;
DacFxService service = new DacFxService();
Directory.CreateDirectory(TSqlModelTestFolder); private DacFxService service = new DacFxService();
string sqlTable1DefinitionPath = Path.Join(TSqlModelTestFolder, "table1.sql");
string sqlTable2DefinitionPath = Path.Join(TSqlModelTestFolder, "table2.sql"); [SetUp]
const string table1 = @"CREATE TABLE [dbo].[table1] public void Create()
( {
[ID] INT NOT NULL PRIMARY KEY, TSqlModelTestFolder = Path.Combine("..", "..", "..", "DacFx", "TSqlModels", Guid.NewGuid().ToString());
)"; Directory.CreateDirectory(TSqlModelTestFolder);
const string table2 = @"CREATE TABLE [dbo].[table2] }
(
[ID] INT NOT NULL PRIMARY KEY, [TearDown]
)"; public void CleanUp()
// create sql file {
File.WriteAllText(sqlTable1DefinitionPath, table1); Directory.Delete(TSqlModelTestFolder, true);
File.WriteAllText(sqlTable2DefinitionPath, table2); }
var generateTSqlScriptParams = new GenerateTSqlModelParams /// <summary>
{ /// Verify the generate Tsql model operation
ProjectUri = Path.Join(TSqlModelTestFolder, "test.sqlproj"), /// </summary>
ModelTargetVersion = "Sql160", [Test]
FilePaths = new[] { sqlTable1DefinitionPath, sqlTable2DefinitionPath } public void GenerateTSqlModelFromSqlFiles()
}; {
string sqlTable1DefinitionPath = Path.Join(TSqlModelTestFolder, "table1.sql");
GenerateTSqlModelOperation op = new GenerateTSqlModelOperation(generateTSqlScriptParams); string sqlTable2DefinitionPath = Path.Join(TSqlModelTestFolder, "table2.sql");
var model = op.GenerateTSqlModel(); const string table1 = @"CREATE TABLE [dbo].[table1]
var objects = model.GetObjects(DacQueryScopes.UserDefined, ModelSchema.Table).ToList(); (
[ID] INT NOT NULL PRIMARY KEY,
VerifyAndCleanup(sqlTable1DefinitionPath); )";
VerifyAndCleanup(sqlTable2DefinitionPath); const string table2 = @"CREATE TABLE [dbo].[table2]
Directory.Delete(TSqlModelTestFolder); (
[ID] INT NOT NULL PRIMARY KEY,
Assert.That(model.Version.ToString(), Is.EqualTo(generateTSqlScriptParams.ModelTargetVersion), $"Model version is not equal to {generateTSqlScriptParams.ModelTargetVersion}"); )";
Assert.That(objects, Is.Not.Empty); // create sql file
File.WriteAllText(sqlTable1DefinitionPath, table1);
var tableNames = objects.Select(o => o.Name.ToString()).ToList(); File.WriteAllText(sqlTable2DefinitionPath, table2);
Assert.That(tableNames.Count, Is.EqualTo(2), "Model was not populated correctly"); var generateTSqlScriptParams = new GenerateTSqlModelParams
CollectionAssert.AreEquivalent(tableNames, new[] { "[dbo].[table1]", "[dbo].[table2]" }, "Table names do not match"); {
} ProjectUri = Path.Join(TSqlModelTestFolder, "test.sqlproj"),
ModelTargetVersion = "Sql160",
/// <summary> FilePaths = new[] { sqlTable1DefinitionPath, sqlTable2DefinitionPath }
/// Verify the generate Tsql model operation, creates an empty model when files are empty };
/// </summary>
[Test] GenerateTSqlModelOperation op = new GenerateTSqlModelOperation(generateTSqlScriptParams);
public void GenerateEmptyTSqlModel() var model = op.GenerateTSqlModel();
{ var objects = model.GetObjects(DacQueryScopes.UserDefined, ModelSchema.Table).ToList();
DacFxService service = new DacFxService();
Directory.CreateDirectory(TSqlModelTestFolder); Assert.That(model.Version.ToString(), Is.EqualTo(generateTSqlScriptParams.ModelTargetVersion), $"Model version is not equal to {generateTSqlScriptParams.ModelTargetVersion}");
Assert.That(objects, Is.Not.Empty, "Model is empty");
var generateTSqlScriptParams = new GenerateTSqlModelParams
{ var tableNames = objects.Select(o => o.Name.ToString()).ToList();
ProjectUri = Path.Join(TSqlModelTestFolder, "test.sqlproj"),
ModelTargetVersion = "Sql160", Assert.That(tableNames.Count, Is.EqualTo(2), "Model was not populated correctly");
FilePaths = new string[] { } CollectionAssert.AreEquivalent(tableNames, new[] { "[dbo].[table1]", "[dbo].[table2]" }, "Table names do not match");
}; }
GenerateTSqlModelOperation op = new GenerateTSqlModelOperation(generateTSqlScriptParams); /// <summary>
var model = op.GenerateTSqlModel(); /// Verify the generate Tsql model operation, creates an empty model when files are empty
/// </summary>
// clean up [Test]
Directory.Delete(TSqlModelTestFolder); public void GenerateEmptyTSqlModel()
{
Assert.That(model.GetObjects(DacQueryScopes.UserDefined, ModelSchema.Table).ToList().Count, Is.EqualTo(0), "Model is not empty"); var generateTSqlScriptParams = new GenerateTSqlModelParams
Assert.That(model.Version.ToString(), Is.EqualTo(generateTSqlScriptParams.ModelTargetVersion), $"Model version is not equal to {generateTSqlScriptParams.ModelTargetVersion}"); {
} ProjectUri = Path.Join(TSqlModelTestFolder, "test.sqlproj"),
ModelTargetVersion = "Sql160",
/// <summary> FilePaths = new string[] { }
/// Verify the generate TSql Model handle };
/// </summary>
[Test] GenerateTSqlModelOperation op = new GenerateTSqlModelOperation(generateTSqlScriptParams);
public async Task VerifyGenerateTSqlModelHandle() var model = op.GenerateTSqlModel();
{
DacFxService service = new DacFxService(); Assert.That(model.GetObjects(DacQueryScopes.UserDefined, ModelSchema.Table).ToList().Count, Is.EqualTo(0), "Model is not empty");
Directory.CreateDirectory(TSqlModelTestFolder); Assert.That(model.Version.ToString(), Is.EqualTo(generateTSqlScriptParams.ModelTargetVersion), $"Model version is not equal to {generateTSqlScriptParams.ModelTargetVersion}");
}
var generateTSqlScriptParams = new GenerateTSqlModelParams
{ /// <summary>
ProjectUri = Path.Join(TSqlModelTestFolder, "test.sqlproj"), /// Verify the generate TSql Model handle
ModelTargetVersion = "Sql160", /// </summary>
FilePaths = new string[] { } [Test]
}; public async Task VerifyGenerateTSqlModelHandle()
{
var requestContext = new Mock<RequestContext<ResultStatus>>(); var generateTSqlScriptParams = new GenerateTSqlModelParams
requestContext.Setup((RequestContext<ResultStatus> x) => x.SendResult(It.Is<ResultStatus>((result) => result.Success == true))).Returns(Task.FromResult(new object())); {
await service.HandleGenerateTSqlModelRequest(generateTSqlScriptParams, requestContext.Object); ProjectUri = Path.Join(TSqlModelTestFolder, "test.sqlproj"),
ModelTargetVersion = "Sql160",
Directory.Delete(TSqlModelTestFolder); FilePaths = new string[] { }
};
Assert.True(service.projectModels.Value.Keys.Contains(generateTSqlScriptParams.ProjectUri), "Model was not stored under project uri");
} var requestContext = new Mock<RequestContext<bool>>();
requestContext.Setup((RequestContext<bool> x) => x.SendResult(It.Is<bool>((result) => result == true))).Returns(Task.FromResult(new object()));
await service.HandleGenerateTSqlModelRequest(generateTSqlScriptParams, requestContext.Object);
Assert.That(service.projectModels.Value, Contains.Key(generateTSqlScriptParams.ProjectUri), "Model was not stored under project uri");
} }
} }