diff --git a/Octokit.Tests/Helpers/UriExtensionsTests.cs b/Octokit.Tests/Helpers/UriExtensionsTests.cs new file mode 100644 index 00000000..16798027 --- /dev/null +++ b/Octokit.Tests/Helpers/UriExtensionsTests.cs @@ -0,0 +1,59 @@ +using System; +using System.Collections.Generic; +using Xunit; + +namespace Octokit.Tests.Helpers +{ + public class UriExtensionsTests + { + public class TheApplyParametersMethod + { + [Fact] + public void AppendsParametersAsQueryString() + { + var uri = new Uri("https://example.com"); + + var uriWithParameters = uri.ApplyParameters(new Dictionary + { + {"foo", "fooval"}, + {"bar", "barval"} + }); + + Assert.Equal(new Uri("https://example.com?foo=fooval&bar=barval"), uriWithParameters); + } + + [Fact] + public void OverwritesExistingParameters() + { + var uri = new Uri("https://example.com?crap=crapola"); + + var uriWithParameters = uri.ApplyParameters(new Dictionary + { + {"foo", "fooval"}, + {"bar", "barval"} + }); + + Assert.Equal(new Uri("https://example.com?foo=fooval&bar=barval"), uriWithParameters); + } + + [Fact] + public void DoesNotChangeUrlWhenParametersIsNullOrEmpty() + { + var uri = new Uri("https://example.com"); + + var uriWithNullParameters = uri.ApplyParameters(null); + var uriWithEmptyParameters = uri.ApplyParameters(new Dictionary()); + + Assert.Same(uri, uriWithNullParameters); + Assert.Equal(uri, uriWithEmptyParameters); + } + + [Fact] + public void EnsuresUriNotNull() + { + Uri uri = null; + Assert.Throws(() => uri.ApplyParameters(new Dictionary())); + } + } + } +} diff --git a/Octokit.Tests/Octokit.Tests.csproj b/Octokit.Tests/Octokit.Tests.csproj index caf9157e..56f30b36 100644 --- a/Octokit.Tests/Octokit.Tests.csproj +++ b/Octokit.Tests/Octokit.Tests.csproj @@ -55,6 +55,7 @@ + diff --git a/Octokit/Helpers/UriExtensions.cs b/Octokit/Helpers/UriExtensions.cs new file mode 100644 index 00000000..cb5b3436 --- /dev/null +++ b/Octokit/Helpers/UriExtensions.cs @@ -0,0 +1,22 @@ +using System; +using System.Collections.Generic; +using System.Linq; + +namespace Octokit +{ + public static class UriExtensions + { + public static Uri ApplyParameters(this Uri uri, IDictionary parameters) + { + Ensure.ArgumentNotNull(uri, "uri"); + + if (parameters == null) return uri; + + var uriBuilder = new UriBuilder(uri) + { + Query = String.Join("&", parameters.Select(kvp => kvp.Key + "=" + kvp.Value)) + }; + return uriBuilder.Uri; + } + } +} diff --git a/Octokit/Octokit.csproj b/Octokit/Octokit.csproj index 37a8a39b..a61a0f13 100644 --- a/Octokit/Octokit.csproj +++ b/Octokit/Octokit.csproj @@ -48,6 +48,7 @@ + diff --git a/Octokit/OctokitRT.csproj b/Octokit/OctokitRT.csproj index 03f880a4..4b098600 100644 --- a/Octokit/OctokitRT.csproj +++ b/Octokit/OctokitRT.csproj @@ -116,6 +116,7 @@ +