From 4bc089d2cb4786022b755b4bac900eb6fbc20a2d Mon Sep 17 00:00:00 2001 From: Hisham Bin Ateya Date: Sat, 4 Apr 2020 13:13:26 +0300 Subject: [PATCH 1/4] Simplify NavigateUrl using UriBuilder --- Oqtane.Shared/Shared/Utilities.cs | 31 +++++++++---------------------- 1 file changed, 9 insertions(+), 22 deletions(-) diff --git a/Oqtane.Shared/Shared/Utilities.cs b/Oqtane.Shared/Shared/Utilities.cs index 6c2825fc..6e446d31 100644 --- a/Oqtane.Shared/Shared/Utilities.cs +++ b/Oqtane.Shared/Shared/Utilities.cs @@ -14,30 +14,17 @@ namespace Oqtane.Shared var assemblyName = assemblyFullName.Substring(0, assemblyFullName.IndexOf(",", StringComparison.Ordinal)); return $"{type.Namespace}, {assemblyName}"; } + public static string NavigateUrl(string alias, string path, string parameters) { - string url = ""; - if (alias != "") - { - url += alias + "/"; - } - if (path != "" && path != "/") - { - url += path + "/"; - } - if (url.EndsWith("/")) - { - url = url.Substring(0, url.Length - 1); - } - if (!string.IsNullOrEmpty(parameters)) - { - url += "?" + parameters; - } - if (!url.StartsWith("/")) - { - url = "/" + url; - } - return url; + var uriBuilder = alias == string.Empty + ? new UriBuilder() + : new UriBuilder(alias); + + uriBuilder.Path = path; + uriBuilder.Query = parameters; + + return uriBuilder.Uri.AbsoluteUri; } public static string EditUrl(string alias, string path, int moduleid, string action, string parameters) From d406118d186569b0daa750827477db89857fd617 Mon Sep 17 00:00:00 2001 From: Hisham Bin Ateya Date: Sat, 4 Apr 2020 13:13:40 +0300 Subject: [PATCH 2/4] Add unit tests --- .../Oqtane.Shared.Tests/UtilitiesTests.cs | 37 +++++++++++++++++++ 1 file changed, 37 insertions(+) create mode 100644 Oqtane.Test/Oqtane.Shared.Tests/UtilitiesTests.cs diff --git a/Oqtane.Test/Oqtane.Shared.Tests/UtilitiesTests.cs b/Oqtane.Test/Oqtane.Shared.Tests/UtilitiesTests.cs new file mode 100644 index 00000000..2966e8d0 --- /dev/null +++ b/Oqtane.Test/Oqtane.Shared.Tests/UtilitiesTests.cs @@ -0,0 +1,37 @@ +using Oqtane.Shared; +using Xunit; + +namespace Oqtane.Test.Oqtane.Shared.Tests +{ + public class UtilitiesTests + { + [Theory] + [InlineData("contoso", "login", "returnUrl=/admin", "http://contoso/login?returnUrl=/admin")] + [InlineData("contoso", "admin", "", "http://contoso/admin")] + [InlineData("contoso", "", "pageId=4", "http://contoso/?pageId=4")] + [InlineData("contoso", "", "", "http://contoso/")] + [InlineData("http://contoso", "login", "returnUrl=/admin", "http://contoso/login?returnUrl=/admin")] + [InlineData("http://contoso", "admin", "", "http://contoso/admin")] + [InlineData("http://contoso", "", "pageId=4", "http://contoso/?pageId=4")] + [InlineData("http://contoso", "", "", "http://contoso/")] + [InlineData("https://contoso", "login", "returnUrl=/admin", "https://contoso/login?returnUrl=/admin")] + [InlineData("https://contoso", "admin", "", "https://contoso/admin")] + [InlineData("https://contoso", "", "pageId=4", "https://contoso/?pageId=4")] + [InlineData("https://contoso", "", "", "https://contoso/")] + [InlineData("", "login", "returnUrl=/admin", "http://localhost/login?returnUrl=/admin")] + [InlineData("", "admin", "", "http://localhost/admin")] + [InlineData("", "", "pageId=4", "http://localhost/?pageId=4")] + [InlineData("", "", "", "http://localhost/")] + public void NavigateUrlTest(string alias, string path, string parameters, string expectedUrl) + { + // Arrange + var navigatedUrl = string.Empty; + + // Act + navigatedUrl = Utilities.NavigateUrl(alias, path, parameters); + + // Assert + Assert.Equal(expectedUrl, navigatedUrl); + } + } +} From a2f756729c4f6989836d4b42ba76ca06ea350e72 Mon Sep 17 00:00:00 2001 From: Hisham Bin Ateya Date: Sun, 5 Apr 2020 01:14:12 +0300 Subject: [PATCH 3/4] Use relative path instead --- Oqtane.Shared/Oqtane.Shared.csproj | 1 + Oqtane.Shared/Shared/Utilities.cs | 29 +++++++++++++++---- .../Oqtane.Shared.Tests/UtilitiesTests.cs | 26 +++++++---------- 3 files changed, 34 insertions(+), 22 deletions(-) diff --git a/Oqtane.Shared/Oqtane.Shared.csproj b/Oqtane.Shared/Oqtane.Shared.csproj index 6a0c0d87..01053668 100644 --- a/Oqtane.Shared/Oqtane.Shared.csproj +++ b/Oqtane.Shared/Oqtane.Shared.csproj @@ -18,6 +18,7 @@ + diff --git a/Oqtane.Shared/Shared/Utilities.cs b/Oqtane.Shared/Shared/Utilities.cs index 6e446d31..c828e9e9 100644 --- a/Oqtane.Shared/Shared/Utilities.cs +++ b/Oqtane.Shared/Shared/Utilities.cs @@ -2,6 +2,8 @@ using System.Globalization; using System.Text; using System.Text.RegularExpressions; +using Microsoft.AspNetCore.Http; +using Microsoft.AspNetCore.Http.Extensions; namespace Oqtane.Shared { @@ -17,14 +19,29 @@ namespace Oqtane.Shared public static string NavigateUrl(string alias, string path, string parameters) { - var uriBuilder = alias == string.Empty - ? new UriBuilder() - : new UriBuilder(alias); + if (!alias.StartsWith("/")) + { + alias = $"/{alias}"; + } - uriBuilder.Path = path; - uriBuilder.Query = parameters; + if (!path.StartsWith("/")) + { + path = $"/{path}"; + } - return uriBuilder.Uri.AbsoluteUri; + var pathPaseValue = alias == string.Empty + ? default + : new PathString(alias); + + var pathValue = path == string.Empty + ? default + : new PathString(path); + + var queryStringValue = parameters == string.Empty + ? default + : new QueryString($"?{parameters}"); + + return UriHelper.BuildRelative(pathPaseValue, pathValue, queryStringValue); } public static string EditUrl(string alias, string path, int moduleid, string action, string parameters) diff --git a/Oqtane.Test/Oqtane.Shared.Tests/UtilitiesTests.cs b/Oqtane.Test/Oqtane.Shared.Tests/UtilitiesTests.cs index 2966e8d0..ccafa193 100644 --- a/Oqtane.Test/Oqtane.Shared.Tests/UtilitiesTests.cs +++ b/Oqtane.Test/Oqtane.Shared.Tests/UtilitiesTests.cs @@ -6,22 +6,16 @@ namespace Oqtane.Test.Oqtane.Shared.Tests public class UtilitiesTests { [Theory] - [InlineData("contoso", "login", "returnUrl=/admin", "http://contoso/login?returnUrl=/admin")] - [InlineData("contoso", "admin", "", "http://contoso/admin")] - [InlineData("contoso", "", "pageId=4", "http://contoso/?pageId=4")] - [InlineData("contoso", "", "", "http://contoso/")] - [InlineData("http://contoso", "login", "returnUrl=/admin", "http://contoso/login?returnUrl=/admin")] - [InlineData("http://contoso", "admin", "", "http://contoso/admin")] - [InlineData("http://contoso", "", "pageId=4", "http://contoso/?pageId=4")] - [InlineData("http://contoso", "", "", "http://contoso/")] - [InlineData("https://contoso", "login", "returnUrl=/admin", "https://contoso/login?returnUrl=/admin")] - [InlineData("https://contoso", "admin", "", "https://contoso/admin")] - [InlineData("https://contoso", "", "pageId=4", "https://contoso/?pageId=4")] - [InlineData("https://contoso", "", "", "https://contoso/")] - [InlineData("", "login", "returnUrl=/admin", "http://localhost/login?returnUrl=/admin")] - [InlineData("", "admin", "", "http://localhost/admin")] - [InlineData("", "", "pageId=4", "http://localhost/?pageId=4")] - [InlineData("", "", "", "http://localhost/")] + [InlineData("contoso", "login", "returnUrl=/admin", "/contoso/login?returnUrl=/admin")] + [InlineData("contoso", "admin", "", "/contoso/admin")] + [InlineData("contoso", "", "pageId=4", "/contoso/?pageId=4")] + [InlineData("contoso", "", "pageId=4&moduleId=10", "/contoso/?pageId=4&moduleId=10")] + [InlineData("contoso", "", "", "/contoso/")] + [InlineData("", "login", "returnUrl=/admin", "/login?returnUrl=/admin")] + [InlineData("", "admin", "", "/admin")] + [InlineData("", "", "pageId=4", "/?pageId=4")] + [InlineData("", "", "pageId=4&moduleId=10", "/?pageId=4&moduleId=10")] + [InlineData("", "", "", "/")] public void NavigateUrlTest(string alias, string path, string parameters, string expectedUrl) { // Arrange From e10015c11a2960c1c3e51e1d6fb9fa1282cd78ba Mon Sep 17 00:00:00 2001 From: Hisham Bin Ateya Date: Mon, 6 Apr 2020 20:54:55 +0300 Subject: [PATCH 4/4] Address feedback --- Oqtane.Shared/Oqtane.Shared.csproj | 1 - Oqtane.Shared/Shared/Utilities.cs | 30 +++++-------------- .../Oqtane.Shared.Tests/UtilitiesTests.cs | 8 ++--- 3 files changed, 11 insertions(+), 28 deletions(-) diff --git a/Oqtane.Shared/Oqtane.Shared.csproj b/Oqtane.Shared/Oqtane.Shared.csproj index 01053668..6a0c0d87 100644 --- a/Oqtane.Shared/Oqtane.Shared.csproj +++ b/Oqtane.Shared/Oqtane.Shared.csproj @@ -18,7 +18,6 @@ - diff --git a/Oqtane.Shared/Shared/Utilities.cs b/Oqtane.Shared/Shared/Utilities.cs index c828e9e9..fe7817d0 100644 --- a/Oqtane.Shared/Shared/Utilities.cs +++ b/Oqtane.Shared/Shared/Utilities.cs @@ -2,8 +2,6 @@ using System.Globalization; using System.Text; using System.Text.RegularExpressions; -using Microsoft.AspNetCore.Http; -using Microsoft.AspNetCore.Http.Extensions; namespace Oqtane.Shared { @@ -19,29 +17,15 @@ namespace Oqtane.Shared public static string NavigateUrl(string alias, string path, string parameters) { - if (!alias.StartsWith("/")) + var uriBuilder = new UriBuilder { - alias = $"/{alias}"; - } + Path = !string.IsNullOrEmpty(alias) + ? $"{alias}/{path}" + : $"{path}", + Query = parameters + }; - if (!path.StartsWith("/")) - { - path = $"/{path}"; - } - - var pathPaseValue = alias == string.Empty - ? default - : new PathString(alias); - - var pathValue = path == string.Empty - ? default - : new PathString(path); - - var queryStringValue = parameters == string.Empty - ? default - : new QueryString($"?{parameters}"); - - return UriHelper.BuildRelative(pathPaseValue, pathValue, queryStringValue); + return uriBuilder.Uri.PathAndQuery; } public static string EditUrl(string alias, string path, int moduleid, string action, string parameters) diff --git a/Oqtane.Test/Oqtane.Shared.Tests/UtilitiesTests.cs b/Oqtane.Test/Oqtane.Shared.Tests/UtilitiesTests.cs index ccafa193..c5de08e4 100644 --- a/Oqtane.Test/Oqtane.Shared.Tests/UtilitiesTests.cs +++ b/Oqtane.Test/Oqtane.Shared.Tests/UtilitiesTests.cs @@ -8,13 +8,13 @@ namespace Oqtane.Test.Oqtane.Shared.Tests [Theory] [InlineData("contoso", "login", "returnUrl=/admin", "/contoso/login?returnUrl=/admin")] [InlineData("contoso", "admin", "", "/contoso/admin")] - [InlineData("contoso", "", "pageId=4", "/contoso/?pageId=4")] - [InlineData("contoso", "", "pageId=4&moduleId=10", "/contoso/?pageId=4&moduleId=10")] + [InlineData("contoso", "", "pageId=4", "/contoso?pageId=4")] + [InlineData("contoso", "", "pageId=4&moduleId=10", "/contoso?pageId=4&moduleId=10")] [InlineData("contoso", "", "", "/contoso/")] [InlineData("", "login", "returnUrl=/admin", "/login?returnUrl=/admin")] [InlineData("", "admin", "", "/admin")] - [InlineData("", "", "pageId=4", "/?pageId=4")] - [InlineData("", "", "pageId=4&moduleId=10", "/?pageId=4&moduleId=10")] + [InlineData("", "", "pageId=4", "?pageId=4")] + [InlineData("", "", "pageId=4&moduleId=10", "?pageId=4&moduleId=10")] [InlineData("", "", "", "/")] public void NavigateUrlTest(string alias, string path, string parameters, string expectedUrl) {