From 4592b308c8770149ad63953c2ac1a413bc20e61b Mon Sep 17 00:00:00 2001 From: Erik Ejlskov Jensen Date: Thu, 1 Aug 2024 07:40:09 +0200 Subject: [PATCH 1/6] Report DacModelExceptions better, and continue processing all files fixes #595 --- src/DacpacTool/Extensions.cs | 24 +++++++++++++++++++ src/DacpacTool/PackageBuilder.cs | 17 ++++++++++--- src/DacpacTool/Program.cs | 9 +++++-- test/DacpacTool.Tests/PackageBuilderTests.cs | 18 ++++++++++++-- .../Tables/MyTable.sql | 7 ++++++ .../Tables/MyTable2.sql | 7 ++++++ .../TestProjectWithExceptions.csproj | 10 ++++++++ 7 files changed, 85 insertions(+), 7 deletions(-) create mode 100644 test/TestProjectWithExceptions/Tables/MyTable.sql create mode 100644 test/TestProjectWithExceptions/Tables/MyTable2.sql create mode 100644 test/TestProjectWithExceptions/TestProjectWithExceptions.csproj diff --git a/src/DacpacTool/Extensions.cs b/src/DacpacTool/Extensions.cs index 9ed4d7ae..974e4efe 100644 --- a/src/DacpacTool/Extensions.cs +++ b/src/DacpacTool/Extensions.cs @@ -72,6 +72,30 @@ public static string Format(this BatchParserExecutionErrorEventArgs args, string return outputMessageBuilder.ToString(); } + public static string Format(this DacModelException exception, string fileName) + { + var stringBuilder = new StringBuilder(); + + foreach (var modelError in exception.Messages) + { + stringBuilder.Append(fileName); + stringBuilder.Append('('); + stringBuilder.Append("1"); + stringBuilder.Append(','); + stringBuilder.Append("1"); + stringBuilder.Append("):"); + stringBuilder.Append(' '); + stringBuilder.Append("Error"); + stringBuilder.Append(' '); + stringBuilder.Append(modelError.Prefix); + stringBuilder.Append(modelError.Number); + stringBuilder.Append(": "); + stringBuilder.Append(modelError.Message); + } + + return stringBuilder.ToString(); + } + public static string GetPreDeploymentScript(this DacPackage package) { var stream = package.PreDeploymentScript; diff --git a/src/DacpacTool/PackageBuilder.cs b/src/DacpacTool/PackageBuilder.cs index 5ef68089..b51f760d 100644 --- a/src/DacpacTool/PackageBuilder.cs +++ b/src/DacpacTool/PackageBuilder.cs @@ -58,7 +58,7 @@ public void AddSqlCmdVariables(string[] variables) Model.AddSqlCmdVariables(variables); } - public void AddInputFile(FileInfo inputFile) + public bool AddInputFile(FileInfo inputFile) { // Ensure that the model has been created EnsureModelCreated(); @@ -73,11 +73,22 @@ public void AddInputFile(FileInfo inputFile) if (inputFile.Directory.Name.Equals("rules", StringComparison.OrdinalIgnoreCase) && inputFile.Extension.EndsWith(".dll", StringComparison.OrdinalIgnoreCase)) { - return; + return true; } Console.WriteLine($"Adding {inputFile.FullName} to the model"); - Model.AddOrUpdateObjects(File.ReadAllText(inputFile.FullName), inputFile.FullName, new TSqlObjectOptions()); + + try + { + TSqlObjectOptions sqlObjectOptions = new TSqlObjectOptions(); + Model.AddOrUpdateObjects(File.ReadAllText(inputFile.FullName), inputFile.FullName, new TSqlObjectOptions()); + return true; + } + catch (DacModelException dex) + { + Console.WriteLine(dex.Format(inputFile.Name)); + return false; + } } public void AddPreDeploymentScript(FileInfo script, FileInfo outputFile) diff --git a/src/DacpacTool/Program.cs b/src/DacpacTool/Program.cs index 1de3512a..2eed699b 100644 --- a/src/DacpacTool/Program.cs +++ b/src/DacpacTool/Program.cs @@ -134,6 +134,8 @@ private static int BuildDacpac(BuildOptions options) packageBuilder.AddSqlCmdVariables(options.SqlCmdVar); } + var modelExceptions = false; + // Add input files by iterating through $Project.InputFiles.txt if (options.InputFile != null) { @@ -142,7 +144,10 @@ private static int BuildDacpac(BuildOptions options) foreach (var line in File.ReadLines(options.InputFile.FullName)) { FileInfo inputFile = new FileInfo(line); // Validation occurs in AddInputFile - packageBuilder.AddInputFile(inputFile); + if (!packageBuilder.AddInputFile(inputFile)) + { + modelExceptions = true; + } } } else @@ -176,7 +181,7 @@ private static int BuildDacpac(BuildOptions options) } // Validate the model - if (!packageBuilder.ValidateModel()) + if (modelExceptions || !packageBuilder.ValidateModel()) { return 1; } diff --git a/test/DacpacTool.Tests/PackageBuilderTests.cs b/test/DacpacTool.Tests/PackageBuilderTests.cs index 53f8c004..1e81de28 100644 --- a/test/DacpacTool.Tests/PackageBuilderTests.cs +++ b/test/DacpacTool.Tests/PackageBuilderTests.cs @@ -7,7 +7,6 @@ using Microsoft.SqlServer.Dac; using Microsoft.SqlServer.Dac.Model; using Microsoft.VisualStudio.TestTools.UnitTesting; -using NSubstitute.ExceptionExtensions; using Shouldly; namespace MSBuild.Sdk.SqlProj.DacpacTool.Tests @@ -47,12 +46,27 @@ public void AddInputFile_FileExists() packageBuilder.UsingVersion(SqlServerVersion.Sql150); // Act - packageBuilder.AddInputFile(new FileInfo("../../../../TestProject/Tables/MyTable.sql")); + var result = packageBuilder.AddInputFile(new FileInfo("../../../../TestProject/Tables/MyTable.sql")); // Assert + result.ShouldBe(true); packageBuilder.Model.GetObject(Table.TypeClass, new ObjectIdentifier("dbo", "MyTable"), DacQueryScopes.Default).ShouldNotBeNull(); } + [TestMethod] + public void AddInputFile_FileExists_WithInvalidSyntax() + { + // Arrange + var packageBuilder = new PackageBuilder(); + packageBuilder.UsingVersion(SqlServerVersion.Sql150); + + // Act + var result = packageBuilder.AddInputFile(new FileInfo("../../../../TestProjectWithExceptions/Tables/MyTable.sql")); + + // Assert + result.ShouldBe(false); + } + [TestMethod] public void AddReference_FileDoesNotExist() { diff --git a/test/TestProjectWithExceptions/Tables/MyTable.sql b/test/TestProjectWithExceptions/Tables/MyTable.sql new file mode 100644 index 00000000..4cfdc870 --- /dev/null +++ b/test/TestProjectWithExceptions/Tables/MyTable.sql @@ -0,0 +1,7 @@ +CREATE TABLE [dbo].[MyTable] +( + Column1 nvarchar(100), + Column2 int +); + +CREATE INDEX MyIndex ON MyTable(Column2) diff --git a/test/TestProjectWithExceptions/Tables/MyTable2.sql b/test/TestProjectWithExceptions/Tables/MyTable2.sql new file mode 100644 index 00000000..0b84715d --- /dev/null +++ b/test/TestProjectWithExceptions/Tables/MyTable2.sql @@ -0,0 +1,7 @@ +CREATE TABLE [dbo].[MyTable2] +( + Column1 nvarchar(100), + Column2 int +); + +CREATE INDEX MyIndex2 ON MyTable2(Column2) diff --git a/test/TestProjectWithExceptions/TestProjectWithExceptions.csproj b/test/TestProjectWithExceptions/TestProjectWithExceptions.csproj new file mode 100644 index 00000000..eca502c7 --- /dev/null +++ b/test/TestProjectWithExceptions/TestProjectWithExceptions.csproj @@ -0,0 +1,10 @@ + + + + + netstandard2.0 + Sql150 + + + + \ No newline at end of file From d1ff152a53649670b3f287a95175b9f546102ce1 Mon Sep 17 00:00:00 2001 From: Erik Ejlskov Jensen Date: Fri, 2 Aug 2024 08:12:50 +0200 Subject: [PATCH 2/6] test console output --- src/DacpacTool/PackageBuilder.cs | 34 +++++---- src/DacpacTool/Program.cs | 2 +- test/DacpacTool.Tests/PackageBuilderTests.cs | 74 +++++++++++--------- 3 files changed, 60 insertions(+), 50 deletions(-) diff --git a/src/DacpacTool/PackageBuilder.cs b/src/DacpacTool/PackageBuilder.cs index b51f760d..9831c352 100644 --- a/src/DacpacTool/PackageBuilder.cs +++ b/src/DacpacTool/PackageBuilder.cs @@ -12,15 +12,21 @@ namespace MSBuild.Sdk.SqlProj.DacpacTool { public sealed class PackageBuilder : IDisposable { + private readonly IConsole _console; private bool? _modelValid; private List _suppressedWarnings = new (); private Dictionary> _suppressedFileWarnings = new Dictionary>(StringComparer.InvariantCultureIgnoreCase); + public PackageBuilder(IConsole console) + { + _console = console ?? throw new ArgumentNullException(nameof(console)); + } + public void UsingVersion(SqlServerVersion version) { Model = new TSqlModel(version, Options); - Console.WriteLine($"Using SQL Server version {version}"); + _console.WriteLine($"Using SQL Server version {version}"); } public void AddReference(string referenceFile, string externalParts = null, bool suppressErrorsForMissingDependencies = false) @@ -30,7 +36,7 @@ public void AddReference(string referenceFile, string externalParts = null, bool ValidateReference(referenceFile); - Console.WriteLine($"Adding reference to {referenceFile} with external parts {externalParts} and SuppressMissingDependenciesErrors {suppressErrorsForMissingDependencies}"); + _console.WriteLine($"Adding reference to {referenceFile} with external parts {externalParts} and SuppressMissingDependenciesErrors {suppressErrorsForMissingDependencies}"); Model.AddReference(referenceFile, externalParts, suppressErrorsForMissingDependencies); } @@ -76,7 +82,7 @@ public bool AddInputFile(FileInfo inputFile) return true; } - Console.WriteLine($"Adding {inputFile.FullName} to the model"); + _console.WriteLine($"Adding {inputFile.FullName} to the model"); try { @@ -86,7 +92,7 @@ public bool AddInputFile(FileInfo inputFile) } catch (DacModelException dex) { - Console.WriteLine(dex.Format(inputFile.Name)); + _console.WriteLine(dex.Format(inputFile.Name)); return false; } } @@ -114,7 +120,7 @@ public bool ValidateModel() if (modelError.Severity == ModelErrorSeverity.Error) { validationErrors++; - Console.WriteLine(modelError.GetOutputMessage(modelError.Severity)); + _console.WriteLine(modelError.GetOutputMessage(modelError.Severity)); } else if (modelError.Severity == ModelErrorSeverity.Warning) { @@ -122,14 +128,14 @@ public bool ValidateModel() } else { - Console.WriteLine(modelError.GetOutputMessage(modelError.Severity)); + _console.WriteLine(modelError.GetOutputMessage(modelError.Severity)); } } if (validationErrors > 0) { _modelValid = false; - Console.WriteLine($"Found {validationErrors} error(s), skip building package"); + _console.WriteLine($"Found {validationErrors} error(s), skip building package"); } else { @@ -151,7 +157,7 @@ void ProcessWarning(ModelValidationError modelError) validationErrors++; } - Console.WriteLine(modelError.GetOutputMessage(TreatTSqlWarningsAsErrors + _console.WriteLine(modelError.GetOutputMessage(TreatTSqlWarningsAsErrors ? ModelErrorSeverity.Error : ModelErrorSeverity.Warning)); } @@ -168,11 +174,11 @@ public void SaveToDisk(FileInfo outputFile, PackageOptions packageOptions = null if (outputFile.Exists) { // Delete the existing file - Console.WriteLine($"Deleting existing file {outputFile.FullName}"); + _console.WriteLine($"Deleting existing file {outputFile.FullName}"); outputFile.Delete(); } - Console.WriteLine($"Writing model to {outputFile.FullName}"); + _console.WriteLine($"Writing model to {outputFile.FullName}"); DacPackageExtensions.BuildPackage(outputFile.FullName, Model, Metadata, packageOptions ?? new PackageOptions { }); } @@ -184,7 +190,7 @@ public void SetMetadata(string name, string version) Version = version, }; - Console.WriteLine($"Using package name {name} and version {version}"); + _console.WriteLine($"Using package name {name} and version {version}"); } public void SetProperty(string key, string value) @@ -269,7 +275,7 @@ public void SetProperty(string key, string value) PropertyInfo property = typeof(TSqlModelOptions).GetProperty(key, BindingFlags.Public | BindingFlags.Instance); property.SetValue(Options, propertyValue); - Console.WriteLine($"Setting property {key} to value {value}"); + _console.WriteLine($"Setting property {key} to value {value}"); } catch (FormatException) { @@ -331,7 +337,7 @@ private void AddScript(FileInfo script, FileInfo outputFile, string path) using (var package = Package.Open(outputFile.FullName, FileMode.Open, FileAccess.ReadWrite)) { - Console.WriteLine($"Adding {script.FullName} to package"); + _console.WriteLine($"Adding {script.FullName} to package"); WritePart(script, package, path); package.Close(); @@ -399,7 +405,7 @@ public void GenerateCreateScript(FileInfo dacpacFile, string databaseName, DacDe } var scriptFileName = $"{databaseName}_Create.sql"; - Console.WriteLine($"Generating create script {scriptFileName}"); + _console.WriteLine($"Generating create script {scriptFileName}"); using var package = DacPackage.Load(dacpacFile.FullName); using var file = File.Create(Path.Combine(dacpacFile.DirectoryName, scriptFileName)); diff --git a/src/DacpacTool/Program.cs b/src/DacpacTool/Program.cs index 2eed699b..1cb572db 100644 --- a/src/DacpacTool/Program.cs +++ b/src/DacpacTool/Program.cs @@ -86,7 +86,7 @@ private static int BuildDacpac(BuildOptions options) WaitForDebuggerToAttach(options); // Set metadata for the package - using var packageBuilder = new PackageBuilder(); + using var packageBuilder = new PackageBuilder(new ActualConsole()); packageBuilder.SetMetadata(options.Name, options.Version); // Set properties on the model (if defined) diff --git a/test/DacpacTool.Tests/PackageBuilderTests.cs b/test/DacpacTool.Tests/PackageBuilderTests.cs index 1e81de28..84338f04 100644 --- a/test/DacpacTool.Tests/PackageBuilderTests.cs +++ b/test/DacpacTool.Tests/PackageBuilderTests.cs @@ -18,7 +18,7 @@ public class PackageBuilderTest public void UsingVersion() { // Arrange - var packageBuilder = new PackageBuilder(); + var packageBuilder = new PackageBuilder(new TestConsole()); // Act packageBuilder.UsingVersion(SqlServerVersion.Sql150); @@ -31,7 +31,7 @@ public void UsingVersion() public void AddInputFile_FileDoesNotExist() { // Arrange - var packageBuilder = new PackageBuilder(); + var packageBuilder = new PackageBuilder(new TestConsole()); packageBuilder.UsingVersion(SqlServerVersion.Sql150); // Act @@ -42,7 +42,7 @@ public void AddInputFile_FileDoesNotExist() public void AddInputFile_FileExists() { // Arrange - var packageBuilder = new PackageBuilder(); + var packageBuilder = new PackageBuilder(new TestConsole()); packageBuilder.UsingVersion(SqlServerVersion.Sql150); // Act @@ -57,21 +57,25 @@ public void AddInputFile_FileExists() public void AddInputFile_FileExists_WithInvalidSyntax() { // Arrange - var packageBuilder = new PackageBuilder(); + var console = new TestConsole(); + var packageBuilder = new PackageBuilder(console); packageBuilder.UsingVersion(SqlServerVersion.Sql150); // Act var result = packageBuilder.AddInputFile(new FileInfo("../../../../TestProjectWithExceptions/Tables/MyTable.sql")); + result = packageBuilder.AddInputFile(new FileInfo("../../../../TestProjectWithExceptions/Tables/MyTable2.sql")); // Assert result.ShouldBe(false); + console.Lines.Count.ShouldBe(5); + console.Lines[4].ShouldBe("MyTable2.sql(1,1): Error SQL71006: Only one statement is allowed per batch. A batch separator, such as 'GO', might be required between statements."); } [TestMethod] public void AddReference_FileDoesNotExist() { // Arrange - var packageBuilder = new PackageBuilder(); + var packageBuilder = new PackageBuilder(new TestConsole()); packageBuilder.UsingVersion(SqlServerVersion.Sql150); // Act & Assert @@ -87,7 +91,7 @@ public void AddReference_FileIsNotDacpac() .AddStoredProcedure("MyStoredProcedure", "SELECT 1;") .SaveAsPackage(".dll"); - var packageBuilder = new PackageBuilder(); + var packageBuilder = new PackageBuilder(new TestConsole()); packageBuilder.UsingVersion(SqlServerVersion.Sql150); // Act & Assert @@ -105,7 +109,7 @@ public void AddReference_FileExists() var reference = new TestModelBuilder() .AddStoredProcedure("MyStoredProcedure", "SELECT 1;") .SaveAsPackage(); - var packageBuilder = new PackageBuilder(); + var packageBuilder = new PackageBuilder(new TestConsole()); packageBuilder.UsingVersion(SqlServerVersion.Sql150); // Act @@ -125,7 +129,7 @@ public void AddReference_DifferentDatabase() var reference = new TestModelBuilder() .AddStoredProcedure("MyStoredProcedure", "SELECT 1;") .SaveAsPackage(); - var packageBuilder = new PackageBuilder(); + var packageBuilder = new PackageBuilder(new TestConsole()); packageBuilder.UsingVersion(SqlServerVersion.Sql150); // Act @@ -152,7 +156,7 @@ public void AddReference_CircularReferenceCanLoadWhenSuppressed() model1.AddReference(model2File, "Model2", true); model1.AddView("View1", "SELECT Col2 FROM [Model2].[dbo].[Table2]"); var model1File = model1.SaveAsPackage(); - var packageBuilder = new PackageBuilder(); + var packageBuilder = new PackageBuilder(new TestConsole()); packageBuilder.UsingVersion(SqlServerVersion.Sql150); // Act @@ -180,7 +184,7 @@ public void AddReference_CircularReferenceThrowsWhenNotSuppressed() model1.AddReference(model2File, "Model2", false); model1.AddView("View1", "SELECT Col2 FROM [Model2].[dbo].[Table2]"); var model1File = model1.SaveAsPackage(); - var packageBuilder = new PackageBuilder(); + var packageBuilder = new PackageBuilder(new TestConsole()); packageBuilder.UsingVersion(SqlServerVersion.Sql150); // Act @@ -204,7 +208,7 @@ public void AddSqlCmdvariable() var first = "DbReader"; var second = "DbWriter"; var tempFile = new FileInfo(Path.GetTempFileName()); - var packageBuilder = new PackageBuilder(); + var packageBuilder = new PackageBuilder(new TestConsole()); packageBuilder.SetMetadata("MyPackage", "1.0.0.0"); packageBuilder.UsingVersion(SqlServerVersion.Sql150); @@ -243,7 +247,7 @@ public void AddSqlCmdvariableWithDefaultValue() var first = "DbReader=dbReaderValue"; var second = "DbWriter=dbWriterValue"; var tempFile = new FileInfo(Path.GetTempFileName()); - var packageBuilder = new PackageBuilder(); + var packageBuilder = new PackageBuilder(new TestConsole()); packageBuilder.SetMetadata("MyPackage", "1.0.0.0"); packageBuilder.UsingVersion(SqlServerVersion.Sql150); @@ -280,7 +284,7 @@ public void AddPreDeployment_FilesExist() { // Arrange var tempFile = new FileInfo(Path.GetTempFileName()); - var packageBuilder = new PackageBuilder(); + var packageBuilder = new PackageBuilder(new TestConsole()); packageBuilder.SetMetadata("MyPackage", "1.0.0.0"); packageBuilder.UsingVersion(SqlServerVersion.Sql150); packageBuilder.ValidateModel(); @@ -325,7 +329,7 @@ public void AddPreDeployment_NoFilePresent() { // Arrange var tempFile = new FileInfo(Path.GetTempFileName()); - var packageBuilder = new PackageBuilder(); + var packageBuilder = new PackageBuilder(new TestConsole()); packageBuilder.SetMetadata("MyPackage", "1.0.0.0"); packageBuilder.UsingVersion(SqlServerVersion.Sql150); packageBuilder.ValidateModel(); @@ -359,7 +363,7 @@ public void AddPostDeployment_NoFilePresent() { // Arrange var tempFile = new FileInfo(Path.GetTempFileName()); - var packageBuilder = new PackageBuilder(); + var packageBuilder = new PackageBuilder(new TestConsole()); packageBuilder.SetMetadata("MyPackage", "1.0.0.0"); packageBuilder.UsingVersion(SqlServerVersion.Sql150); packageBuilder.ValidateModel(); @@ -388,7 +392,7 @@ public void AddRefactorLog_NoFilePresent() { // Arrange var tempFile = new FileInfo(Path.GetTempFileName()); - var packageBuilder = new PackageBuilder(); + var packageBuilder = new PackageBuilder(new TestConsole()); packageBuilder.SetMetadata("MyPackage", "1.0.0.0"); packageBuilder.UsingVersion(SqlServerVersion.Sql150); packageBuilder.ValidateModel(); @@ -414,7 +418,7 @@ public void AddPreDeployment_WrongOrder() { // Arrange var tempFile = new FileInfo(Path.GetTempFileName()); - var packageBuilder = new PackageBuilder(); + var packageBuilder = new PackageBuilder(new TestConsole()); packageBuilder.SetMetadata("MyPackage", "1.0.0.0"); packageBuilder.UsingVersion(SqlServerVersion.Sql150); @@ -428,7 +432,7 @@ public void AddPostDeployment_WrongOrder() { // Arrange var tempFile = new FileInfo(Path.GetTempFileName()); - var packageBuilder = new PackageBuilder(); + var packageBuilder = new PackageBuilder(new TestConsole()); packageBuilder.SetMetadata("MyPackage", "1.0.0.0"); packageBuilder.UsingVersion(SqlServerVersion.Sql150); @@ -442,7 +446,7 @@ public void AddPrePostDeployment_PreNotExists() { // Arrange var tempFile = new FileInfo(Path.GetTempFileName()); - var packageBuilder = new PackageBuilder(); + var packageBuilder = new PackageBuilder(new TestConsole()); packageBuilder.SetMetadata("MyPackage", "1.0.0.0"); packageBuilder.UsingVersion(SqlServerVersion.Sql150); packageBuilder.ValidateModel(); @@ -462,7 +466,7 @@ public void AddPostDeployment_PostNotExists() { // Arrange var tempFile = new FileInfo(Path.GetTempFileName()); - var packageBuilder = new PackageBuilder(); + var packageBuilder = new PackageBuilder(new TestConsole()); packageBuilder.SetMetadata("MyPackage", "1.0.0.0"); packageBuilder.UsingVersion(SqlServerVersion.Sql150); packageBuilder.ValidateModel(); @@ -482,7 +486,7 @@ public void AddRefactorLog_RefactorNotExists() { // Arrange var tempFile = new FileInfo(Path.GetTempFileName()); - var packageBuilder = new PackageBuilder(); + var packageBuilder = new PackageBuilder(new TestConsole()); packageBuilder.SetMetadata("MyPackage", "1.0.0.0"); packageBuilder.UsingVersion(SqlServerVersion.Sql150); packageBuilder.ValidateModel(); @@ -499,7 +503,7 @@ public void AddRefactorLog_RefactorNotExists() public void SetProperty_Valid(PropertyInfo property, string value, object expected) { // Arrange - var packageBuilder = new PackageBuilder(); + var packageBuilder = new PackageBuilder(new TestConsole()); // Act packageBuilder.SetProperty(property.Name, value); @@ -512,7 +516,7 @@ public void SetProperty_Valid(PropertyInfo property, string value, object expect public void SetProperty_UnknownProperty() { // Arrange - var packageBuilder = new PackageBuilder(); + var packageBuilder = new PackageBuilder(new TestConsole()); // Act & Assert Should.Throw(() => packageBuilder.SetProperty("MyUnknownProperty", "MyValue")); @@ -522,7 +526,7 @@ public void SetProperty_UnknownProperty() public void SetProperty_InvalidValue() { // Arrange - var packageBuilder = new PackageBuilder(); + var packageBuilder = new PackageBuilder(new TestConsole()); // Act Should.Throw(() => packageBuilder.SetProperty("QueryStoreIntervalLength", "MyFancyText")); @@ -532,7 +536,7 @@ public void SetProperty_InvalidValue() public void SetMetadata() { // Arrange - var packageBuilder = new PackageBuilder(); + var packageBuilder = new PackageBuilder(new TestConsole()); // Act packageBuilder.SetMetadata("MyPackage", "1.0.0.0"); @@ -546,7 +550,7 @@ public void SetMetadata() public void ValidateModel_ValidModel() { // Arrange - var packageBuilder = new PackageBuilder(); + var packageBuilder = new PackageBuilder(new TestConsole()); packageBuilder.UsingVersion(SqlServerVersion.Sql150); packageBuilder.SetMetadata("MyPackage", "1.0.0.0"); packageBuilder.Model.AddObjects("CREATE PROCEDURE [csp_Test] AS BEGIN SELECT 1 END"); @@ -562,7 +566,7 @@ public void ValidateModel_ValidModel() public void ValidateModel_Warnings() { // Arrange - var packageBuilder = new PackageBuilder(); + var packageBuilder = new PackageBuilder(new TestConsole()); packageBuilder.UsingVersion(SqlServerVersion.Sql150); packageBuilder.SetMetadata("MyPackage", "1.0.0.0"); packageBuilder.Model.AddObjects("CREATE PROCEDURE [csp_Test] AS BEGIN SELECT * FROM [dbo].[MyTable] END"); @@ -578,7 +582,7 @@ public void ValidateModel_Warnings() public void ValidateModel_WarningsAsErrors() { // Arrange - var packageBuilder = new PackageBuilder(); + var packageBuilder = new PackageBuilder(new TestConsole()); packageBuilder.UsingVersion(SqlServerVersion.Sql150); packageBuilder.TreatTSqlWarningsAsErrors = true; packageBuilder.SetMetadata("MyPackage", "1.0.0.0"); @@ -596,7 +600,7 @@ public void ValidateModel_WarningsAsErrors() public void ValidateModel_WarningsAsErrorsSuppressGlobal() { // Arrange - var packageBuilder = new PackageBuilder(); + var packageBuilder = new PackageBuilder(new TestConsole()); packageBuilder.UsingVersion(SqlServerVersion.Sql150); packageBuilder.TreatTSqlWarningsAsErrors = true; packageBuilder.AddWarningsToSuppress("71502"); @@ -614,7 +618,7 @@ public void ValidateModel_WarningsAsErrorsSuppressGlobal() public void ValidateModel_WarningsAsErrorsSuppressSpecific() { // Arrange - var packageBuilder = new PackageBuilder(); + var packageBuilder = new PackageBuilder(new TestConsole()); packageBuilder.UsingVersion(SqlServerVersion.Sql150); packageBuilder.TreatTSqlWarningsAsErrors = true; packageBuilder.SetMetadata("MyPackage", "1.0.0.0"); @@ -636,7 +640,7 @@ public void ValidateModel_WarningsAsErrorsSuppressSpecific() public void ValidateModel_Errors() { // Arrange - var packageBuilder = new PackageBuilder(); + var packageBuilder = new PackageBuilder(new TestConsole()); packageBuilder.UsingVersion(SqlServerVersion.Sql150); packageBuilder.SetMetadata("MyPackage", "1.0.0.0"); packageBuilder.Model.AddObjects("CREATE PROCEDURE [csp_Test] @p_Parameter [dbo].[CustomType] AS BEGIN SELECT 1 END"); @@ -653,7 +657,7 @@ public void SaveToFile() { // Arrange var tempFile = new FileInfo(Path.GetTempFileName()); - var packageBuilder = new PackageBuilder(); + var packageBuilder = new PackageBuilder(new TestConsole()); packageBuilder.UsingVersion(SqlServerVersion.Sql150); packageBuilder.SetMetadata("MyPackage", "1.0.0.0"); packageBuilder.ValidateModel(); @@ -675,7 +679,7 @@ public void GenerateCreateScript_Name() var packageName = "MyPackage"; var tempFile = new FileInfo(Path.GetTempFileName()); - var packageBuilder = new PackageBuilder(); + var packageBuilder = new PackageBuilder(new TestConsole()); packageBuilder.UsingVersion(SqlServerVersion.Sql150); packageBuilder.SetMetadata(packageName, "1.0.0.0"); packageBuilder.ValidateModel(); @@ -707,7 +711,7 @@ public void GenerateCreateScript_ShouldNotModifyDeployOptions() .SaveAsPackage(); var tempFile = new FileInfo(Path.GetTempFileName()); - var packageBuilder = new PackageBuilder(); + var packageBuilder = new PackageBuilder(new TestConsole()); packageBuilder.UsingVersion(SqlServerVersion.Sql150); packageBuilder.SetMetadata(packageName, "1.0.0.0"); packageBuilder.AddReference(firstReference); @@ -748,7 +752,7 @@ public void GenerateCreateScript_NoName() { // Arrange var tempFile = new FileInfo(Path.GetTempFileName()); - var packageBuilder = new PackageBuilder(); + var packageBuilder = new PackageBuilder(new TestConsole()); packageBuilder.UsingVersion(SqlServerVersion.Sql150); packageBuilder.SetMetadata(null, "1.0.0.0"); packageBuilder.ValidateModel(); From 299ac9f97e291efd0f2c5d64ee4dee378c63ce12 Mon Sep 17 00:00:00 2001 From: Erik Ejlskov Jensen Date: Fri, 2 Aug 2024 08:43:37 +0200 Subject: [PATCH 3/6] fix pipeline see https://learn.microsoft.com/en-us/troubleshoot/sql/releases/sqlserver-2019/cumulativeupdate28#3217207 --- .github/workflows/main.yml | 2 +- global.json | 7 +++++++ 2 files changed, 8 insertions(+), 1 deletion(-) create mode 100644 global.json diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index e2dc0584..6ed53277 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -267,7 +267,7 @@ jobs: ports: - 1433:1433 options: >- - --health-cmd "/opt/mssql-tools/bin/sqlcmd -S localhost -U sa -P 'JdMsKZPBBA8kVFXVrj8d' -Q 'SELECT 1' || exit 1" + --health-cmd "/opt/mssql-tools18/bin/sqlcmd -S localhost -U sa -P 'JdMsKZPBBA8kVFXVrj8d' -Q 'SELECT 1' || exit 1" --health-interval 10s --health-timeout 3s --health-retries 10 diff --git a/global.json b/global.json new file mode 100644 index 00000000..b331eb50 --- /dev/null +++ b/global.json @@ -0,0 +1,7 @@ +{ + "sdk": { + "version": "8.0.303", + "allowPrerelease": false, + "rollForward": "disable" + } +} From 3cb30cf827535ff5e24f12bf83e20e6462f1058d Mon Sep 17 00:00:00 2001 From: Erik Ejlskov Jensen Date: Fri, 2 Aug 2024 09:06:39 +0200 Subject: [PATCH 4/6] actually update the tools --- .github/workflows/main.yml | 2 +- global.json | 7 ------- 2 files changed, 1 insertion(+), 8 deletions(-) delete mode 100644 global.json diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 6ed53277..1bd775c3 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -214,7 +214,7 @@ jobs: ports: - 1433:1433 options: >- - --health-cmd "/opt/mssql-tools/bin/sqlcmd -S localhost -U sa -P 'JdMsKZPBBA8kVFXVrj8d' -Q 'SELECT 1' || exit 1" + --health-cmd "/opt/mssql-tools18/bin/sqlcmd -S localhost -U sa -P 'JdMsKZPBBA8kVFXVrj8d' -Q 'SELECT 1' || exit 1" --health-interval 10s --health-timeout 3s --health-retries 10 diff --git a/global.json b/global.json deleted file mode 100644 index b331eb50..00000000 --- a/global.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "sdk": { - "version": "8.0.303", - "allowPrerelease": false, - "rollForward": "disable" - } -} From e69968feed43ca0e6996411978214d54faa0a6a9 Mon Sep 17 00:00:00 2001 From: Erik Ejlskov Jensen Date: Fri, 2 Aug 2024 09:20:56 +0200 Subject: [PATCH 5/6] Another attempt --- .github/workflows/main.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 1bd775c3..87d52129 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -214,7 +214,7 @@ jobs: ports: - 1433:1433 options: >- - --health-cmd "/opt/mssql-tools18/bin/sqlcmd -S localhost -U sa -P 'JdMsKZPBBA8kVFXVrj8d' -Q 'SELECT 1' || exit 1" + --health-cmd "/opt/mssql-tools18/bin/sqlcmd -C -S localhost -U sa -P 'JdMsKZPBBA8kVFXVrj8d' -Q 'SELECT 1' || exit 1" --health-interval 10s --health-timeout 3s --health-retries 10 @@ -267,7 +267,7 @@ jobs: ports: - 1433:1433 options: >- - --health-cmd "/opt/mssql-tools18/bin/sqlcmd -S localhost -U sa -P 'JdMsKZPBBA8kVFXVrj8d' -Q 'SELECT 1' || exit 1" + --health-cmd "/opt/mssql-tools18/bin/sqlcmd -C -S localhost -U sa -P 'JdMsKZPBBA8kVFXVrj8d' -Q 'SELECT 1' || exit 1" --health-interval 10s --health-timeout 3s --health-retries 10 From 387a26989baa6739b3869cccc2e2968afa0bf5da Mon Sep 17 00:00:00 2001 From: Erik Ejlskov Jensen Date: Fri, 2 Aug 2024 09:29:25 +0200 Subject: [PATCH 6/6] add comment to scripts --- test/TestProjectWithExceptions/Tables/MyTable.sql | 1 + test/TestProjectWithExceptions/Tables/MyTable2.sql | 1 + 2 files changed, 2 insertions(+) diff --git a/test/TestProjectWithExceptions/Tables/MyTable.sql b/test/TestProjectWithExceptions/Tables/MyTable.sql index 4cfdc870..ab4901dc 100644 --- a/test/TestProjectWithExceptions/Tables/MyTable.sql +++ b/test/TestProjectWithExceptions/Tables/MyTable.sql @@ -1,3 +1,4 @@ +-- This file has deliberate errors (a GO is missing) CREATE TABLE [dbo].[MyTable] ( Column1 nvarchar(100), diff --git a/test/TestProjectWithExceptions/Tables/MyTable2.sql b/test/TestProjectWithExceptions/Tables/MyTable2.sql index 0b84715d..9fb97217 100644 --- a/test/TestProjectWithExceptions/Tables/MyTable2.sql +++ b/test/TestProjectWithExceptions/Tables/MyTable2.sql @@ -1,3 +1,4 @@ +-- This file has deliberate errors (a GO is missing) CREATE TABLE [dbo].[MyTable2] ( Column1 nvarchar(100),