Filtering Schema Compare error from warnings (#1212)

* Filtering Schema Compare error from warnings

* SchemaCompare added comparison result error message validations to existing tests

* Extra semi-colon noticed and removed from the code

* Added new test case to validate warning message exclusions from SC result

* SC test asserions comment added

* Edge case scenario fixed and tests are 100% passed
This commit is contained in:
Sai Avishkar Sreerama
2021-05-21 11:25:25 +05:30
committed by GitHub
parent 64a6b6a85c
commit 37b2b26edf
3 changed files with 71 additions and 3 deletions

View File

@@ -120,9 +120,13 @@ namespace Microsoft.SqlTools.ServiceLayer.SchemaCompare
}
}
// Appending the set of errors that are stopping the schema compare to the ErrorMessage
var errorsList = ComparisonResult.GetErrors().Select(e => e.Message).Distinct().ToList();
ErrorMessage = string.Join("\n", errorsList);
// Appending the set of errors that are stopping the schema compare to the ErrorMessage
// GetErrors return all type of warnings, and error messages. Only filtering the error type messages here
var errorsList = ComparisonResult.GetErrors().Where(x => x.MessageType.Equals(Microsoft.SqlServer.Dac.DacMessageType.Error)).Select(e => e.Message).Distinct().ToList();
if (errorsList.Count > 0)
{
ErrorMessage = string.Join("\n", errorsList);
}
}
catch (Exception e)
{

View File

@@ -138,6 +138,7 @@ END
SchemaCompareOperation schemaCompareOperation1 = new SchemaCompareOperation(schemaCompareParams1, null, null);
schemaCompareOperation1.Execute(TaskExecutionMode.Execute);
Assert.True(schemaCompareOperation1.ComparisonResult.IsEqual);
Assert.IsNull(schemaCompareOperation1.ErrorMessage);
var schemaCompareParams2 = new SchemaCompareParams
{
@@ -150,6 +151,7 @@ END
schemaCompareOperation2.Execute(TaskExecutionMode.Execute);
Assert.False(schemaCompareOperation2.ComparisonResult.IsEqual);
Assert.NotNull(schemaCompareOperation2.ComparisonResult.Differences);
Assert.IsNull(schemaCompareOperation2.ErrorMessage);
// cleanup
SchemaCompareTestUtils.VerifyAndCleanup(sourceDacpacFilePath);
@@ -193,6 +195,7 @@ END
Assert.True(schemaCompareOperation1.ComparisonResult.IsValid);
Assert.True(schemaCompareOperation1.ComparisonResult.IsEqual);
Assert.NotNull(schemaCompareOperation1.ComparisonResult.Differences);
Assert.IsNull(schemaCompareOperation1.ErrorMessage);
var schemaCompareParams2 = new SchemaCompareParams
{
@@ -205,6 +208,7 @@ END
schemaCompareOperation2.Execute(TaskExecutionMode.Execute);
Assert.False(schemaCompareOperation2.ComparisonResult.IsEqual);
Assert.NotNull(schemaCompareOperation2.ComparisonResult.Differences);
Assert.IsNull(schemaCompareOperation2.ErrorMessage);
}
finally
{
@@ -247,6 +251,7 @@ END
Assert.True(schemaCompareOperation1.ComparisonResult.IsValid);
Assert.True(schemaCompareOperation1.ComparisonResult.IsEqual);
Assert.NotNull(schemaCompareOperation1.ComparisonResult.Differences);
Assert.IsNull(schemaCompareOperation1.ErrorMessage);
// generate script
var generateScriptParams1 = new SchemaCompareGenerateScriptParams
@@ -283,6 +288,7 @@ END
Assert.True(schemaCompareOperation2.ComparisonResult.IsValid);
Assert.False(schemaCompareOperation2.ComparisonResult.IsEqual);
Assert.NotNull(schemaCompareOperation2.ComparisonResult.Differences);
Assert.IsNull(schemaCompareOperation2.ErrorMessage);
// generate script
var generateScriptParams2 = new SchemaCompareGenerateScriptParams

View File

@@ -402,6 +402,8 @@ WITH VALUES
Assert.True(schemaCompareOperation.ComparisonResult.IsValid);
Assert.False(schemaCompareOperation.ComparisonResult.IsEqual);
Assert.NotNull(schemaCompareOperation.ComparisonResult.Differences);
Assert.IsNull(schemaCompareOperation.ErrorMessage);
var enumerator = schemaCompareOperation.ComparisonResult.Differences.GetEnumerator();
enumerator.MoveNext();
Assert.True(enumerator.Current.SourceObject.Name.ToString().Equals("[dbo].[table1]"));
@@ -426,6 +428,7 @@ WITH VALUES
Assert.True(schemaCompareOperation.ComparisonResult.IsValid);
Assert.True(schemaCompareOperation.ComparisonResult.IsEqual);
Assert.That(schemaCompareOperation.ComparisonResult.Differences, Is.Empty);
Assert.IsNull(schemaCompareOperation.ErrorMessage);
}
finally
{
@@ -736,6 +739,7 @@ WITH VALUES
}
Assert.Null(schemaCompareOperation.ComparisonResult.Differences);
Assert.AreEqual("The operation was canceled.", schemaCompareOperation.ErrorMessage);
}
finally
{
@@ -851,6 +855,7 @@ WITH VALUES
Assert.True(schemaCompareOperation.ComparisonResult.IsValid);
Assert.False(schemaCompareOperation.ComparisonResult.IsEqual);
Assert.NotNull(schemaCompareOperation.ComparisonResult.Differences);
Assert.IsNull(schemaCompareOperation.ErrorMessage);
// try to exclude
DiffEntry t2Diff = SchemaCompareUtils.CreateDiffEntry(schemaCompareOperation.ComparisonResult.Differences.Where(x => x.SourceObject != null && x.SourceObject.Name.Parts[1] == "t2").First(), null);
@@ -914,6 +919,57 @@ WITH VALUES
}
}
/// <summary>
/// Verify the schema compare warning messages being excluded
/// </summary>
[Test]
public async Task VerifySchemaCompareWarningsBeingExcluded()
{
var result = SchemaCompareTestUtils.GetLiveAutoCompleteTestObjects();
SqlTestDb sourceDb = await SqlTestDb.CreateNewAsync(TestServerType.OnPrem, false, null, null, "SchemaCompareSource");
SqlTestDb targetDb = await SqlTestDb.CreateNewAsync(TestServerType.OnPrem, false, null, TargetScript, "SchemaCompareTarget");
try
{
SchemaCompareEndpointInfo sourceInfo = new SchemaCompareEndpointInfo();
SchemaCompareEndpointInfo targetInfo = new SchemaCompareEndpointInfo();
sourceInfo.EndpointType = SchemaCompareEndpointType.Database;
sourceInfo.DatabaseName = sourceDb.DatabaseName;
targetInfo.EndpointType = SchemaCompareEndpointType.Database;
targetInfo.DatabaseName = targetDb.DatabaseName;
var schemaCompareParams = new SchemaCompareParams
{
SourceEndpointInfo = sourceInfo,
TargetEndpointInfo = targetInfo
};
// Do Schema compare
SchemaCompareOperation schemaCompareOperation = new SchemaCompareOperation(schemaCompareParams, result.ConnectionInfo, result.ConnectionInfo);
schemaCompareOperation.Execute(TaskExecutionMode.Execute);
// Expected 'data loss could occur' warning messages while comparing
var warnings = schemaCompareOperation.ComparisonResult.GetErrors().Where(x => x.MessageType.Equals(Microsoft.SqlServer.Dac.DacMessageType.Warning)).Select(e => e.Message).Distinct().ToList();
var errors = schemaCompareOperation.ComparisonResult.GetErrors().Where(x => x.MessageType.Equals(Microsoft.SqlServer.Dac.DacMessageType.Error)).Select(e => e.Message).Distinct().ToList();
// Assertions:
// Target database have two tables created and will be shown as two differnces
Assert.AreEqual(2, schemaCompareOperation.ComparisonResult.Differences.Count());
// These two warnings are "data loss could occur" messages for two tables
Assert.AreEqual(2, warnings.Count);
// SC is successful with no errors, hence error message should be empty
Assert.AreEqual(0, errors.Count);
Assert.IsNull(schemaCompareOperation.ErrorMessage, "Error message should be empty as the warnings being excluded");
}
finally
{
// cleanup
sourceDb.Cleanup();
targetDb.Cleanup();
}
}
private void ValidateSchemaCompareWithExcludeIncludeResults(SchemaCompareOperation schemaCompareOperation)
{
schemaCompareOperation.Execute(TaskExecutionMode.Execute);
@@ -921,6 +977,7 @@ WITH VALUES
Assert.True(schemaCompareOperation.ComparisonResult.IsValid);
Assert.False(schemaCompareOperation.ComparisonResult.IsEqual);
Assert.NotNull(schemaCompareOperation.ComparisonResult.Differences);
Assert.IsNull(schemaCompareOperation.ErrorMessage);
// create Diff Entry from Difference
DiffEntry diff = SchemaCompareUtils.CreateDiffEntry(schemaCompareOperation.ComparisonResult.Differences.First(), null);
@@ -963,6 +1020,7 @@ WITH VALUES
Assert.True(schemaCompareOperation.ComparisonResult.IsValid);
Assert.False(schemaCompareOperation.ComparisonResult.IsEqual);
Assert.NotNull(schemaCompareOperation.ComparisonResult.Differences);
Assert.IsNull(schemaCompareOperation.ErrorMessage);
SchemaCompareGenerateScriptOperation generateScriptOperation = new SchemaCompareGenerateScriptOperation(generateScriptParams, schemaCompareOperation.ComparisonResult);
generateScriptOperation.Execute(TaskExecutionMode.Script);