mirror of
https://github.com/ckaczor/sqltoolsservice.git
synced 2026-01-14 01:25:40 -05:00
Add support for getting DacFx deploy options from a publish profile (#995)
* add support for getting options from a publish profile * update comments * set values for default options if they aren't specified in the publish profile * addressing comments
This commit is contained in:
@@ -5,20 +5,25 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
using System.Threading.Tasks;
|
||||
using Microsoft.Data.SqlClient;
|
||||
using Microsoft.SqlServer.Dac;
|
||||
using Microsoft.SqlTools.Hosting.Protocol;
|
||||
using Microsoft.SqlTools.ServiceLayer.Connection.ReliableConnection;
|
||||
using Microsoft.SqlTools.ServiceLayer.DacFx;
|
||||
using Microsoft.SqlTools.ServiceLayer.DacFx.Contracts;
|
||||
using Microsoft.SqlTools.ServiceLayer.IntegrationTests.Utility;
|
||||
using Microsoft.SqlTools.ServiceLayer.SchemaCompare.Contracts;
|
||||
using Microsoft.SqlTools.ServiceLayer.TaskServices;
|
||||
using Microsoft.SqlTools.ServiceLayer.Test.Common;
|
||||
using Moq;
|
||||
using Xunit;
|
||||
|
||||
namespace Microsoft.SqlTools.ServiceLayer.IntegrationTests.DacFx
|
||||
{
|
||||
public class DacFxServiceTests
|
||||
{
|
||||
private string publishProfileFolder = Path.Combine("..", "..", "..", "DacFx", "PublishProfiles");
|
||||
private const string SourceScript = @"CREATE TABLE [dbo].[table1]
|
||||
(
|
||||
[ID] INT NOT NULL PRIMARY KEY,
|
||||
@@ -532,6 +537,80 @@ RETURN 0
|
||||
}
|
||||
}
|
||||
|
||||
// <summary>
|
||||
/// Verify that options can get retrieved from publish profile
|
||||
/// </summary>
|
||||
[Fact]
|
||||
public async void GetOptionsFromProfile()
|
||||
{
|
||||
DeploymentOptions expectedResults = new DeploymentOptions()
|
||||
{
|
||||
ExcludeObjectTypes = null,
|
||||
IncludeCompositeObjects = true,
|
||||
BlockOnPossibleDataLoss = true,
|
||||
AllowIncompatiblePlatform = true
|
||||
};
|
||||
|
||||
var dacfxRequestContext = new Mock<RequestContext<DacFxOptionsResult>>();
|
||||
dacfxRequestContext.Setup((RequestContext<DacFxOptionsResult> x) => x.SendResult(It.Is<DacFxOptionsResult>((result) => ValidateOptions(expectedResults, result.DeploymentOptions) == true))).Returns(Task.FromResult(new object()));
|
||||
|
||||
DacFxService service = new DacFxService();
|
||||
string file = Path.Combine(publishProfileFolder, "profileWithOptions.publish.xml");
|
||||
|
||||
var getOptionsFromProfileParams = new GetOptionsFromProfileParams
|
||||
{
|
||||
ProfilePath = file
|
||||
};
|
||||
|
||||
await service.HandleGetOptionsFromProfileRequest(getOptionsFromProfileParams, dacfxRequestContext.Object);
|
||||
dacfxRequestContext.VerifyAll();
|
||||
}
|
||||
|
||||
// <summary>
|
||||
/// Verify that default options are returned if a profile doesn't specify any options
|
||||
/// </summary>
|
||||
[Fact]
|
||||
public async void GetOptionsFromProfileWithoutOptions()
|
||||
{
|
||||
DeploymentOptions expectedResults = new DeploymentOptions();
|
||||
expectedResults.ExcludeObjectTypes = null;
|
||||
|
||||
var dacfxRequestContext = new Mock<RequestContext<DacFxOptionsResult>>();
|
||||
dacfxRequestContext.Setup((RequestContext<DacFxOptionsResult> x) => x.SendResult(It.Is<DacFxOptionsResult>((result) => ValidateOptions(expectedResults, result.DeploymentOptions) == true))).Returns(Task.FromResult(new object()));
|
||||
|
||||
DacFxService service = new DacFxService();
|
||||
string file = Path.Combine(publishProfileFolder, "profileNoOptions.publish.xml");
|
||||
|
||||
var getOptionsFromProfileParams = new GetOptionsFromProfileParams
|
||||
{
|
||||
ProfilePath = file
|
||||
};
|
||||
|
||||
await service.HandleGetOptionsFromProfileRequest(getOptionsFromProfileParams, dacfxRequestContext.Object);
|
||||
dacfxRequestContext.VerifyAll();
|
||||
}
|
||||
|
||||
private bool ValidateOptions(DeploymentOptions expected, DeploymentOptions actual)
|
||||
{
|
||||
System.Reflection.PropertyInfo[] deploymentOptionsProperties = expected.GetType().GetProperties();
|
||||
foreach (var v in deploymentOptionsProperties)
|
||||
{
|
||||
var defaultP = v.GetValue(expected);
|
||||
var actualP = v.GetValue(actual);
|
||||
|
||||
if (v.Name == "ExcludeObjectTypes")
|
||||
{
|
||||
Assert.True((defaultP as ObjectType[])?.Length == (actualP as ObjectType[])?.Length, "Number of excluded objects is different not equal");
|
||||
}
|
||||
else
|
||||
{
|
||||
Assert.True((defaultP == null && actualP == null) || (defaultP == null && (actualP as string) == string.Empty) || defaultP.Equals(actualP), $"Actual Property from Service is not equal to default property for {v.Name}, Actual value: {actualP} and Default value: {defaultP}");
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
private string InitialExtract(DacFxService service, SqlTestDb sourceDb, LiveConnectionHelper.TestConnectionResult result)
|
||||
{
|
||||
string folderPath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), "DacFxTest");
|
||||
|
||||
@@ -0,0 +1,14 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||
<PropertyGroup>
|
||||
<TargetDatabaseName>testdb</TargetDatabaseName>
|
||||
<DeployScriptFileName>DatabaseProjectTestdb.sql</DeployScriptFileName>
|
||||
<ProfileVersionNumber>1</ProfileVersionNumber>
|
||||
</PropertyGroup>
|
||||
<ItemGroup>
|
||||
<SqlCmdVariable Include="ProdDatabaseName">
|
||||
<DefaultValue>prodname</DefaultValue>
|
||||
<Value>$(SqlCmdVar__1)</Value>
|
||||
</SqlCmdVariable>
|
||||
</ItemGroup>
|
||||
</Project>
|
||||
@@ -0,0 +1,17 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||
<PropertyGroup>
|
||||
<IncludeCompositeObjects>True</IncludeCompositeObjects>
|
||||
<TargetDatabaseName>testdb</TargetDatabaseName>
|
||||
<DeployScriptFileName>DatabaseProjectTestdb.sql</DeployScriptFileName>
|
||||
<ProfileVersionNumber>1</ProfileVersionNumber>
|
||||
<BlockOnPossibleDataLoss>True</BlockOnPossibleDataLoss>
|
||||
<AllowIncompatiblePlatform>True</AllowIncompatiblePlatform>
|
||||
</PropertyGroup>
|
||||
<ItemGroup>
|
||||
<SqlCmdVariable Include="ProdDatabaseName">
|
||||
<DefaultValue>prodname</DefaultValue>
|
||||
<Value>$(SqlCmdVar__1)</Value>
|
||||
</SqlCmdVariable>
|
||||
</ItemGroup>
|
||||
</Project>
|
||||
Reference in New Issue
Block a user