From bece6c4f37e81b340229943e5af5bbeb2b474da7 Mon Sep 17 00:00:00 2001 From: Pascal Berger Date: Fri, 31 Jul 2020 21:51:29 +0200 Subject: [PATCH] (GH-188) Add IIssue.FileLink and pass FileLink settings to issue providers (#192) * (GH-188) Add possibility to pass file link settings while reading issues * (GH-188) Add IIssue.FileLink --- .../BaseIssueProviderFixture.cs | 10 +- .../FakeConfigurableIssueProvider.cs | 2 +- src/Cake.Issues.Testing/FakeIssueProvider.cs | 2 +- src/Cake.Issues.Testing/IssueChecker.cs | 10 + .../BaseMultiFormatIssueProviderTests.cs | 2 +- src/Cake.Issues.Tests/IIssueComparerTests.cs | 140 ++++++++++ .../IIssueExtensionsTests.cs | 2 + src/Cake.Issues.Tests/IssueBuilderTests.cs | 32 +++ src/Cake.Issues.Tests/IssueReaderTests.cs | 53 ++++ src/Cake.Issues.Tests/IssueTests.cs | 239 ++++++++++++++++++ .../IssueSerializationExtensionsTests.cs | 116 +++++++++ ...seConfigurableIssueProviderFixtureTests.cs | 6 +- .../Testing/BaseIssueProviderFixtureTests.cs | 6 +- ...aseMultiFormatIssueProviderFixtureTests.cs | 6 +- .../Testing/IssueCheckerFixture.cs | 4 + .../Testing/IssueCheckerTests.cs | 61 +++++ src/Cake.Issues/BaseIssueProvider.cs | 7 +- .../BaseMultiFormatIssueProvider.cs | 2 +- src/Cake.Issues/IIssue.cs | 6 + src/Cake.Issues/IIssueComparer.cs | 5 + src/Cake.Issues/IIssueExtensions.cs | 5 + src/Cake.Issues/IIssueProvider.cs | 2 +- src/Cake.Issues/IReadIssuesSettings.cs | 5 + src/Cake.Issues/Issue.cs | 7 + src/Cake.Issues/IssueBuilder.cs | 16 ++ src/Cake.Issues/IssuesReader.cs | 10 +- src/Cake.Issues/ReadIssuesSettings.cs | 3 + .../IssueSerializationExtensions.cs | 1 + .../SerializableIssueExtensions.cs | 1 + .../SerializableIssueV2Extensions.cs | 1 + .../Serialization/SerializableIssueV3.cs | 4 + .../SerializableIssueV3Extensions.cs | 7 + 32 files changed, 750 insertions(+), 23 deletions(-) diff --git a/src/Cake.Issues.Testing/BaseIssueProviderFixture.cs b/src/Cake.Issues.Testing/BaseIssueProviderFixture.cs index c71f7f198..69b1799ac 100644 --- a/src/Cake.Issues.Testing/BaseIssueProviderFixture.cs +++ b/src/Cake.Issues.Testing/BaseIssueProviderFixture.cs @@ -19,7 +19,7 @@ public abstract class BaseIssueProviderFixture protected BaseIssueProviderFixture() { this.Log = new FakeLog { Verbosity = Verbosity.Normal }; - this.RepositorySettings = new RepositorySettings(@"c:\repo"); + this.ReadIssuesSettings = new ReadIssuesSettings(@"c:\repo"); } /// @@ -30,7 +30,7 @@ protected BaseIssueProviderFixture() /// /// Gets or sets the repository settings. /// - public RepositorySettings RepositorySettings { get; set; } + public ReadIssuesSettings ReadIssuesSettings { get; set; } /// /// Calls . @@ -67,12 +67,12 @@ private T CreateIssueProvider() typeof(T), this.GetCreateIssueProviderArguments().ToArray()); - if (this.RepositorySettings == null) + if (this.ReadIssuesSettings == null) { - throw new InvalidOperationException("No repository settings set."); + throw new InvalidOperationException("No settings for reading issues set."); } - provider.Initialize(this.RepositorySettings); + provider.Initialize(this.ReadIssuesSettings); return provider; } } diff --git a/src/Cake.Issues.Testing/FakeConfigurableIssueProvider.cs b/src/Cake.Issues.Testing/FakeConfigurableIssueProvider.cs index 4330764da..dde9af839 100644 --- a/src/Cake.Issues.Testing/FakeConfigurableIssueProvider.cs +++ b/src/Cake.Issues.Testing/FakeConfigurableIssueProvider.cs @@ -59,7 +59,7 @@ public FakeConfigurableIssueProvider( public override string ProviderName => "Fake Issue Provider"; /// - protected override IEnumerable InternalReadIssues() + protected override IEnumerable InternalReadIssues(FileLinkSettings fileLinkSettings) { return this.issues; } diff --git a/src/Cake.Issues.Testing/FakeIssueProvider.cs b/src/Cake.Issues.Testing/FakeIssueProvider.cs index ae83e6481..6aefc7f5b 100644 --- a/src/Cake.Issues.Testing/FakeIssueProvider.cs +++ b/src/Cake.Issues.Testing/FakeIssueProvider.cs @@ -48,7 +48,7 @@ public FakeIssueProvider(ICakeLog log, IEnumerable issues) public override string ProviderName => "Fake Issue Provider"; /// - protected override IEnumerable InternalReadIssues() + protected override IEnumerable InternalReadIssues(FileLinkSettings fileLinkSettings) { return this.issues; } diff --git a/src/Cake.Issues.Testing/IssueChecker.cs b/src/Cake.Issues.Testing/IssueChecker.cs index 9f5007d93..49a4b26a6 100644 --- a/src/Cake.Issues.Testing/IssueChecker.cs +++ b/src/Cake.Issues.Testing/IssueChecker.cs @@ -50,6 +50,7 @@ public static void Check( expectedIssue.EndLine, expectedIssue.Column, expectedIssue.EndColumn, + expectedIssue.FileLink, expectedIssue.MessageText, expectedIssue.MessageHtml, expectedIssue.MessageMarkdown, @@ -81,6 +82,8 @@ public static void Check( /// null if the issue is not expected to be related to a file or specific column. /// Expected end of column range. /// null if the issue is not expected to be related to a file, specific column or range of columns. + /// Expected file link. + /// null if the issue is not expected to have a file link. /// Expected message in plain text format. /// Expected message in HTML format. /// Expected message in Markdown format. @@ -105,6 +108,7 @@ public static void Check( int? endLine, int? column, int? endColumn, + Uri fileLink, string messageText, string messageHtml, string messageMarkdown, @@ -215,6 +219,12 @@ public static void Check( $"Expected issue.EndColumn to be '{endColumn}' but was '{issue.EndColumn}'."); } + if (issue.FileLink?.ToString() != fileLink?.ToString()) + { + throw new Exception( + $"Expected issue.FileLink to be '{fileLink}' but was '{issue.FileLink}'."); + } + if (issue.MessageText != messageText) { throw new Exception( diff --git a/src/Cake.Issues.Tests/BaseMultiFormatIssueProviderTests.cs b/src/Cake.Issues.Tests/BaseMultiFormatIssueProviderTests.cs index f446e83d8..af78a89b0 100644 --- a/src/Cake.Issues.Tests/BaseMultiFormatIssueProviderTests.cs +++ b/src/Cake.Issues.Tests/BaseMultiFormatIssueProviderTests.cs @@ -110,7 +110,7 @@ public void Should_Read_Issues_From_Format() "Foo".ToByteArray(), format); var provider = new FakeMultiFormatIssueProvider(log, settings); - provider.Initialize(new RepositorySettings(@"c:\repo")); + provider.Initialize(new ReadIssuesSettings(@"c:\repo")); // When var result = provider.ReadIssues(); diff --git a/src/Cake.Issues.Tests/IIssueComparerTests.cs b/src/Cake.Issues.Tests/IIssueComparerTests.cs index 1f76e7eea..ab0f7ed2c 100644 --- a/src/Cake.Issues.Tests/IIssueComparerTests.cs +++ b/src/Cake.Issues.Tests/IIssueComparerTests.cs @@ -155,6 +155,41 @@ public void Should_Return_False_If_Column_Is_Different(int? column1, int? column CompareIssues(issue1, issue2, false); } + [Theory] + [InlineData("http://foo", "http://bar")] + [InlineData("http://foo", null)] + [InlineData(null, "http://foo")] + public void Should_Return_False_If_FileLink_Is_Different(string fileLink1, string fileLink2) + { + // Given + var issueBuilder = + IssueBuilder + .NewIssue("message", "providerType", "providerName"); + if (!string.IsNullOrEmpty(fileLink1)) + { + issueBuilder = + issueBuilder + .WithFileLink(new Uri(fileLink1)); + } + + var issue1 = issueBuilder.Create(); + + issueBuilder = + IssueBuilder + .NewIssue("message", "providerType", "providerName"); + if (!string.IsNullOrEmpty(fileLink2)) + { + issueBuilder = + issueBuilder + .WithFileLink(new Uri(fileLink2)); + } + + var issue2 = issueBuilder.Create(); + + // When / Then + CompareIssues(issue1, issue2, false); + } + [Fact] public void Should_Return_False_If_MessageText_Is_Different() { @@ -532,6 +567,41 @@ public void Should_Return_True_If_Column_Is_Same(int? column1, int? column2) CompareIssues(issue1, issue2, true); } + [Theory] + [InlineData("http://foo", "http://foo")] + [InlineData("http://foo", "http://Foo")] + [InlineData(null, null)] + public void Should_Return_True_If_FileLink_Is_Same(string fileLink1, string fileLink2) + { + // Given + var issueBuilder = + IssueBuilder + .NewIssue("message", "providerType", "providerName"); + if (!string.IsNullOrEmpty(fileLink1)) + { + issueBuilder = + issueBuilder + .WithFileLink(new Uri(fileLink1)); + } + + var issue1 = issueBuilder.Create(); + + issueBuilder = + IssueBuilder + .NewIssue("message", "providerType", "providerName"); + if (!string.IsNullOrEmpty(fileLink2)) + { + issueBuilder = + issueBuilder + .WithFileLink(new Uri(fileLink2)); + } + + var issue2 = issueBuilder.Create(); + + // When / Then + CompareIssues(issue1, issue2, true); + } + [Fact] public void Should_Return_True_If_MessageText_Is_Same() { @@ -1322,6 +1392,76 @@ public void Should_Return_True_If_Column_Is_Same(int? column1, int? column2) CompareIssues(issue1, issue2, true); } + [Theory] + [InlineData("http://foo", "http://bar")] + [InlineData("http://foo", null)] + [InlineData(null, "http://foo")] + public void Should_Return_True_If_FileLink_Is_Different(string fileLink1, string fileLink2) + { + // Given + var issueBuilder = + IssueBuilder + .NewIssue("message", "providerType", "providerName"); + if (!string.IsNullOrEmpty(fileLink1)) + { + issueBuilder = + issueBuilder + .WithFileLink(new Uri(fileLink1)); + } + + var issue1 = issueBuilder.Create(); + + issueBuilder = + IssueBuilder + .NewIssue("message", "providerType", "providerName"); + if (!string.IsNullOrEmpty(fileLink2)) + { + issueBuilder = + issueBuilder + .WithFileLink(new Uri(fileLink2)); + } + + var issue2 = issueBuilder.Create(); + + // When / Then + CompareIssues(issue1, issue2, true); + } + + [Theory] + [InlineData("http://foo", "http://foo")] + [InlineData("http://foo", "http://Foo")] + [InlineData(null, null)] + public void Should_Return_True_If_FileLink_Is_Same(string fileLink1, string fileLink2) + { + // Given + var issueBuilder = + IssueBuilder + .NewIssue("message", "providerType", "providerName"); + if (!string.IsNullOrEmpty(fileLink1)) + { + issueBuilder = + issueBuilder + .WithFileLink(new Uri(fileLink1)); + } + + var issue1 = issueBuilder.Create(); + + issueBuilder = + IssueBuilder + .NewIssue("message", "providerType", "providerName"); + if (!string.IsNullOrEmpty(fileLink2)) + { + issueBuilder = + issueBuilder + .WithFileLink(new Uri(fileLink2)); + } + + var issue2 = issueBuilder.Create(); + + // When / Then + CompareIssues(issue1, issue2, true); + } + [Fact] public void Should_Return_True_If_MessageText_Is_Same() { diff --git a/src/Cake.Issues.Tests/IIssueExtensionsTests.cs b/src/Cake.Issues.Tests/IIssueExtensionsTests.cs index fc1193e48..5cc79e071 100644 --- a/src/Cake.Issues.Tests/IIssueExtensionsTests.cs +++ b/src/Cake.Issues.Tests/IIssueExtensionsTests.cs @@ -311,6 +311,7 @@ public void Should_Throw_If_Issue_Is_Null() [InlineData("foo {EndLine} bar", "foo 420 bar")] [InlineData("foo {Column} bar", "foo 23 bar")] [InlineData("foo {EndColumn} bar", "foo 230 bar")] + [InlineData("foo {FileLink} bar", "foo https://github.com/myorg/myrepo/blob/develop/src/foo.cs#L10-L12 bar")] [InlineData("foo {Rule} bar", "foo Rule Foo bar")] [InlineData("foo {RuleUrl} bar", "foo https://google.com/ bar")] [InlineData("foo {MessageText} bar", "foo MessageText Foo bar")] @@ -327,6 +328,7 @@ public void Should_Replace_Tokens(string pattern, string expectedResult) .WithMessageInMarkdownFormat("MessageMarkdown Foo") .InFile(@"src/Cake.Issues/foo.cs", 42, 420, 23, 230) .InProject(@"src/Cake.Issues/Cake.Issues.csproj", "Cake.Issues") + .WithFileLink(new Uri("https://github.com/myorg/myrepo/blob/develop/src/foo.cs#L10-L12")) .OfRule("Rule Foo", new Uri("https://google.com")) .WithPriority(IssuePriority.Error) .Create(); diff --git a/src/Cake.Issues.Tests/IssueBuilderTests.cs b/src/Cake.Issues.Tests/IssueBuilderTests.cs index d5d36a99d..8ac9eec94 100644 --- a/src/Cake.Issues.Tests/IssueBuilderTests.cs +++ b/src/Cake.Issues.Tests/IssueBuilderTests.cs @@ -1604,6 +1604,38 @@ public void Should_Set_EndColumn(int endColumn) } } + public sealed class TheWithFileLinkMethod + { + [Fact] + public void Should_Throw_If_FileLink_Is_Null() + { + // Given + var fixture = new IssueBuilderFixture(); + Uri fileLink = null; + + // When + var result = Record.Exception(() => + fixture.IssueBuilder.WithFileLink(fileLink)); + + // Then + result.IsArgumentNullException("fileLink"); + } + + [Theory] + [InlineData("https://google.com/")] + public void Should_Set_FileLink(string fileLink) + { + // Given + var fixture = new IssueBuilderFixture(); + + // When + var issue = fixture.IssueBuilder.WithFileLink(new Uri(fileLink)).Create(); + + // Then + issue.FileLink.ToString().ShouldBe(fileLink); + } + } + public sealed class TheWithPriorityMethod { [Fact] diff --git a/src/Cake.Issues.Tests/IssueReaderTests.cs b/src/Cake.Issues.Tests/IssueReaderTests.cs index a75cb5093..76f5d0dc4 100644 --- a/src/Cake.Issues.Tests/IssueReaderTests.cs +++ b/src/Cake.Issues.Tests/IssueReaderTests.cs @@ -330,6 +330,59 @@ public void Should_Set_Run_Property() issues.ShouldContain(issue2); issue2.Run.ShouldBe(run); } + + [Fact] + public void Should_Set_FileLink_Property() + { + // Given + var filePath1 = @"src\Cake.Issues.Tests\Foo.cs"; + var line1 = 10; + var issue1 = + IssueBuilder + .NewIssue("Foo", "ProviderTypeFoo", "ProviderNameFoo") + .InFile(filePath1, line1) + .OfRule("Foo") + .WithPriority(IssuePriority.Warning) + .Create(); + var filePath2 = @"src\Cake.Issues.Tests\Bar.cs"; + var line2 = 12; + var issue2 = + IssueBuilder + .NewIssue("Bar", "ProviderTypeBar", "ProviderNameBar") + .InFile(filePath2, line2) + .OfRule("Bar") + .WithPriority(IssuePriority.Warning) + .Create(); + var fixture = new IssuesFixture(); + fixture.IssueProviders.Clear(); + fixture.IssueProviders.Add( + new FakeIssueProvider( + fixture.Log, + new List + { + issue1, + issue2, + })); + var repoUrl = "https://github.com/cake-contrib/Cake.Issues.Website"; + var branch = "develop"; + fixture.Settings.FileLinkSettings = + FileLinkSettings.GitHub( + new System.Uri(repoUrl), + branch, + null); + + // When + var issues = fixture.ReadIssues().ToList(); + + // Then + issues.Count.ShouldBe(2); + issues.ShouldContain(issue1); + issue1.FileLink.ToString() + .ShouldBe($"{repoUrl}/blob/{branch}/{filePath1.Replace(@"\", "/")}#L{line1}"); + issues.ShouldContain(issue2); + issue2.FileLink.ToString() + .ShouldBe($"{repoUrl}/blob/{branch}/{filePath2.Replace(@"\", "/")}#L{line2}"); + } } } } \ No newline at end of file diff --git a/src/Cake.Issues.Tests/IssueTests.cs b/src/Cake.Issues.Tests/IssueTests.cs index ee166c372..5286a4aeb 100644 --- a/src/Cake.Issues.Tests/IssueTests.cs +++ b/src/Cake.Issues.Tests/IssueTests.cs @@ -23,6 +23,7 @@ public void Should_Throw_If_Identifier_Is_Null() var endLine = 12; var column = 50; var endColumn = 55; + var fileLink = new Uri("https://github.com/myorg/myrepo/blob/develop/src/foo.cs#L10-L12"); var messageText = "MessageText"; var messageHtml = "MessageHtml"; var messageMarkdown = "MessageMarkdown"; @@ -45,6 +46,7 @@ public void Should_Throw_If_Identifier_Is_Null() endLine, column, endColumn, + fileLink, messageText, messageHtml, messageMarkdown, @@ -72,6 +74,7 @@ public void Should_Throw_If_Identifier_Is_Empty() var endLine = 12; var column = 50; var endColumn = 55; + var fileLink = new Uri("https://github.com/myorg/myrepo/blob/develop/src/foo.cs#L10-L12"); var messageText = "MessageText"; var messageHtml = "MessageHtml"; var messageMarkdown = "MessageMarkdown"; @@ -94,6 +97,7 @@ public void Should_Throw_If_Identifier_Is_Empty() endLine, column, endColumn, + fileLink, messageText, messageHtml, messageMarkdown, @@ -121,6 +125,7 @@ public void Should_Throw_If_Identifier_Is_WhiteSpace() var endLine = 12; var column = 50; var endColumn = 55; + var fileLink = new Uri("https://github.com/myorg/myrepo/blob/develop/src/foo.cs#L10-L12"); var messageText = "MessageText"; var messageHtml = "MessageHtml"; var messageMarkdown = "MessageMarkdown"; @@ -143,6 +148,7 @@ public void Should_Throw_If_Identifier_Is_WhiteSpace() endLine, column, endColumn, + fileLink, messageText, messageHtml, messageMarkdown, @@ -170,6 +176,7 @@ public void Should_Set_Identifier(string identifier) var endLine = 12; var column = 50; var endColumn = 55; + var fileLink = new Uri("https://github.com/myorg/myrepo/blob/develop/src/foo.cs#L10-L12"); var messageText = "MessageText"; var messageHtml = "MessageHtml"; var messageMarkdown = "MessageMarkdown"; @@ -192,6 +199,7 @@ public void Should_Set_Identifier(string identifier) endLine, column, endColumn, + fileLink, messageText, messageHtml, messageMarkdown, @@ -222,6 +230,7 @@ public void Should_Throw_If_Project_Path_Is_Invalid(string projectPath) var endLine = 12; var column = 50; var endColumn = 55; + var fileLink = new Uri("https://github.com/myorg/myrepo/blob/develop/src/foo.cs#L10-L12"); var messageText = "MessageText"; var messageHtml = "MessageHtml"; var messageMarkdown = "MessageMarkdown"; @@ -244,6 +253,7 @@ public void Should_Throw_If_Project_Path_Is_Invalid(string projectPath) endLine, column, endColumn, + fileLink, messageText, messageHtml, messageMarkdown, @@ -273,6 +283,7 @@ public void Should_Throw_If_File_Path_Is_Absolute(string projectPath) var endLine = 12; var column = 50; var endColumn = 55; + var fileLink = new Uri("https://github.com/myorg/myrepo/blob/develop/src/foo.cs#L10-L12"); var messageText = "MessageText"; var messageHtml = "MessageHtml"; var messageMarkdown = "MessageMarkdown"; @@ -295,6 +306,7 @@ public void Should_Throw_If_File_Path_Is_Absolute(string projectPath) endLine, column, endColumn, + fileLink, messageText, messageHtml, messageMarkdown, @@ -322,6 +334,7 @@ public void Should_Handle_Project_Paths_Which_Are_Null() var endLine = 12; var column = 50; var endColumn = 55; + var fileLink = new Uri("https://github.com/myorg/myrepo/blob/develop/src/foo.cs#L10-L12"); var messageText = "MessageText"; var messageHtml = "MessageHtml"; var messageMarkdown = "MessageMarkdown"; @@ -344,6 +357,7 @@ public void Should_Handle_Project_Paths_Which_Are_Null() endLine, column, endColumn, + fileLink, messageText, messageHtml, messageMarkdown, @@ -371,6 +385,7 @@ public void Should_Handle_Project_Paths_Which_Are_Empty() var endLine = 12; var column = 50; var endColumn = 55; + var fileLink = new Uri("https://github.com/myorg/myrepo/blob/develop/src/foo.cs#L10-L12"); var messageText = "MessageText"; var messageHtml = "MessageHtml"; var messageMarkdown = "MessageMarkdown"; @@ -393,6 +408,7 @@ public void Should_Handle_Project_Paths_Which_Are_Empty() endLine, column, endColumn, + fileLink, messageText, messageHtml, messageMarkdown, @@ -420,6 +436,7 @@ public void Should_Handle_Project_Paths_Which_Are_WhiteSpace() var endLine = 12; var column = 50; var endColumn = 55; + var fileLink = new Uri("https://github.com/myorg/myrepo/blob/develop/src/foo.cs#L10-L12"); var messageText = "MessageText"; var messageHtml = "MessageHtml"; var messageMarkdown = "MessageMarkdown"; @@ -442,6 +459,7 @@ public void Should_Handle_Project_Paths_Which_Are_WhiteSpace() endLine, column, endColumn, + fileLink, messageText, messageHtml, messageMarkdown, @@ -469,6 +487,7 @@ public void Should_Set_ProjectFileRelativePath(string projectPath) var endLine = 12; var column = 50; var endColumn = 55; + var fileLink = new Uri("https://github.com/myorg/myrepo/blob/develop/src/foo.cs#L10-L12"); var messageText = "MessageText"; var messageHtml = "MessageHtml"; var messageMarkdown = "MessageMarkdown"; @@ -491,6 +510,7 @@ public void Should_Set_ProjectFileRelativePath(string projectPath) endLine, column, endColumn, + fileLink, messageText, messageHtml, messageMarkdown, @@ -521,6 +541,7 @@ public void Should_Handle_Projects_Which_Are_Null() var endLine = 12; var column = 50; var endColumn = 55; + var fileLink = new Uri("https://github.com/myorg/myrepo/blob/develop/src/foo.cs#L10-L12"); var messageText = "MessageText"; var messageHtml = "MessageHtml"; var messageMarkdown = "MessageMarkdown"; @@ -543,6 +564,7 @@ public void Should_Handle_Projects_Which_Are_Null() endLine, column, endColumn, + fileLink, messageText, messageHtml, messageMarkdown, @@ -570,6 +592,7 @@ public void Should_Handle_Projects_Which_Are_Empty() var endLine = 12; var column = 50; var endColumn = 55; + var fileLink = new Uri("https://github.com/myorg/myrepo/blob/develop/src/foo.cs#L10-L12"); var messageText = "MessageText"; var messageHtml = "MessageHtml"; var messageMarkdown = "MessageMarkdown"; @@ -592,6 +615,7 @@ public void Should_Handle_Projects_Which_Are_Empty() endLine, column, endColumn, + fileLink, messageText, messageHtml, messageMarkdown, @@ -619,6 +643,7 @@ public void Should_Handle_Projects_Which_Are_WhiteSpace() var endLine = 12; var column = 50; var endColumn = 55; + var fileLink = new Uri("https://github.com/myorg/myrepo/blob/develop/src/foo.cs#L10-L12"); var messageText = "MessageText"; var messageHtml = "MessageHtml"; var messageMarkdown = "MessageMarkdown"; @@ -641,6 +666,7 @@ public void Should_Handle_Projects_Which_Are_WhiteSpace() endLine, column, endColumn, + fileLink, messageText, messageHtml, messageMarkdown, @@ -668,6 +694,7 @@ public void Should_Set_ProjectName(string projectName) var endLine = 12; var column = 50; var endColumn = 55; + var fileLink = new Uri("https://github.com/myorg/myrepo/blob/develop/src/foo.cs#L10-L12"); var messageText = "MessageText"; var messageHtml = "MessageHtml"; var messageMarkdown = "MessageMarkdown"; @@ -690,6 +717,7 @@ public void Should_Set_ProjectName(string projectName) endLine, column, endColumn, + fileLink, messageText, messageHtml, messageMarkdown, @@ -720,6 +748,7 @@ public void Should_Throw_If_File_Path_Is_Invalid(string filePath) var endLine = 12; var column = 50; var endColumn = 55; + var fileLink = new Uri("https://github.com/myorg/myrepo/blob/develop/src/foo.cs#L10-L12"); var messageText = "MessageText"; var messageHtml = "MessageHtml"; var messageMarkdown = "MessageMarkdown"; @@ -742,6 +771,7 @@ public void Should_Throw_If_File_Path_Is_Invalid(string filePath) endLine, column, endColumn, + fileLink, messageText, messageHtml, messageMarkdown, @@ -771,6 +801,7 @@ public void Should_Throw_If_File_Path_Is_Absolute(string filePath) var endLine = 12; var column = 50; var endColumn = 55; + var fileLink = new Uri("https://github.com/myorg/myrepo/blob/develop/src/foo.cs#L10-L12"); var messageText = "MessageText"; var messageHtml = "MessageHtml"; var messageMarkdown = "MessageMarkdown"; @@ -793,6 +824,7 @@ public void Should_Throw_If_File_Path_Is_Absolute(string filePath) endLine, column, endColumn, + fileLink, messageText, messageHtml, messageMarkdown, @@ -820,6 +852,7 @@ public void Should_Handle_File_Paths_Which_Are_Null() int? endLine = null; int? column = null; int? endColumn = null; + Uri fileLink = null; var messageText = "MessageText"; var messageHtml = "MessageHtml"; var messageMarkdown = "MessageMarkdown"; @@ -842,6 +875,7 @@ public void Should_Handle_File_Paths_Which_Are_Null() endLine, column, endColumn, + fileLink, messageText, messageHtml, messageMarkdown, @@ -869,6 +903,7 @@ public void Should_Handle_File_Paths_Which_Are_Empty() int? endLine = null; int? column = null; int? endColumn = null; + Uri fileLink = null; var messageText = "MessageText"; var messageHtml = "MessageHtml"; var messageMarkdown = "MessageMarkdown"; @@ -891,6 +926,7 @@ public void Should_Handle_File_Paths_Which_Are_Empty() endLine, column, endColumn, + fileLink, messageText, messageHtml, messageMarkdown, @@ -918,6 +954,7 @@ public void Should_Handle_File_Paths_Which_Are_WhiteSpace() int? endLine = null; int? column = null; int? endColumn = null; + Uri fileLink = null; var messageText = "MessageText"; var messageHtml = "MessageHtml"; var messageMarkdown = "MessageMarkdown"; @@ -940,6 +977,7 @@ public void Should_Handle_File_Paths_Which_Are_WhiteSpace() endLine, column, endColumn, + fileLink, messageText, messageHtml, messageMarkdown, @@ -975,6 +1013,7 @@ public void Should_Set_File_Path(string filePath, string expectedFilePath) var endLine = 12; var column = 50; var endColumn = 55; + var fileLink = new Uri("https://github.com/myorg/myrepo/blob/develop/src/foo.cs#L10-L12"); var messageText = "MessageText"; var messageHtml = "MessageHtml"; var messageMarkdown = "MessageMarkdown"; @@ -997,6 +1036,7 @@ public void Should_Set_File_Path(string filePath, string expectedFilePath) endLine, column, endColumn, + fileLink, messageText, messageHtml, messageMarkdown, @@ -1028,6 +1068,7 @@ public void Should_Throw_If_Line_Is_Negative() int? endLine = null; int? column = null; int? endColumn = null; + var fileLink = new Uri("https://github.com/myorg/myrepo/blob/develop/src/foo.cs#L10-L12"); var messageText = "MessageText"; var messageHtml = "MessageHtml"; var messageMarkdown = "MessageMarkdown"; @@ -1050,6 +1091,7 @@ public void Should_Throw_If_Line_Is_Negative() endLine, column, endColumn, + fileLink, messageText, messageHtml, messageMarkdown, @@ -1077,6 +1119,7 @@ public void Should_Throw_If_Line_Is_Zero() int? endLine = null; int? column = null; int? endColumn = null; + var fileLink = new Uri("https://github.com/myorg/myrepo/blob/develop/src/foo.cs#L10-L12"); var messageText = "MessageText"; var messageHtml = "MessageHtml"; var messageMarkdown = "MessageMarkdown"; @@ -1099,6 +1142,7 @@ public void Should_Throw_If_Line_Is_Zero() endLine, column, endColumn, + fileLink, messageText, messageHtml, messageMarkdown, @@ -1126,6 +1170,7 @@ public void Should_Throw_If_Line_Is_Set_But_No_File() int? endLine = null; int? column = null; int? endColumn = null; + Uri fileLink = null; var messageText = "MessageText"; var messageHtml = "MessageHtml"; var messageMarkdown = "MessageMarkdown"; @@ -1148,6 +1193,7 @@ public void Should_Throw_If_Line_Is_Set_But_No_File() endLine, column, endColumn, + fileLink, messageText, messageHtml, messageMarkdown, @@ -1175,6 +1221,7 @@ public void Should_Handle_Line_Which_Is_Null() int? endLine = null; int? column = null; int? endColumn = null; + var fileLink = new Uri("https://github.com/myorg/myrepo/blob/develop/src/foo.cs#L10-L12"); var messageText = "MessageText"; var messageHtml = "MessageHtml"; var messageMarkdown = "MessageMarkdown"; @@ -1197,6 +1244,7 @@ public void Should_Handle_Line_Which_Is_Null() endLine, column, endColumn, + fileLink, messageText, messageHtml, messageMarkdown, @@ -1225,6 +1273,7 @@ public void Should_Set_Line(int line) int? endLine = null; var column = 50; var endColumn = 55; + var fileLink = new Uri("https://github.com/myorg/myrepo/blob/develop/src/foo.cs#L10-L12"); var messageText = "MessageText"; var messageHtml = "MessageHtml"; var messageMarkdown = "MessageMarkdown"; @@ -1247,6 +1296,7 @@ public void Should_Set_Line(int line) endLine, column, endColumn, + fileLink, messageText, messageHtml, messageMarkdown, @@ -1277,6 +1327,7 @@ public void Should_Throw_If_EndLine_Is_Negative() var endLine = -1; int? column = null; int? endColumn = null; + var fileLink = new Uri("https://github.com/myorg/myrepo/blob/develop/src/foo.cs#L10-L12"); var messageText = "MessageText"; var messageHtml = "MessageHtml"; var messageMarkdown = "MessageMarkdown"; @@ -1299,6 +1350,7 @@ public void Should_Throw_If_EndLine_Is_Negative() endLine, column, endColumn, + fileLink, messageText, messageHtml, messageMarkdown, @@ -1326,6 +1378,7 @@ public void Should_Throw_If_EndLine_Is_Zero() var endLine = 0; int? column = null; int? endColumn = null; + var fileLink = new Uri("https://github.com/myorg/myrepo/blob/develop/src/foo.cs#L10-L12"); var messageText = "MessageText"; var messageHtml = "MessageHtml"; var messageMarkdown = "MessageMarkdown"; @@ -1348,6 +1401,7 @@ public void Should_Throw_If_EndLine_Is_Zero() endLine, column, endColumn, + fileLink, messageText, messageHtml, messageMarkdown, @@ -1375,6 +1429,7 @@ public void Should_Throw_If_EndLine_Is_Set_But_No_Line() var endLine = 12; int? column = null; int? endColumn = null; + var fileLink = new Uri("https://github.com/myorg/myrepo/blob/develop/src/foo.cs#L10-L12"); var messageText = "MessageText"; var messageHtml = "MessageHtml"; var messageMarkdown = "MessageMarkdown"; @@ -1397,6 +1452,7 @@ public void Should_Throw_If_EndLine_Is_Set_But_No_Line() endLine, column, endColumn, + fileLink, messageText, messageHtml, messageMarkdown, @@ -1424,6 +1480,7 @@ public void Should_Throw_If_EndLine_Is_Smaller_Line() var endLine = 12; int? column = null; int? endColumn = null; + var fileLink = new Uri("https://github.com/myorg/myrepo/blob/develop/src/foo.cs#L10-L12"); var messageText = "MessageText"; var messageHtml = "MessageHtml"; var messageMarkdown = "MessageMarkdown"; @@ -1446,6 +1503,7 @@ public void Should_Throw_If_EndLine_Is_Smaller_Line() endLine, column, endColumn, + fileLink, messageText, messageHtml, messageMarkdown, @@ -1473,6 +1531,7 @@ public void Should_Handle_EndLine_Which_Is_Null() int? endLine = null; int? column = null; int? endColumn = null; + var fileLink = new Uri("https://github.com/myorg/myrepo/blob/develop/src/foo.cs#L10-L12"); var messageText = "MessageText"; var messageHtml = "MessageHtml"; var messageMarkdown = "MessageMarkdown"; @@ -1495,6 +1554,7 @@ public void Should_Handle_EndLine_Which_Is_Null() endLine, column, endColumn, + fileLink, messageText, messageHtml, messageMarkdown, @@ -1522,6 +1582,7 @@ public void Should_Handle_EndLine_Which_Is_Equals_Line() var endLine = 10; int? column = null; int? endColumn = null; + var fileLink = new Uri("https://github.com/myorg/myrepo/blob/develop/src/foo.cs#L10-L12"); var messageText = "MessageText"; var messageHtml = "MessageHtml"; var messageMarkdown = "MessageMarkdown"; @@ -1544,6 +1605,7 @@ public void Should_Handle_EndLine_Which_Is_Equals_Line() endLine, column, endColumn, + fileLink, messageText, messageHtml, messageMarkdown, @@ -1572,6 +1634,7 @@ public void Should_Set_EndLine(int endLine) var line = 1; var column = 50; var endColumn = 55; + var fileLink = new Uri("https://github.com/myorg/myrepo/blob/develop/src/foo.cs#L10-L12"); var messageText = "MessageText"; var messageHtml = "MessageHtml"; var messageMarkdown = "MessageMarkdown"; @@ -1594,6 +1657,7 @@ public void Should_Set_EndLine(int endLine) endLine, column, endColumn, + fileLink, messageText, messageHtml, messageMarkdown, @@ -1624,6 +1688,7 @@ public void Should_Throw_If_Column_Is_Negative() var endLine = 12; var column = -1; int? endColumn = null; + var fileLink = new Uri("https://github.com/myorg/myrepo/blob/develop/src/foo.cs#L10-L12"); var messageText = "MessageText"; var messageHtml = "MessageHtml"; var messageMarkdown = "MessageMarkdown"; @@ -1646,6 +1711,7 @@ public void Should_Throw_If_Column_Is_Negative() endLine, column, endColumn, + fileLink, messageText, messageHtml, messageMarkdown, @@ -1673,6 +1739,7 @@ public void Should_Throw_If_Column_Is_Zero() var endLine = 12; var column = 0; int? endColumn = null; + var fileLink = new Uri("https://github.com/myorg/myrepo/blob/develop/src/foo.cs#L10-L12"); var messageText = "MessageText"; var messageHtml = "MessageHtml"; var messageMarkdown = "MessageMarkdown"; @@ -1695,6 +1762,7 @@ public void Should_Throw_If_Column_Is_Zero() endLine, column, endColumn, + fileLink, messageText, messageHtml, messageMarkdown, @@ -1722,6 +1790,7 @@ public void Should_Throw_If_Column_Is_Set_But_No_Line() int? endLine = null; var column = 50; int? endColumn = null; + var fileLink = new Uri("https://github.com/myorg/myrepo/blob/develop/src/foo.cs#L10-L12"); var messageText = "MessageText"; var messageHtml = "MessageHtml"; var messageMarkdown = "MessageMarkdown"; @@ -1744,6 +1813,7 @@ public void Should_Throw_If_Column_Is_Set_But_No_Line() endLine, column, endColumn, + fileLink, messageText, messageHtml, messageMarkdown, @@ -1771,6 +1841,7 @@ public void Should_Handle_Column_Which_Is_Null() var endLine = 12; int? column = null; int? endColumn = null; + var fileLink = new Uri("https://github.com/myorg/myrepo/blob/develop/src/foo.cs#L10-L12"); var messageText = "MessageText"; var messageHtml = "MessageHtml"; var messageMarkdown = "MessageMarkdown"; @@ -1793,6 +1864,7 @@ public void Should_Handle_Column_Which_Is_Null() endLine, column, endColumn, + fileLink, messageText, messageHtml, messageMarkdown, @@ -1822,6 +1894,7 @@ public void Should_Set_Column(int? column) var line = 10; var endLine = 12; int? endColumn = null; + var fileLink = new Uri("https://github.com/myorg/myrepo/blob/develop/src/foo.cs#L10-L12"); var messageText = "MessageText"; var messageHtml = "MessageHtml"; var messageMarkdown = "MessageMarkdown"; @@ -1844,6 +1917,7 @@ public void Should_Set_Column(int? column) endLine, column, endColumn, + fileLink, messageText, messageHtml, messageMarkdown, @@ -1874,6 +1948,7 @@ public void Should_Throw_If_EndColumn_Is_Negative() var endLine = 12; var column = 50; var endColumn = -1; + var fileLink = new Uri("https://github.com/myorg/myrepo/blob/develop/src/foo.cs#L10-L12"); var messageText = "MessageText"; var messageHtml = "MessageHtml"; var messageMarkdown = "MessageMarkdown"; @@ -1896,6 +1971,7 @@ public void Should_Throw_If_EndColumn_Is_Negative() endLine, column, endColumn, + fileLink, messageText, messageHtml, messageMarkdown, @@ -1923,6 +1999,7 @@ public void Should_Throw_If_EndColumn_Is_Zero() var endLine = 12; var column = 50; var endColumn = 0; + var fileLink = new Uri("https://github.com/myorg/myrepo/blob/develop/src/foo.cs#L10-L12"); var messageText = "MessageText"; var messageHtml = "MessageHtml"; var messageMarkdown = "MessageMarkdown"; @@ -1945,6 +2022,7 @@ public void Should_Throw_If_EndColumn_Is_Zero() endLine, column, endColumn, + fileLink, messageText, messageHtml, messageMarkdown, @@ -1972,6 +2050,7 @@ public void Should_Throw_If_EndColumn_Is_Set_But_No_Column() var endLine = 12; int? column = null; var endColumn = 55; + var fileLink = new Uri("https://github.com/myorg/myrepo/blob/develop/src/foo.cs#L10-L12"); var messageText = "MessageText"; var messageHtml = "MessageHtml"; var messageMarkdown = "MessageMarkdown"; @@ -1994,6 +2073,7 @@ public void Should_Throw_If_EndColumn_Is_Set_But_No_Column() endLine, column, endColumn, + fileLink, messageText, messageHtml, messageMarkdown, @@ -2021,6 +2101,7 @@ public void Should_Throw_If_EndColumn_Is_Smaller_Column() var endLine = 12; var column = 50; var endColumn = 5; + var fileLink = new Uri("https://github.com/myorg/myrepo/blob/develop/src/foo.cs#L10-L12"); var messageText = "MessageText"; var messageHtml = "MessageHtml"; var messageMarkdown = "MessageMarkdown"; @@ -2043,6 +2124,7 @@ public void Should_Throw_If_EndColumn_Is_Smaller_Column() endLine, column, endColumn, + fileLink, messageText, messageHtml, messageMarkdown, @@ -2070,6 +2152,7 @@ public void Should_Handle_EndColumn_Which_Is_Null() var endLine = 12; int? column = null; int? endColumn = null; + var fileLink = new Uri("https://github.com/myorg/myrepo/blob/develop/src/foo.cs#L10-L12"); var messageText = "MessageText"; var messageHtml = "MessageHtml"; var messageMarkdown = "MessageMarkdown"; @@ -2092,6 +2175,7 @@ public void Should_Handle_EndColumn_Which_Is_Null() endLine, column, endColumn, + fileLink, messageText, messageHtml, messageMarkdown, @@ -2119,6 +2203,7 @@ public void Should_Handle_EndColumn_Which_Is_Equals_Column() var endLine = 12; var column = 50; var endColumn = 50; + var fileLink = new Uri("https://github.com/myorg/myrepo/blob/develop/src/foo.cs#L10-L12"); var messageText = "MessageText"; var messageHtml = "MessageHtml"; var messageMarkdown = "MessageMarkdown"; @@ -2141,6 +2226,7 @@ public void Should_Handle_EndColumn_Which_Is_Equals_Column() endLine, column, endColumn, + fileLink, messageText, messageHtml, messageMarkdown, @@ -2170,6 +2256,7 @@ public void Should_Set_EndColumn(int? endColumn) var line = 10; var endLine = 12; var column = 1; + var fileLink = new Uri("https://github.com/myorg/myrepo/blob/develop/src/foo.cs#L10-L12"); var messageText = "MessageText"; var messageHtml = "MessageHtml"; var messageMarkdown = "MessageMarkdown"; @@ -2192,6 +2279,7 @@ public void Should_Set_EndColumn(int? endColumn) endLine, column, endColumn, + fileLink, messageText, messageHtml, messageMarkdown, @@ -2208,6 +2296,111 @@ public void Should_Set_EndColumn(int? endColumn) } } + public sealed class TheFileLinkArgument + { + [Fact] + public void Should_Set_FileLink() + { + // Given + var identifier = "identifier"; + var projectPath = @"src\foo.csproj"; + var projectName = "foo"; + var filePath = @"src\foo.cs"; + var line = 10; + var endLine = 12; + var column = 50; + var endColumn = 55; + var fileLink = new Uri("https://github.com/myorg/myrepo/blob/develop/src/foo.cs#L10-L12"); + var messageText = "MessageText"; + var messageHtml = "MessageHtml"; + var messageMarkdown = "MessageMarkdown"; + var priority = 1; + var priorityName = "Warning"; + var rule = "Rule"; + var ruleUri = new Uri("https://google.com"); + var providerType = "ProviderType"; + var providerName = "ProviderName"; + var run = "Run"; + + // When + var issue = + new Issue( + identifier, + projectPath, + projectName, + filePath, + line, + endLine, + column, + endColumn, + fileLink, + messageText, + messageHtml, + messageMarkdown, + priority, + priorityName, + rule, + ruleUri, + run, + providerType, + providerName); + + // Then + issue.FileLink.ShouldBe(fileLink); + } + + [Fact] + public void Should_Set_FileLink_If_Null() + { + // Given + var identifier = "identifier"; + var projectPath = @"src\foo.csproj"; + var projectName = "foo"; + var filePath = @"src\foo.cs"; + var line = 10; + var endLine = 12; + var column = 50; + var endColumn = 55; + Uri fileLink = null; + var messageText = "MessageText"; + var messageHtml = "MessageHtml"; + var messageMarkdown = "MessageMarkdown"; + var priority = 1; + var priorityName = "Warning"; + var rule = "Rule"; + var ruleUri = new Uri("https://google.com"); + var providerType = "ProviderType"; + var providerName = "ProviderName"; + var run = "Run"; + + // When + var issue = + new Issue( + identifier, + projectPath, + projectName, + filePath, + line, + endLine, + column, + endColumn, + fileLink, + messageText, + messageHtml, + messageMarkdown, + priority, + priorityName, + rule, + ruleUri, + run, + providerType, + providerName); + + // Then + issue.FileLink.ShouldBe(fileLink); + } + } + public sealed class TheMessageTextArgument { [Fact] @@ -2222,6 +2415,7 @@ public void Should_Throw_If_MessageText_Is_Null() var endLine = 12; var column = 50; var endColumn = 55; + var fileLink = new Uri("https://github.com/myorg/myrepo/blob/develop/src/foo.cs#L10-L12"); string messageText = null; var messageHtml = "MessageHtml"; var messageMarkdown = "MessageMarkdown"; @@ -2244,6 +2438,7 @@ public void Should_Throw_If_MessageText_Is_Null() endLine, column, endColumn, + fileLink, messageText, messageHtml, messageMarkdown, @@ -2271,6 +2466,7 @@ public void Should_Throw_If_MessageText_Is_Empty() var endLine = 12; var column = 50; var endColumn = 55; + var fileLink = new Uri("https://github.com/myorg/myrepo/blob/develop/src/foo.cs#L10-L12"); var messageText = string.Empty; var messageHtml = "MessageHtml"; var messageMarkdown = "MessageMarkdown"; @@ -2293,6 +2489,7 @@ public void Should_Throw_If_MessageText_Is_Empty() endLine, column, endColumn, + fileLink, messageText, messageHtml, messageMarkdown, @@ -2320,6 +2517,7 @@ public void Should_Throw_If_MessageText_Is_WhiteSpace() var endLine = 12; var column = 50; var endColumn = 55; + var fileLink = new Uri("https://github.com/myorg/myrepo/blob/develop/src/foo.cs#L10-L12"); var messageText = " "; var messageHtml = "MessageHtml"; var messageMarkdown = "MessageMarkdown"; @@ -2342,6 +2540,7 @@ public void Should_Throw_If_MessageText_Is_WhiteSpace() endLine, column, endColumn, + fileLink, messageText, messageHtml, messageMarkdown, @@ -2370,6 +2569,7 @@ public void Should_Set_MessageText(string messageText) var endLine = 12; var column = 50; var endColumn = 55; + var fileLink = new Uri("https://github.com/myorg/myrepo/blob/develop/src/foo.cs#L10-L12"); var messageHtml = "MessageHtml"; var messageMarkdown = "MessageMarkdown"; var priority = 1; @@ -2391,6 +2591,7 @@ public void Should_Set_MessageText(string messageText) endLine, column, endColumn, + fileLink, messageText, messageHtml, messageMarkdown, @@ -2425,6 +2626,7 @@ public void Should_Set_MessageHtml(string messageHtml) var endLine = 12; var column = 50; var endColumn = 55; + var fileLink = new Uri("https://github.com/myorg/myrepo/blob/develop/src/foo.cs#L10-L12"); var messageText = "MessageText"; var messageMarkdown = "MessageMarkdown"; var priority = 1; @@ -2446,6 +2648,7 @@ public void Should_Set_MessageHtml(string messageHtml) endLine, column, endColumn, + fileLink, messageText, messageHtml, messageMarkdown, @@ -2480,6 +2683,7 @@ public void Should_Set_MessageHtml(string messageMarkdown) var endLine = 12; var column = 50; var endColumn = 55; + var fileLink = new Uri("https://github.com/myorg/myrepo/blob/develop/src/foo.cs#L10-L12"); var messageText = "MessageText"; var messageHtml = "MessageHtml"; var priority = 1; @@ -2501,6 +2705,7 @@ public void Should_Set_MessageHtml(string messageMarkdown) endLine, column, endColumn, + fileLink, messageText, messageHtml, messageMarkdown, @@ -2537,6 +2742,7 @@ public void Should_Set_Priority(int? priority) var endLine = 12; var column = 50; var endColumn = 55; + var fileLink = new Uri("https://github.com/myorg/myrepo/blob/develop/src/foo.cs#L10-L12"); var messageText = "MessageText"; var messageHtml = "MessageHtml"; var messageMarkdown = "MessageMarkdown"; @@ -2558,6 +2764,7 @@ public void Should_Set_Priority(int? priority) endLine, column, endColumn, + fileLink, messageText, messageHtml, messageMarkdown, @@ -2588,6 +2795,7 @@ public void Should_Handle_PriorityNames_Which_Are_Null() var endLine = 12; var column = 50; var endColumn = 55; + var fileLink = new Uri("https://github.com/myorg/myrepo/blob/develop/src/foo.cs#L10-L12"); var messageText = "MessageText"; var messageHtml = "MessageHtml"; var messageMarkdown = "MessageMarkdown"; @@ -2610,6 +2818,7 @@ public void Should_Handle_PriorityNames_Which_Are_Null() endLine, column, endColumn, + fileLink, messageText, messageHtml, messageMarkdown, @@ -2637,6 +2846,7 @@ public void Should_Handle_PriorityNames_Which_Are_Empty() var endLine = 12; var column = 50; var endColumn = 55; + var fileLink = new Uri("https://github.com/myorg/myrepo/blob/develop/src/foo.cs#L10-L12"); var messageText = "MessageText"; var messageHtml = "MessageHtml"; var messageMarkdown = "MessageMarkdown"; @@ -2659,6 +2869,7 @@ public void Should_Handle_PriorityNames_Which_Are_Empty() endLine, column, endColumn, + fileLink, messageText, messageHtml, messageMarkdown, @@ -2686,6 +2897,7 @@ public void Should_Handle_PriorityNames_Which_Are_WhiteSpace() var endLine = 12; var column = 50; var endColumn = 55; + var fileLink = new Uri("https://github.com/myorg/myrepo/blob/develop/src/foo.cs#L10-L12"); var messageText = "MessageText"; var messageHtml = "MessageHtml"; var messageMarkdown = "MessageMarkdown"; @@ -2708,6 +2920,7 @@ public void Should_Handle_PriorityNames_Which_Are_WhiteSpace() endLine, column, endColumn, + fileLink, messageText, messageHtml, messageMarkdown, @@ -2736,6 +2949,7 @@ public void Should_Set_Priority_Name(string priorityName) var endLine = 12; var column = 50; var endColumn = 55; + var fileLink = new Uri("https://github.com/myorg/myrepo/blob/develop/src/foo.cs#L10-L12"); var messageText = "MessageText"; var messageHtml = "MessageHtml"; var messageMarkdown = "MessageMarkdown"; @@ -2757,6 +2971,7 @@ public void Should_Set_Priority_Name(string priorityName) endLine, column, endColumn, + fileLink, messageText, messageHtml, messageMarkdown, @@ -2790,6 +3005,7 @@ public void Should_Set_Rule(string rule) var endLine = 12; var column = 50; var endColumn = 55; + var fileLink = new Uri("https://github.com/myorg/myrepo/blob/develop/src/foo.cs#L10-L12"); var messageText = "MessageText"; var messageHtml = "MessageHtml"; var messageMarkdown = "MessageMarkdown"; @@ -2811,6 +3027,7 @@ public void Should_Set_Rule(string rule) endLine, column, endColumn, + fileLink, messageText, messageHtml, messageMarkdown, @@ -2841,6 +3058,7 @@ public void Should_Set_Rule_Url() var endLine = 12; var column = 50; var endColumn = 55; + var fileLink = new Uri("https://github.com/myorg/myrepo/blob/develop/src/foo.cs#L10-L12"); var messageText = "MessageText"; var messageHtml = "MessageHtml"; var messageMarkdown = "MessageMarkdown"; @@ -2863,6 +3081,7 @@ public void Should_Set_Rule_Url() endLine, column, endColumn, + fileLink, messageText, messageHtml, messageMarkdown, @@ -2890,6 +3109,7 @@ public void Should_Set_Rule_Url_If_Null() var endLine = 12; var column = 50; var endColumn = 55; + var fileLink = new Uri("https://github.com/myorg/myrepo/blob/develop/src/foo.cs#L10-L12"); var messageText = "MessageText"; var messageHtml = "MessageHtml"; var messageMarkdown = "MessageMarkdown"; @@ -2912,6 +3132,7 @@ public void Should_Set_Rule_Url_If_Null() endLine, column, endColumn, + fileLink, messageText, messageHtml, messageMarkdown, @@ -2945,6 +3166,7 @@ public void Should_Set_Run(string run) var endLine = 12; var column = 50; var endColumn = 55; + var fileLink = new Uri("https://github.com/myorg/myrepo/blob/develop/src/foo.cs#L10-L12"); var messageText = "MessageText"; var messageHtml = "MessageHtml"; var messageMarkdown = "MessageMarkdown"; @@ -2966,6 +3188,7 @@ public void Should_Set_Run(string run) endLine, column, endColumn, + fileLink, messageText, messageHtml, messageMarkdown, @@ -2996,6 +3219,7 @@ public void Should_Throw_If_Provider_Type_Is_Null() var endLine = 12; var column = 50; var endColumn = 55; + var fileLink = new Uri("https://github.com/myorg/myrepo/blob/develop/src/foo.cs#L10-L12"); var messageText = "MessageText"; var messageHtml = "MessageHtml"; var messageMarkdown = "MessageMarkdown"; @@ -3018,6 +3242,7 @@ public void Should_Throw_If_Provider_Type_Is_Null() endLine, column, endColumn, + fileLink, messageText, messageHtml, messageMarkdown, @@ -3045,6 +3270,7 @@ public void Should_Throw_If_Provider_Type_Is_Empty() var endLine = 12; var column = 50; var endColumn = 55; + var fileLink = new Uri("https://github.com/myorg/myrepo/blob/develop/src/foo.cs#L10-L12"); var messageText = "MessageText"; var messageHtml = "MessageHtml"; var messageMarkdown = "MessageMarkdown"; @@ -3067,6 +3293,7 @@ public void Should_Throw_If_Provider_Type_Is_Empty() endLine, column, endColumn, + fileLink, messageText, messageHtml, messageMarkdown, @@ -3094,6 +3321,7 @@ public void Should_Throw_If_Provider_Type_Is_WhiteSpace() var endLine = 12; var column = 50; var endColumn = 55; + var fileLink = new Uri("https://github.com/myorg/myrepo/blob/develop/src/foo.cs#L10-L12"); var messageText = "MessageText"; var messageHtml = "MessageHtml"; var messageMarkdown = "MessageMarkdown"; @@ -3116,6 +3344,7 @@ public void Should_Throw_If_Provider_Type_Is_WhiteSpace() endLine, column, endColumn, + fileLink, messageText, messageHtml, messageMarkdown, @@ -3144,6 +3373,7 @@ public void Should_Set_ProviderType(string providerType) var endLine = 12; var column = 50; var endColumn = 55; + var fileLink = new Uri("https://github.com/myorg/myrepo/blob/develop/src/foo.cs#L10-L12"); var messageText = "MessageText"; var messageHtml = "MessageHtml"; var messageMarkdown = "MessageMarkdown"; @@ -3165,6 +3395,7 @@ public void Should_Set_ProviderType(string providerType) endLine, column, endColumn, + fileLink, messageText, messageHtml, messageMarkdown, @@ -3195,6 +3426,7 @@ public void Should_Throw_If_Provider_Name_Is_Null() var endLine = 12; var column = 50; var endColumn = 55; + var fileLink = new Uri("https://github.com/myorg/myrepo/blob/develop/src/foo.cs#L10-L12"); var messageText = "MessageText"; var messageHtml = "MessageHtml"; var messageMarkdown = "MessageMarkdown"; @@ -3217,6 +3449,7 @@ public void Should_Throw_If_Provider_Name_Is_Null() endLine, column, endColumn, + fileLink, messageText, messageHtml, messageMarkdown, @@ -3244,6 +3477,7 @@ public void Should_Throw_If_Provider_Name_Is_Empty() var endLine = 12; var column = 50; var endColumn = 55; + var fileLink = new Uri("https://github.com/myorg/myrepo/blob/develop/src/foo.cs#L10-L12"); var messageText = "MessageText"; var messageHtml = "MessageHtml"; var messageMarkdown = "MessageMarkdown"; @@ -3266,6 +3500,7 @@ public void Should_Throw_If_Provider_Name_Is_Empty() endLine, column, endColumn, + fileLink, messageText, messageHtml, messageMarkdown, @@ -3293,6 +3528,7 @@ public void Should_Throw_If_Provider_Name_Is_WhiteSpace() var endLine = 12; var column = 50; var endColumn = 55; + var fileLink = new Uri("https://github.com/myorg/myrepo/blob/develop/src/foo.cs#L10-L12"); var messageText = "MessageText"; var messageHtml = "MessageHtml"; var messageMarkdown = "MessageMarkdown"; @@ -3315,6 +3551,7 @@ public void Should_Throw_If_Provider_Name_Is_WhiteSpace() endLine, column, endColumn, + fileLink, messageText, messageHtml, messageMarkdown, @@ -3343,6 +3580,7 @@ public void Should_Set_ProviderName(string providerName) var endLine = 12; var column = 50; var endColumn = 55; + var fileLink = new Uri("https://github.com/myorg/myrepo/blob/develop/src/foo.cs#L10-L12"); var messageText = "MessageText"; var messageHtml = "MessageHtml"; var messageMarkdown = "MessageMarkdown"; @@ -3364,6 +3602,7 @@ public void Should_Set_ProviderName(string providerName) endLine, column, endColumn, + fileLink, messageText, messageHtml, messageMarkdown, diff --git a/src/Cake.Issues.Tests/Serialization/IssueSerializationExtensionsTests.cs b/src/Cake.Issues.Tests/Serialization/IssueSerializationExtensionsTests.cs index 634d01649..244117bb0 100644 --- a/src/Cake.Issues.Tests/Serialization/IssueSerializationExtensionsTests.cs +++ b/src/Cake.Issues.Tests/Serialization/IssueSerializationExtensionsTests.cs @@ -274,6 +274,24 @@ public void Should_Give_Correct_Result_For_EndColumn_After_Roundtrip() result.EndColumn.ShouldBe(endColumn); } + [Fact] + public void Should_Give_Correct_Result_For_FileLink_After_Roundtrip() + { + // Given + var fileLink = "https://github.com/myorg/myrepo/blob/develop/src/foo.cs#L10-L12"; + var issue = + IssueBuilder + .NewIssue("message", "providerType", "providerName") + .WithFileLink(new Uri(fileLink)) + .Create(); + + // When + var result = issue.SerializeToJsonString().DeserializeToIssue(); + + // Then + result.FileLink.ToString().ShouldBe(fileLink); + } + [Fact] public void Should_Give_Correct_Result_For_Priority_After_Roundtrip() { @@ -746,6 +764,34 @@ public void Should_Give_Correct_Result_For_EndColumn_After_Roundtrip() result.Last().EndColumn.ShouldBe(endColumn2); } + [Fact] + public void Should_Give_Correct_Result_For_FileLink_After_Roundtrip() + { + // Given + var fileLink1 = "https://github.com/myorg/myrepo/blob/develop/src/foo.cs#L10-L12"; + var fileLink2 = "https://github.com/myorg/myrepo/blob/develop/src/bar.cs#L23-L42"; + var issues = + new List + { + IssueBuilder + .NewIssue("message1", "providerType1", "providerName1") + .WithFileLink(new Uri(fileLink1)) + .Create(), + IssueBuilder + .NewIssue("message2", "providerType2", "providerName2") + .WithFileLink(new Uri(fileLink2)) + .Create(), + }; + + // When + var result = issues.SerializeToJsonString().DeserializeToIssues(); + + // Then + result.Count().ShouldBe(2); + result.First().FileLink.ToString().ShouldBe(fileLink1); + result.Last().FileLink.ToString().ShouldBe(fileLink2); + } + [Fact] public void Should_Give_Correct_Result_For_Priority_After_Roundtrip() { @@ -1308,6 +1354,36 @@ public void Should_Give_Correct_Result_For_EndColumn_After_Roundtrip() } } + [Fact] + public void Should_Give_Correct_Result_For_FileLink_After_Roundtrip() + { + // Given + var fileLink = "https://github.com/myorg/myrepo/blob/develop/src/foo.cs#L10-L12"; + var issue = + IssueBuilder + .NewIssue("message", "providerType", "providerName") + .WithFileLink(new Uri(fileLink)) + .Create(); + var filePath = new FilePath(System.IO.Path.GetTempPath() + Guid.NewGuid().ToString() + ".json"); + + try + { + // When + issue.SerializeToJsonFile(filePath); + var result = filePath.DeserializeToIssue(); + + // Then + result.FileLink.ToString().ShouldBe(fileLink); + } + finally + { + if (System.IO.File.Exists(filePath.FullPath)) + { + System.IO.File.Delete(filePath.FullPath); + } + } + } + [Fact] public void Should_Give_Correct_Result_For_Priority_After_Roundtrip() { @@ -2011,6 +2087,46 @@ public void Should_Give_Correct_Result_For_EndColumn_After_Roundtrip() } } + [Fact] + public void Should_Give_Correct_Result_For_FileLink_After_Roundtrip() + { + // Given + var fileLink1 = "https://github.com/myorg/myrepo/blob/develop/src/foo.cs#L10-L12"; + var fileLink2 = "https://github.com/myorg/myrepo/blob/develop/src/bar.cs#L23-L42"; + var issues = + new List + { + IssueBuilder + .NewIssue("message1", "providerType1", "providerName1") + .WithFileLink(new Uri(fileLink1)) + .Create(), + IssueBuilder + .NewIssue("message2", "providerType2", "providerName2") + .WithFileLink(new Uri(fileLink2)) + .Create(), + }; + var filePath = new FilePath(System.IO.Path.GetTempPath() + Guid.NewGuid().ToString() + ".json"); + + try + { + // When + issues.SerializeToJsonFile(filePath); + var result = filePath.DeserializeToIssues(); + + // Then + result.Count().ShouldBe(2); + result.First().FileLink.ToString().ShouldBe(fileLink1); + result.Last().FileLink.ToString().ShouldBe(fileLink2); + } + finally + { + if (System.IO.File.Exists(filePath.FullPath)) + { + System.IO.File.Delete(filePath.FullPath); + } + } + } + [Fact] public void Should_Give_Correct_Result_For_Priority_After_Roundtrip() { diff --git a/src/Cake.Issues.Tests/Testing/BaseConfigurableIssueProviderFixtureTests.cs b/src/Cake.Issues.Tests/Testing/BaseConfigurableIssueProviderFixtureTests.cs index 4d267d669..182507833 100644 --- a/src/Cake.Issues.Tests/Testing/BaseConfigurableIssueProviderFixtureTests.cs +++ b/src/Cake.Issues.Tests/Testing/BaseConfigurableIssueProviderFixtureTests.cs @@ -82,7 +82,7 @@ public void Should_Set_RepositorySettings() var result = new FakeConfigurableIssueProviderFixture("Build.log"); // Then - result.RepositorySettings.ShouldNotBeNull(); + result.ReadIssuesSettings.ShouldNotBeNull(); } [Fact] @@ -136,14 +136,14 @@ public void Should_Throw_If_RepositorySettings_Are_Null() // Given var fixture = new FakeConfigurableIssueProviderFixture("Build.log") { - RepositorySettings = null, + ReadIssuesSettings = null, }; // When var result = Record.Exception(() => fixture.ReadIssues()); // Then - result.IsInvalidOperationException("No repository settings set."); + result.IsInvalidOperationException("No settings for reading issues set."); } [Fact] diff --git a/src/Cake.Issues.Tests/Testing/BaseIssueProviderFixtureTests.cs b/src/Cake.Issues.Tests/Testing/BaseIssueProviderFixtureTests.cs index 5cb0d3268..5aa2d628b 100644 --- a/src/Cake.Issues.Tests/Testing/BaseIssueProviderFixtureTests.cs +++ b/src/Cake.Issues.Tests/Testing/BaseIssueProviderFixtureTests.cs @@ -31,7 +31,7 @@ public void Should_Set_RepositorySettings() var result = new FakeIssueProviderFixture(); // Then - result.RepositorySettings.ShouldNotBeNull(); + result.ReadIssuesSettings.ShouldNotBeNull(); } } @@ -59,14 +59,14 @@ public void Should_Throw_If_RepositorySettings_Are_Null() // Given var fixture = new FakeIssueProviderFixture { - RepositorySettings = null, + ReadIssuesSettings = null, }; // When var result = Record.Exception(() => fixture.ReadIssues()); // Then - result.IsInvalidOperationException("No repository settings set."); + result.IsInvalidOperationException("No settings for reading issues set."); } [Fact] diff --git a/src/Cake.Issues.Tests/Testing/BaseMultiFormatIssueProviderFixtureTests.cs b/src/Cake.Issues.Tests/Testing/BaseMultiFormatIssueProviderFixtureTests.cs index 540dcf176..be71cbfff 100644 --- a/src/Cake.Issues.Tests/Testing/BaseMultiFormatIssueProviderFixtureTests.cs +++ b/src/Cake.Issues.Tests/Testing/BaseMultiFormatIssueProviderFixtureTests.cs @@ -82,7 +82,7 @@ public void Should_Set_RepositorySettings() var result = new FakeMultiFormatIssueProviderFixture("Build.log"); // Then - result.RepositorySettings.ShouldNotBeNull(); + result.ReadIssuesSettings.ShouldNotBeNull(); } [Fact] @@ -136,14 +136,14 @@ public void Should_Throw_If_RepositorySettings_Are_Null() // Given var fixture = new FakeMultiFormatIssueProviderFixture("Build.log") { - RepositorySettings = null, + ReadIssuesSettings = null, }; // When var result = Record.Exception(() => fixture.ReadIssues()); // Then - result.IsInvalidOperationException("No repository settings set."); + result.IsInvalidOperationException("No settings for reading issues set."); } [Fact] diff --git a/src/Cake.Issues.Tests/Testing/IssueCheckerFixture.cs b/src/Cake.Issues.Tests/Testing/IssueCheckerFixture.cs index 9e107eab3..09ba57b92 100644 --- a/src/Cake.Issues.Tests/Testing/IssueCheckerFixture.cs +++ b/src/Cake.Issues.Tests/Testing/IssueCheckerFixture.cs @@ -23,6 +23,7 @@ public IssueCheckerFixture(string identifier, string messageText, string provide this.EndLine = 420; this.Column = 23; this.EndColumn = 230; + this.FileLink = new Uri("https://github.com/myorg/myrepo/blob/develop/src/foo.cs#L10-L12"); this.MessageText = messageText; this.MessageHtml = "messageHtml"; this.MessageMarkdown = "messageMarkdown"; @@ -37,6 +38,7 @@ public IssueCheckerFixture(string identifier, string messageText, string provide .WithMessageInMarkdownFormat(this.MessageMarkdown) .InProject(this.ProjectFileRelativePath, this.ProjectName) .InFile(this.AffectedFileRelativePath, this.Line, this.EndLine, this.Column, this.EndColumn) + .WithFileLink(this.FileLink) .OfRule(this.Rule, this.RuleUrl) .WithPriority(this.Priority, this.PriorityName); @@ -68,6 +70,8 @@ public IssueCheckerFixture(string identifier, string messageText, string provide public int EndColumn { get; private set; } + public Uri FileLink { get; private set; } + public string MessageText { get; private set; } public string MessageHtml { get; private set; } diff --git a/src/Cake.Issues.Tests/Testing/IssueCheckerTests.cs b/src/Cake.Issues.Tests/Testing/IssueCheckerTests.cs index c95545a63..d593d31eb 100644 --- a/src/Cake.Issues.Tests/Testing/IssueCheckerTests.cs +++ b/src/Cake.Issues.Tests/Testing/IssueCheckerTests.cs @@ -153,6 +153,7 @@ public void Should_Throw_If_Issue_Is_Null() fixture.EndLine, fixture.Column, fixture.EndColumn, + fixture.FileLink, fixture.MessageText, fixture.MessageHtml, fixture.MessageMarkdown, @@ -185,6 +186,7 @@ public void Should_Not_Throw_If_All_Values_Are_The_Same() fixture.EndLine, fixture.Column, fixture.EndColumn, + fixture.FileLink, fixture.MessageText, fixture.MessageHtml, fixture.MessageMarkdown, @@ -221,6 +223,7 @@ public void Should_Throw_If_ProviderType_Is_Different(string expectedValue, stri fixture.EndLine, fixture.Column, fixture.EndColumn, + fixture.FileLink, fixture.MessageText, fixture.MessageHtml, fixture.MessageMarkdown, @@ -259,6 +262,7 @@ public void Should_Throw_If_ProviderName_Is_Different(string expectedValue, stri fixture.EndLine, fixture.Column, fixture.EndColumn, + fixture.FileLink, fixture.MessageText, fixture.MessageHtml, fixture.MessageMarkdown, @@ -301,6 +305,7 @@ public void Should_Throw_If_Run_Is_Different(string expectedValue, string actual fixture.EndLine, fixture.Column, fixture.EndColumn, + fixture.FileLink, fixture.MessageText, fixture.MessageHtml, fixture.MessageMarkdown, @@ -339,6 +344,7 @@ public void Should_Throw_If_Identifier_Is_Different(string expectedValue, string fixture.EndLine, fixture.Column, fixture.EndColumn, + fixture.FileLink, fixture.MessageText, fixture.MessageHtml, fixture.MessageMarkdown, @@ -378,6 +384,7 @@ public void Should_Throw_If_ProjectFileRelativePath_Is_Different(string expected fixture.EndLine, fixture.Column, fixture.EndColumn, + fixture.FileLink, fixture.MessageText, fixture.MessageHtml, fixture.MessageMarkdown, @@ -420,6 +427,7 @@ public void Should_Throw_If_ProjectName_Is_Different(string expectedValue, strin fixture.EndLine, fixture.Column, fixture.EndColumn, + fixture.FileLink, fixture.MessageText, fixture.MessageHtml, fixture.MessageMarkdown, @@ -459,6 +467,7 @@ public void Should_Throw_If_AffectedFileRelativePath_Is_Different(string expecte fixture.EndLine, fixture.Column, fixture.EndColumn, + fixture.FileLink, fixture.MessageText, fixture.MessageHtml, fixture.MessageMarkdown, @@ -500,6 +509,7 @@ public void Should_Throw_If_Line_Is_Different(int? expectedValue, int? actualVal null, null, null, + fixture.FileLink, fixture.MessageText, fixture.MessageHtml, fixture.MessageMarkdown, @@ -541,6 +551,7 @@ public void Should_Throw_If_EndLine_Is_Different(int? expectedValue, int? actual expectedValue, fixture.Column, fixture.EndColumn, + fixture.FileLink, fixture.MessageText, fixture.MessageHtml, fixture.MessageMarkdown, @@ -582,6 +593,7 @@ public void Should_Throw_If_Column_Is_Different(int? expectedValue, int? actualV fixture.EndLine, expectedValue, null, + fixture.FileLink, fixture.MessageText, fixture.MessageHtml, fixture.MessageMarkdown, @@ -623,6 +635,7 @@ public void Should_Throw_If_EndColumn_Is_Different(int? expectedValue, int? actu fixture.EndLine, fixture.Column, expectedValue, + fixture.FileLink, fixture.MessageText, fixture.MessageHtml, fixture.MessageMarkdown, @@ -636,6 +649,47 @@ public void Should_Throw_If_EndColumn_Is_Different(int? expectedValue, int? actu result.Message.ShouldStartWith("Expected issue.EndColumn"); } + [Theory] + [InlineData("https://github.com/myorg/myrepo/blob/develop/src/foo.cs#L10-L12", "https://github.com/foo/bar/blob/develop/src/bar.cs")] + [InlineData("https://github.com/myorg/myrepo/blob/develop/src/foo.cs#L10-L12", "https://github.com/myorg/myrepo/blob/develop/src/foo.cs#L10-L13")] + public void Should_Throw_If_FileLink_Is_Different(string expectedValue, string actualValue) + { + // Given + var fixture = new IssueCheckerFixture(); + var issue = + fixture.IssueBuilder + .WithFileLink(new Uri(actualValue)) + .Create(); + + // When + var result = Record.Exception(() => + IssueChecker.Check( + issue, + fixture.ProviderType, + fixture.ProviderName, + fixture.Run, + fixture.Identifier, + fixture.ProjectFileRelativePath, + fixture.ProjectName, + fixture.AffectedFileRelativePath, + fixture.Line, + fixture.EndLine, + fixture.Column, + fixture.EndColumn, + new Uri(expectedValue), + fixture.MessageText, + fixture.MessageHtml, + fixture.MessageMarkdown, + fixture.Priority, + fixture.PriorityName, + fixture.Rule, + fixture.RuleUrl)); + + // Then + result.ShouldBeOfType(); + result.Message.ShouldStartWith("Expected issue.FileLink"); + } + [Theory] [InlineData("Message", "Foo")] [InlineData(null, "Foo")] @@ -661,6 +715,7 @@ public void Should_Throw_If_MessageText_Is_Different(string expectedValue, strin fixture.EndLine, fixture.Column, fixture.EndColumn, + fixture.FileLink, expectedValue, fixture.MessageHtml, fixture.MessageMarkdown, @@ -703,6 +758,7 @@ public void Should_Throw_If_MessageHtml_Is_Different(string expectedValue, strin fixture.EndLine, fixture.Column, fixture.EndColumn, + fixture.FileLink, fixture.MessageText, expectedValue, fixture.MessageMarkdown, @@ -745,6 +801,7 @@ public void Should_Throw_If_MessageMarkdown_Is_Different(string expectedValue, s fixture.EndLine, fixture.Column, fixture.EndColumn, + fixture.FileLink, fixture.MessageText, fixture.MessageHtml, expectedValue, @@ -784,6 +841,7 @@ public void Should_Throw_If_Priority_Is_Different(IssuePriority expectedValue, I fixture.EndLine, fixture.Column, fixture.EndColumn, + fixture.FileLink, fixture.MessageText, fixture.MessageHtml, fixture.MessageMarkdown, @@ -826,6 +884,7 @@ public void Should_Throw_If_PriorityName_Is_Different(string expectedValue, stri fixture.EndLine, fixture.Column, fixture.EndColumn, + fixture.FileLink, fixture.MessageText, fixture.MessageHtml, fixture.MessageMarkdown, @@ -868,6 +927,7 @@ public void Should_Throw_If_Rule_Is_Different(string expectedValue, string actua fixture.EndLine, fixture.Column, fixture.EndColumn, + fixture.FileLink, fixture.MessageText, fixture.MessageHtml, fixture.MessageMarkdown, @@ -907,6 +967,7 @@ public void Should_Throw_If_RuleUrl_Is_Different(string expectedValue, string ac fixture.EndLine, fixture.Column, fixture.EndColumn, + fixture.FileLink, fixture.MessageText, fixture.MessageHtml, fixture.MessageMarkdown, diff --git a/src/Cake.Issues/BaseIssueProvider.cs b/src/Cake.Issues/BaseIssueProvider.cs index 3021b9fd9..b270effe7 100644 --- a/src/Cake.Issues/BaseIssueProvider.cs +++ b/src/Cake.Issues/BaseIssueProvider.cs @@ -6,7 +6,7 @@ /// /// Base class for all issue provider implementations. /// - public abstract class BaseIssueProvider : BaseIssueComponent, IIssueProvider + public abstract class BaseIssueProvider : BaseIssueComponent, IIssueProvider { /// /// Initializes a new instance of the class. @@ -25,14 +25,15 @@ public IEnumerable ReadIssues() { this.AssertInitialized(); - return this.InternalReadIssues(); + return this.InternalReadIssues(this.Settings.FileLinkSettings); } /// /// Gets all issues. /// Compared to it is safe to access Settings from this method. /// + /// Settings which can be used for resolving links to source files. /// List of issues. - protected abstract IEnumerable InternalReadIssues(); + protected abstract IEnumerable InternalReadIssues(FileLinkSettings fileLinkSettings); } } diff --git a/src/Cake.Issues/BaseMultiFormatIssueProvider.cs b/src/Cake.Issues/BaseMultiFormatIssueProvider.cs index 92ebb7042..11f327955 100644 --- a/src/Cake.Issues/BaseMultiFormatIssueProvider.cs +++ b/src/Cake.Issues/BaseMultiFormatIssueProvider.cs @@ -23,7 +23,7 @@ protected BaseMultiFormatIssueProvider(ICakeLog log, TSettings settings) } /// - protected override IEnumerable InternalReadIssues() + protected override IEnumerable InternalReadIssues(FileLinkSettings fileLinkSettings) { return this.IssueProviderSettings.Format.ReadIssues( diff --git a/src/Cake.Issues/IIssue.cs b/src/Cake.Issues/IIssue.cs index 12c78dee6..a0a32e262 100644 --- a/src/Cake.Issues/IIssue.cs +++ b/src/Cake.Issues/IIssue.cs @@ -58,6 +58,12 @@ public interface IIssue /// int? EndColumn { get; } + /// + /// Gets or sets a link to the position in the file where the issue ocurred. + /// null if was not set while reading issue. + /// + Uri FileLink { get; set; } + /// /// Gets the message of the issue in text format. /// diff --git a/src/Cake.Issues/IIssueComparer.cs b/src/Cake.Issues/IIssueComparer.cs index d12925243..dfb3e251e 100644 --- a/src/Cake.Issues/IIssueComparer.cs +++ b/src/Cake.Issues/IIssueComparer.cs @@ -47,6 +47,9 @@ public IIssueComparer() /// /// /// + /// + /// + /// /// /// public IIssueComparer(bool compareOnlyPersistentProperties) @@ -76,6 +79,7 @@ public bool Equals(IIssue x, IIssue y) (this.compareOnlyPersistentProperties || x.EndLine == y.EndLine) && (this.compareOnlyPersistentProperties || x.Column == y.Column) && (this.compareOnlyPersistentProperties || x.EndColumn == y.EndColumn) && + (this.compareOnlyPersistentProperties || x.FileLink == y.FileLink) && (x.MessageText == y.MessageText) && (x.MessageHtml == y.MessageHtml) && (x.MessageMarkdown == y.MessageMarkdown) && @@ -125,6 +129,7 @@ public int GetHashCode(IIssue obj) obj.EndLine, obj.Column, obj.EndColumn, + obj.FileLink, obj.MessageText, obj.MessageHtml, obj.MessageMarkdown, diff --git a/src/Cake.Issues/IIssueExtensions.cs b/src/Cake.Issues/IIssueExtensions.cs index bddc2a009..a846ec126 100644 --- a/src/Cake.Issues/IIssueExtensions.cs +++ b/src/Cake.Issues/IIssueExtensions.cs @@ -160,6 +160,10 @@ public static string FileName(this IIssue issue) /// The value of . /// /// + /// {FileLink} + /// The value of . + /// + /// /// {Rule} /// The value of . /// @@ -211,6 +215,7 @@ public static string ReplaceIssuePattern(this string pattern, IIssue issue) .Replace("{EndLine}", issue.EndLine?.ToString()) .Replace("{Column}", issue.Column?.ToString()) .Replace("{EndColumn}", issue.EndColumn?.ToString()) + .Replace("{FileLink}", issue.FileLink?.ToString()) .Replace("{Rule}", issue.Rule) .Replace("{RuleUrl}", issue.RuleUrl?.ToString()) .Replace("{Run}", issue.Run) diff --git a/src/Cake.Issues/IIssueProvider.cs b/src/Cake.Issues/IIssueProvider.cs index 9c71de5dc..63a6ccb62 100644 --- a/src/Cake.Issues/IIssueProvider.cs +++ b/src/Cake.Issues/IIssueProvider.cs @@ -5,7 +5,7 @@ /// /// Interface describing a provider for issues. /// - public interface IIssueProvider : IBaseIssueComponent + public interface IIssueProvider : IBaseIssueComponent { /// /// Gets the human friendly name of the issue provider. diff --git a/src/Cake.Issues/IReadIssuesSettings.cs b/src/Cake.Issues/IReadIssuesSettings.cs index 02153e250..8adb7ba94 100644 --- a/src/Cake.Issues/IReadIssuesSettings.cs +++ b/src/Cake.Issues/IReadIssuesSettings.cs @@ -9,5 +9,10 @@ public interface IReadIssuesSettings : IRepositorySettings /// Gets or sets the name of the run. /// string Run { get; set; } + + /// + /// Gets or sets settings which can be used for resolving links to source files. + /// + FileLinkSettings FileLinkSettings { get; set; } } } diff --git a/src/Cake.Issues/Issue.cs b/src/Cake.Issues/Issue.cs index eba762e75..a7c7f958b 100644 --- a/src/Cake.Issues/Issue.cs +++ b/src/Cake.Issues/Issue.cs @@ -29,6 +29,8 @@ public class Issue : IIssue /// null if the issue affects the whole file or an asssembly. /// The end of the column range in the file where the issues has occurred. /// null if the issue affects the whole file, an asssembly or only a single column. + /// Link to the position in the file where the issue ocurred. + /// null if no link is available. /// The message of the issue in plain text format. /// The message of the issue in Html format. /// The message of the issue in Markdown format. @@ -52,6 +54,7 @@ public Issue( int? endLine, int? column, int? endColumn, + Uri fileLink, string messageText, string messageHtml, string messageMarkdown, @@ -144,6 +147,7 @@ public Issue( this.EndLine = endLine; this.Column = column; this.EndColumn = endColumn; + this.FileLink = fileLink; this.MessageText = messageText; this.MessageHtml = messageHtml; this.MessageMarkdown = messageMarkdown; @@ -180,6 +184,9 @@ public Issue( /// public int? EndColumn { get; } + /// + public Uri FileLink { get; set; } + /// public string MessageText { get; } diff --git a/src/Cake.Issues/IssueBuilder.cs b/src/Cake.Issues/IssueBuilder.cs index ab09271fa..5058deae7 100644 --- a/src/Cake.Issues/IssueBuilder.cs +++ b/src/Cake.Issues/IssueBuilder.cs @@ -20,6 +20,7 @@ public class IssueBuilder private int? endLine; private int? column; private int? endColumn; + private Uri fileLink; private int? priority; private string priorityName; private string rule; @@ -304,6 +305,20 @@ public IssueBuilder InFile(string filePath, int? startLine, int? endLine, int? s return this; } + /// + /// Sets the the link to the position in the file where the issue ocurred. + /// + /// Link to the position in the file where the issue ocurred. + /// Issue Builder instance. + public IssueBuilder WithFileLink(Uri fileLink) + { + fileLink.NotNull(nameof(fileLink)); + + this.fileLink = fileLink; + + return this; + } + /// /// Sets the priority of the issue. /// @@ -389,6 +404,7 @@ public IIssue Create() this.endLine, this.column, this.endColumn, + this.fileLink, this.messageText, this.messageHtml, this.messageMarkdown, diff --git a/src/Cake.Issues/IssuesReader.cs b/src/Cake.Issues/IssuesReader.cs index 349c8f12b..d64e03af9 100644 --- a/src/Cake.Issues/IssuesReader.cs +++ b/src/Cake.Issues/IssuesReader.cs @@ -59,7 +59,15 @@ public IEnumerable ReadIssues() currentIssues.Count, providerName); - currentIssues.ForEach(x => x.Run = this.settings.Run); + currentIssues.ForEach(x => + { + x.Run = this.settings.Run; + + if (this.settings.FileLinkSettings != null) + { + x.FileLink = this.settings.FileLinkSettings.GetFileLink(x); + } + }); issues.AddRange(currentIssues); } diff --git a/src/Cake.Issues/ReadIssuesSettings.cs b/src/Cake.Issues/ReadIssuesSettings.cs index 6f15dc535..1a4c4e6b9 100644 --- a/src/Cake.Issues/ReadIssuesSettings.cs +++ b/src/Cake.Issues/ReadIssuesSettings.cs @@ -18,5 +18,8 @@ public ReadIssuesSettings(DirectoryPath repositoryRoot) /// public string Run { get; set; } + + /// + public FileLinkSettings FileLinkSettings { get; set; } } } diff --git a/src/Cake.Issues/Serialization/IssueSerializationExtensions.cs b/src/Cake.Issues/Serialization/IssueSerializationExtensions.cs index bbc677b5e..01901bdd0 100644 --- a/src/Cake.Issues/Serialization/IssueSerializationExtensions.cs +++ b/src/Cake.Issues/Serialization/IssueSerializationExtensions.cs @@ -88,6 +88,7 @@ internal static SerializableIssueV3 ToSerializableIssue(this IIssue issue) EndLine = issue.EndLine, Column = issue.Column, EndColumn = issue.EndColumn, + FileLink = issue.FileLink?.ToString(), MessageText = issue.MessageText, MessageMarkdown = issue.MessageMarkdown, MessageHtml = issue.MessageHtml, diff --git a/src/Cake.Issues/Serialization/SerializableIssueExtensions.cs b/src/Cake.Issues/Serialization/SerializableIssueExtensions.cs index b5687e06d..24b479dd9 100644 --- a/src/Cake.Issues/Serialization/SerializableIssueExtensions.cs +++ b/src/Cake.Issues/Serialization/SerializableIssueExtensions.cs @@ -35,6 +35,7 @@ internal static Issue ToIssue(this SerializableIssue serializableIssue) null, null, null, + null, serializableIssue.Message, null, null, diff --git a/src/Cake.Issues/Serialization/SerializableIssueV2Extensions.cs b/src/Cake.Issues/Serialization/SerializableIssueV2Extensions.cs index 8ea394204..3c661919b 100644 --- a/src/Cake.Issues/Serialization/SerializableIssueV2Extensions.cs +++ b/src/Cake.Issues/Serialization/SerializableIssueV2Extensions.cs @@ -35,6 +35,7 @@ internal static Issue ToIssue(this SerializableIssueV2 serializableIssue) null, null, null, + null, serializableIssue.MessageText, serializableIssue.MessageHtml, serializableIssue.MessageMarkdown, diff --git a/src/Cake.Issues/Serialization/SerializableIssueV3.cs b/src/Cake.Issues/Serialization/SerializableIssueV3.cs index 9392cd2ce..5c9ac648a 100644 --- a/src/Cake.Issues/Serialization/SerializableIssueV3.cs +++ b/src/Cake.Issues/Serialization/SerializableIssueV3.cs @@ -52,6 +52,10 @@ public int Version [DataMember] public int? EndColumn { get; set; } + /// + [DataMember] + public string FileLink { get; set; } + /// [DataMember] public string MessageText { get; set; } diff --git a/src/Cake.Issues/Serialization/SerializableIssueV3Extensions.cs b/src/Cake.Issues/Serialization/SerializableIssueV3Extensions.cs index f93bd9bea..e0ea7c239 100644 --- a/src/Cake.Issues/Serialization/SerializableIssueV3Extensions.cs +++ b/src/Cake.Issues/Serialization/SerializableIssueV3Extensions.cs @@ -26,6 +26,12 @@ internal static Issue ToIssue(this SerializableIssueV3 serializableIssue) ruleUrl = new Uri(serializableIssue.RuleUrl); } + Uri fileLink = null; + if (!string.IsNullOrWhiteSpace(serializableIssue.FileLink)) + { + fileLink = new Uri(serializableIssue.FileLink); + } + return new Issue( serializableIssue.Identifier, serializableIssue.ProjectFileRelativePath, @@ -35,6 +41,7 @@ internal static Issue ToIssue(this SerializableIssueV3 serializableIssue) serializableIssue.EndLine, serializableIssue.Column, serializableIssue.EndColumn, + fileLink, serializableIssue.MessageText, serializableIssue.MessageHtml, serializableIssue.MessageMarkdown,