diff --git a/Octokit.Tests.Integration/Clients/RepositoryForksClientTests.cs b/Octokit.Tests.Integration/Clients/RepositoryForksClientTests.cs index 621180b6..892e4550 100644 --- a/Octokit.Tests.Integration/Clients/RepositoryForksClientTests.cs +++ b/Octokit.Tests.Integration/Clients/RepositoryForksClientTests.cs @@ -10,7 +10,7 @@ namespace Octokit.Tests.Integration.Clients public class TheGetMethod { [IntegrationTest] - public async Task ReturnsForksForProject() + public async Task ReturnsForksForRepository() { var github = Helper.GetAuthenticatedClient(); @@ -20,6 +20,20 @@ namespace Octokit.Tests.Integration.Clients Assert.NotNull(masterFork); Assert.Equal("TeamBinary", masterFork.Owner.Login); } + + [IntegrationTest] + public async Task ReturnsForksForRepositorySortingTheResultWithOldestFirst() + { + var github = Helper.GetAuthenticatedClient(); + + var actualForks = (await github.Repository.Forks.Get("octokit", "octokit.net", new RepositoryForksListRequest { Sort = Sort.Oldest })).ToArray(); + var sortedForks = actualForks.OrderBy(fork => fork.CreatedAt).ToArray(); + + for (var index = 0; index < actualForks.Length; index++) + { + Assert.Equal(sortedForks[index].FullName, actualForks[index].FullName); + } + } } public class TheCreateMethod diff --git a/Octokit.Tests/Clients/RepositoryForksClientTests.cs b/Octokit.Tests/Clients/RepositoryForksClientTests.cs index d640ef88..56da3833 100644 --- a/Octokit.Tests/Clients/RepositoryForksClientTests.cs +++ b/Octokit.Tests/Clients/RepositoryForksClientTests.cs @@ -1,7 +1,8 @@ -using System; -using System.Threading.Tasks; -using NSubstitute; +using NSubstitute; using Octokit.Tests.Helpers; +using System; +using System.Collections.Generic; +using System.Threading.Tasks; using Xunit; namespace Octokit.Tests.Clients @@ -21,6 +22,19 @@ namespace Octokit.Tests.Clients connection.Received().GetAll(Arg.Is(u => u.ToString() == "repos/fake/repo/forks")); } + [Fact] + public void RequestsCorrectUrlWithRequestParameters() + { + var connection = Substitute.For(); + var client = new RepositoriesClient(connection); + + client.Forks.Get("fake", "repo", new RepositoryForksListRequest{Sort = Sort.Stargazers}); + + connection.Received().GetAll( + Arg.Is(u => u.ToString() == "repos/fake/repo/forks"), + Arg.Is>(d => d["sort"] == "stargazers")); + } + [Fact] public async Task EnsuresNonNullArguments() { diff --git a/Octokit/Clients/IRepositoryForksClient.cs b/Octokit/Clients/IRepositoryForksClient.cs index 049e2969..4fae2c86 100644 --- a/Octokit/Clients/IRepositoryForksClient.cs +++ b/Octokit/Clients/IRepositoryForksClient.cs @@ -14,6 +14,14 @@ namespace Octokit [SuppressMessage("Microsoft.Naming", "CA1716:IdentifiersShouldNotMatchKeywords", MessageId = "Get", Justification = "This is ok; we're matching HTTP verbs not keyworks")] Task> Get(string owner, string repositoryName); + /// + /// Gets the list of forks defined for a repository + /// + /// See API documentation for more information. + /// + [SuppressMessage("Microsoft.Naming", "CA1716:IdentifiersShouldNotMatchKeywords", MessageId = "Get", Justification = "This is ok; we're matching HTTP verbs not keyworks")] + Task> Get(string owner, string repositoryName, RepositoryForksListRequest request); + /// /// Creates a fork for a repository. Specify organization in the fork parameter to create for an organization. /// diff --git a/Octokit/Clients/RepositoryForksClient.cs b/Octokit/Clients/RepositoryForksClient.cs index aa346aad..1fb49c2b 100644 --- a/Octokit/Clients/RepositoryForksClient.cs +++ b/Octokit/Clients/RepositoryForksClient.cs @@ -9,7 +9,8 @@ namespace Octokit /// Initializes a new GitHub Repos Fork API client. /// /// An API connection. - public RepositoryForksClient(IApiConnection apiConnection) : base(apiConnection) + public RepositoryForksClient(IApiConnection apiConnection) + : base(apiConnection) { } @@ -19,11 +20,24 @@ namespace Octokit /// See API documentation for more information. /// public Task> Get(string owner, string repositoryName) + { + return Get(owner, repositoryName, null); + } + + /// + /// Gets the list of forks defined for a repository + /// + /// See API documentation for more information. + /// + public Task> Get(string owner, string repositoryName, RepositoryForksListRequest request) { Ensure.ArgumentNotNullOrEmptyString(owner, "owner"); Ensure.ArgumentNotNullOrEmptyString(repositoryName, "repositoryName"); - return ApiConnection.GetAll(ApiUrls.RepositoryForks(owner, repositoryName)); + if (request == null) + return ApiConnection.GetAll(ApiUrls.RepositoryForks(owner, repositoryName)); + else + return ApiConnection.GetAll(ApiUrls.RepositoryForks(owner, repositoryName), request.ToParametersDictionary()); } /// diff --git a/Octokit/Models/Request/RepositoryForksListRequest.cs b/Octokit/Models/Request/RepositoryForksListRequest.cs new file mode 100644 index 00000000..1b80d2a2 --- /dev/null +++ b/Octokit/Models/Request/RepositoryForksListRequest.cs @@ -0,0 +1,39 @@ +using Octokit.Internal; +using System; +using System.Diagnostics; +using System.Globalization; + +namespace Octokit +{ + [DebuggerDisplay("{DebuggerDisplay,nq}")] + public class RepositoryForksListRequest : RequestParameters + { + public RepositoryForksListRequest() + { + Sort = Sort.Newest; // Default in accordance with the documentation + } + + [Parameter(Key = "sort")] + public Sort Sort { get; set; } + + internal string DebuggerDisplay + { + get + { + return String.Format(CultureInfo.InvariantCulture, "Sort: {0}", Sort); + } + } + } + + public enum Sort + { + [Parameter(Value = "newest")] + Newest, + + [Parameter(Value = "oldest")] + Oldest, + + [Parameter(Value = "stargazers")] + Stargazers + } +} diff --git a/Octokit/Octokit-Mono.csproj b/Octokit/Octokit-Mono.csproj index 1d9a131f..5ee1713a 100644 --- a/Octokit/Octokit-Mono.csproj +++ b/Octokit/Octokit-Mono.csproj @@ -388,6 +388,7 @@ + \ No newline at end of file diff --git a/Octokit/Octokit-MonoAndroid.csproj b/Octokit/Octokit-MonoAndroid.csproj index ab7d8ffb..0ff13e05 100644 --- a/Octokit/Octokit-MonoAndroid.csproj +++ b/Octokit/Octokit-MonoAndroid.csproj @@ -400,6 +400,7 @@ + \ No newline at end of file diff --git a/Octokit/Octokit-Monotouch.csproj b/Octokit/Octokit-Monotouch.csproj index 64be446f..502b6157 100644 --- a/Octokit/Octokit-Monotouch.csproj +++ b/Octokit/Octokit-Monotouch.csproj @@ -393,6 +393,7 @@ + diff --git a/Octokit/Octokit-Portable.csproj b/Octokit/Octokit-Portable.csproj index 458a24c2..6ad253d9 100644 --- a/Octokit/Octokit-Portable.csproj +++ b/Octokit/Octokit-Portable.csproj @@ -386,6 +386,7 @@ + diff --git a/Octokit/Octokit-netcore45.csproj b/Octokit/Octokit-netcore45.csproj index e33d7286..a39ea609 100644 --- a/Octokit/Octokit-netcore45.csproj +++ b/Octokit/Octokit-netcore45.csproj @@ -390,6 +390,7 @@ + diff --git a/Octokit/Octokit.csproj b/Octokit/Octokit.csproj index f05330f8..fbab6a1f 100644 --- a/Octokit/Octokit.csproj +++ b/Octokit/Octokit.csproj @@ -84,6 +84,7 @@ +