diff --git a/Octokit.Reactive/Clients/IObservableRepositoryForksClient.cs b/Octokit.Reactive/Clients/IObservableRepositoryForksClient.cs index bac871d5..ccc58d70 100644 --- a/Octokit.Reactive/Clients/IObservableRepositoryForksClient.cs +++ b/Octokit.Reactive/Clients/IObservableRepositoryForksClient.cs @@ -2,20 +2,72 @@ namespace Octokit.Reactive { + /// + /// A client for GitHub's Repository Forks API. + /// + /// + /// See the Forks API documentation for more information. + /// public interface IObservableRepositoryForksClient { /// /// Gets the list of forks defined for a repository /// - /// See API documentation for more information. - /// - IObservable GetAll(string owner, string repositoryName, RepositoryForksListRequest request); + /// + /// See API documentation for more information. + /// + /// The owner of the repository + /// The name of the repository + /// A of s representing forks of specified repository. + IObservable GetAll(string owner, string name); + + /// + /// Gets the list of forks defined for a repository + /// + /// + /// See API documentation for more information. + /// + /// The owner of the repository + /// The name of the repository + /// Options for changing the API response + /// A of s representing forks of specified repository. + IObservable GetAll(string owner, string name, ApiOptions options); + + /// + /// Gets the list of forks defined for a repository + /// + /// + /// See API documentation for more information. + /// + /// The owner of the repository + /// The name of the repository + /// Used to request and filter a list of repository forks + /// A of s representing forks of specified repository. + IObservable GetAll(string owner, string name, RepositoryForksListRequest request); + + /// + /// Gets the list of forks defined for a repository + /// + /// + /// See API documentation for more information. + /// + /// The owner of the repository + /// The name of the repository + /// Used to request and filter a list of repository forks + /// Options for changing the API response + /// A of s representing forks of specified repository. + IObservable GetAll(string owner, string name, RepositoryForksListRequest request, ApiOptions options); /// /// Creates a fork for a repository. Specify organization in the fork parameter to create for an organization. /// - /// See API documentation for more information. - /// - IObservable Create(string owner, string repositoryName, NewRepositoryFork fork); + /// + /// See API documentation for more information. + /// + /// The owner of the repository + /// The name of the repository + /// Used to fork a repository + /// A of representing the created fork of specified repository. + IObservable Create(string owner, string name, NewRepositoryFork fork); } } diff --git a/Octokit.Reactive/Clients/ObservableRepositoryForksClient.cs b/Octokit.Reactive/Clients/ObservableRepositoryForksClient.cs index 3238cd6c..25b0b325 100644 --- a/Octokit.Reactive/Clients/ObservableRepositoryForksClient.cs +++ b/Octokit.Reactive/Clients/ObservableRepositoryForksClient.cs @@ -4,6 +4,12 @@ using Octokit.Reactive.Internal; namespace Octokit.Reactive { + /// + /// A client for GitHub's Repository Forks API. + /// + /// + /// See the Forks API documentation for more information. + /// public class ObservableRepositoryForksClient : IObservableRepositoryForksClient { readonly IRepositoryForksClient _client; @@ -16,6 +22,7 @@ namespace Octokit.Reactive public ObservableRepositoryForksClient(IGitHubClient client) { Ensure.ArgumentNotNull(client, "client"); + _client = client.Repository.Forks; _connection = client.Connection; } @@ -23,30 +30,95 @@ namespace Octokit.Reactive /// /// Gets the list of forks defined for a repository /// - /// See API documentation for more information. - /// - public IObservable GetAll(string owner, string repositoryName, RepositoryForksListRequest request) + /// + /// See API documentation for more information. + /// + /// The owner of the repository + /// The name of the repository + /// A of s representing forks of specified repository. + public IObservable GetAll(string owner, string name) { Ensure.ArgumentNotNullOrEmptyString(owner, "owner"); - Ensure.ArgumentNotNullOrEmptyString(repositoryName, "repositoryName"); + Ensure.ArgumentNotNullOrEmptyString(name, "name"); - return request == null - ? _connection.GetAndFlattenAllPages(ApiUrls.RepositoryForks(owner, repositoryName)) - : _connection.GetAndFlattenAllPages(ApiUrls.RepositoryForks(owner, repositoryName), request.ToParametersDictionary()); + return GetAll(owner, name, ApiOptions.None); + } + + /// + /// Gets the list of forks defined for a repository + /// + /// + /// See API documentation for more information. + /// + /// The owner of the repository + /// The name of the repository + /// Options for changing the API response + /// A of s representing forks of specified repository. + public IObservable GetAll(string owner, string name, ApiOptions options) + { + Ensure.ArgumentNotNullOrEmptyString(owner, "owner"); + Ensure.ArgumentNotNullOrEmptyString(name, "name"); + Ensure.ArgumentNotNull(options, "options"); + + return _connection.GetAndFlattenAllPages(ApiUrls.RepositoryForks(owner, name), options); + } + + /// + /// Gets the list of forks defined for a repository + /// + /// + /// See API documentation for more information. + /// + /// The owner of the repository + /// The name of the repository + /// Used to request and filter a list of repository forks + /// A of s representing forks of specified repository. + public IObservable GetAll(string owner, string name, RepositoryForksListRequest request) + { + Ensure.ArgumentNotNullOrEmptyString(owner, "owner"); + Ensure.ArgumentNotNullOrEmptyString(name, "name"); + + return GetAll(owner, name, request, ApiOptions.None); + } + + /// + /// Gets the list of forks defined for a repository + /// + /// + /// See API documentation for more information. + /// + /// The owner of the repository + /// The name of the repository + /// Used to request and filter a list of repository forks + /// Options for changing the API response + /// A of s representing forks of specified repository. + public IObservable GetAll(string owner, string name, RepositoryForksListRequest request, ApiOptions options) + { + Ensure.ArgumentNotNullOrEmptyString(owner, "owner"); + Ensure.ArgumentNotNullOrEmptyString(name, "name"); + Ensure.ArgumentNotNull(options, "options"); + + return request == null ? _connection.GetAndFlattenAllPages(ApiUrls.RepositoryForks(owner, name), options) : + _connection.GetAndFlattenAllPages(ApiUrls.RepositoryForks(owner, name), request.ToParametersDictionary(), options); } /// /// Creates a fork for a repository. Specify organization in the fork parameter to create for an organization. /// - /// See API documentation for more information. - /// - public IObservable Create(string owner, string repositoryName, NewRepositoryFork fork) + /// + /// See API documentation for more information. + /// + /// The owner of the repository + /// The name of the repository + /// Used to fork a repository + /// A of representing the created fork of specified repository. + public IObservable Create(string owner, string name, NewRepositoryFork fork) { Ensure.ArgumentNotNullOrEmptyString(owner, "owner"); - Ensure.ArgumentNotNullOrEmptyString(repositoryName, "repositoryName"); + Ensure.ArgumentNotNullOrEmptyString(name, "name"); Ensure.ArgumentNotNull(fork, "fork"); - return _client.Create(owner, repositoryName, fork).ToObservable(); + return _client.Create(owner, name, fork).ToObservable(); } } } \ No newline at end of file diff --git a/Octokit.Tests.Integration/Clients/RepositoryForksClientTests.cs b/Octokit.Tests.Integration/Clients/RepositoryForksClientTests.cs index c1b64c6b..1898f397 100644 --- a/Octokit.Tests.Integration/Clients/RepositoryForksClientTests.cs +++ b/Octokit.Tests.Integration/Clients/RepositoryForksClientTests.cs @@ -13,13 +13,183 @@ namespace Octokit.Tests.Integration.Clients { var github = Helper.GetAuthenticatedClient(); - var forks = await github.Repository.Forks.GetAll("octokit", "octokit.net", null); + var forks = await github.Repository.Forks.GetAll("octokit", "octokit.net"); var masterFork = forks.FirstOrDefault(fork => fork.FullName == "TeamBinary/octokit.net"); Assert.NotNull(masterFork); Assert.Equal("TeamBinary", masterFork.Owner.Login); } + [IntegrationTest] + public async Task ReturnsCorrectCountOfForksWithoutStart() + { + var github = Helper.GetAuthenticatedClient(); + + var options = new ApiOptions + { + PageCount = 1, + PageSize = 1 + }; + + var forks = await github.Repository.Forks.GetAll("octokit", "octokit.net", options); + + Assert.Equal(1, forks.Count); + } + + [IntegrationTest] + public async Task ReturnsCorrectCountOfForksWithStart() + { + var github = Helper.GetAuthenticatedClient(); + + var options = new ApiOptions + { + PageCount = 1, + PageSize = 1, + StartPage = 1 + }; + + var forks = await github.Repository.Forks.GetAll("octokit", "octokit.net", options); + + Assert.Equal(1, forks.Count); + } + + [IntegrationTest] + public async Task ReturnsDistinctForksBasedOnStartPage() + { + var github = Helper.GetAuthenticatedClient(); + + var startOptions = new ApiOptions + { + PageCount = 1, + PageSize = 3, + StartPage = 1 + }; + + var firstPage = await github.Repository.Forks.GetAll("octokit", "octokit.net", startOptions); + + var skipStartOptions = new ApiOptions + { + PageCount = 1, + PageSize = 3, + StartPage = 2 + }; + + var secondPage = await github.Repository.Forks.GetAll("octokit", "octokit.net", skipStartOptions); + + Assert.Equal(3, firstPage.Count); + Assert.Equal(3, secondPage.Count); + Assert.NotEqual(firstPage[0].Id, secondPage[0].Id); + Assert.NotEqual(firstPage[1].Id, secondPage[1].Id); + Assert.NotEqual(firstPage[2].Id, secondPage[2].Id); + } + + [IntegrationTest] + public async Task ReturnsCorrectCountOfForksWithoutStartParameterized() + { + var github = Helper.GetAuthenticatedClient(); + + var options = new ApiOptions + { + PageCount = 1, + PageSize = 1 + }; + + var repositoryForksListRequest = new RepositoryForksListRequest { Sort = Sort.Newest }; + + var forks = await github.Repository.Forks.GetAll("octokit", "octokit.net", repositoryForksListRequest, options); + + Assert.Equal(1, forks.Count); + } + + [IntegrationTest] + public async Task ReturnsCorrectCountOfForksWithStartParameterized() + { + var github = Helper.GetAuthenticatedClient(); + + var options = new ApiOptions + { + PageCount = 1, + PageSize = 1, + StartPage = 1 + }; + + var repositoryForksListRequest = new RepositoryForksListRequest { Sort = Sort.Newest }; + + var forks = await github.Repository.Forks.GetAll("octokit", "octokit.net", repositoryForksListRequest, options); + + Assert.Equal(1, forks.Count); + } + + [IntegrationTest] + public async Task ReturnsDistinctForksBasedOnStartPageParameterized() + { + var github = Helper.GetAuthenticatedClient(); + + var repositoryForksListRequest = new RepositoryForksListRequest { Sort = Sort.Newest }; + + var startOptions = new ApiOptions + { + PageCount = 1, + PageSize = 3, + StartPage = 1 + }; + + var firstPage = await github.Repository.Forks.GetAll("octokit", "octokit.net", repositoryForksListRequest, startOptions); + + var skipStartOptions = new ApiOptions + { + PageCount = 1, + PageSize = 3, + StartPage = 2 + }; + + var secondPage = await github.Repository.Forks.GetAll("octokit", "octokit.net", repositoryForksListRequest, skipStartOptions); + + Assert.Equal(3, firstPage.Count); + Assert.Equal(3, secondPage.Count); + Assert.NotEqual(firstPage[0].Id, secondPage[0].Id); + Assert.NotEqual(firstPage[1].Id, secondPage[1].Id); + Assert.NotEqual(firstPage[2].Id, secondPage[2].Id); + } + + [IntegrationTest] + public async Task ReturnsForksForRepositorySortingTheResultWithOldestFirstWithApiOptions() + { + var github = Helper.GetAuthenticatedClient(); + + var repositoryForksListRequest = new RepositoryForksListRequest { Sort = Sort.Oldest }; + + var startOptions = new ApiOptions + { + PageCount = 1, + PageSize = 3, + StartPage = 1 + }; + + var firstPage = await github.Repository.Forks.GetAll("octokit", "octokit.net", repositoryForksListRequest, startOptions); + var firstPageOrdered = firstPage.OrderBy(r => r.CreatedAt).ToList(); + + var skipStartOptions = new ApiOptions + { + PageCount = 1, + PageSize = 3, + StartPage = 1 + }; + + var secondPage = await github.Repository.Forks.GetAll("octokit", "octokit.net", repositoryForksListRequest, skipStartOptions); + var secondPageOrdered = secondPage.OrderBy(r => r.CreatedAt).ToList(); + + for (var index = 0; index < firstPage.Count; index++) + { + Assert.Equal(firstPageOrdered[index].FullName, firstPage[index].FullName); + } + + for (var index = 0; index < firstPage.Count; index++) + { + Assert.Equal(secondPageOrdered[index].FullName, secondPage[index].FullName); + } + } + [IntegrationTest] public async Task ReturnsForksForRepositorySortingTheResultWithOldestFirst() { diff --git a/Octokit.Tests/Clients/RepositoryForksClientTests.cs b/Octokit.Tests/Clients/RepositoryForksClientTests.cs index acc0f47a..32d8bccb 100644 --- a/Octokit.Tests/Clients/RepositoryForksClientTests.cs +++ b/Octokit.Tests/Clients/RepositoryForksClientTests.cs @@ -1,7 +1,7 @@ -using NSubstitute; -using System; +using System; using System.Collections.Generic; using System.Threading.Tasks; +using NSubstitute; using Xunit; namespace Octokit.Tests.Clients @@ -14,43 +14,98 @@ namespace Octokit.Tests.Clients public void EnsuresNonNullArguments() { Assert.Throws( - () => new RepositoryForksClient(null)); + () => new RepositoryForksClient(null)); } } public class TheGetAllMethod { [Fact] - public void RequestsCorrectUrl() + public async Task RequestsCorrectUrl() { var connection = Substitute.For(); - var client = new RepositoriesClient(connection); + var client = new RepositoryForksClient(connection); - client.Forks.GetAll("fake", "repo", null); + await client.GetAll("fake", "repo"); - connection.Received().GetAll(Arg.Is(u => u.ToString() == "repos/fake/repo/forks")); + connection.Received().GetAll(Arg.Is(u => u.ToString() == "repos/fake/repo/forks"), Args.ApiOptions); } [Fact] - public void RequestsCorrectUrlWithRequestParameters() + public async Task RequestsCorrectUrlWithApiOptions() { var connection = Substitute.For(); - var client = new RepositoriesClient(connection); + var client = new RepositoryForksClient(connection); - client.Forks.GetAll("fake", "repo", new RepositoryForksListRequest { Sort = Sort.Stargazers }); + var options = new ApiOptions + { + PageCount = 1, + StartPage = 1, + PageSize = 1 + }; + + await client.GetAll("fake", "repo", options); + + connection.Received().GetAll(Arg.Is(u => u.ToString() == "repos/fake/repo/forks"), options); + } + + [Fact] + public async Task RequestsCorrectUrlWithRequestParameters() + { + var connection = Substitute.For(); + var client = new RepositoryForksClient(connection); + + await client.GetAll("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")); + Arg.Is>(d => d["sort"] == "stargazers"), Args.ApiOptions); + } + + [Fact] + public async Task RequestsCorrectUrlWithRequestParametersWithApiOptions() + { + var connection = Substitute.For(); + var client = new RepositoryForksClient(connection); + + var options = new ApiOptions + { + PageCount = 1, + StartPage = 1, + PageSize = 1 + }; + + await client.GetAll("fake", "repo", new RepositoryForksListRequest { Sort = Sort.Stargazers }, options); + + connection.Received().GetAll( + Arg.Is(u => u.ToString() == "repos/fake/repo/forks"), + Arg.Is>(d => d["sort"] == "stargazers"), options); } [Fact] public async Task EnsuresNonNullArguments() { - var client = new RepositoriesClient(Substitute.For()); + var client = new RepositoryForksClient(Substitute.For()); - await Assert.ThrowsAsync(() => client.Forks.GetAll(null, "name", null)); - await Assert.ThrowsAsync(() => client.Forks.GetAll("owner", null, null)); + await Assert.ThrowsAsync(() => client.GetAll(null, "name")); + await Assert.ThrowsAsync(() => client.GetAll("owner", null)); + await Assert.ThrowsAsync(() => client.GetAll(null, "name", ApiOptions.None)); + await Assert.ThrowsAsync(() => client.GetAll("owner", null, ApiOptions.None)); + await Assert.ThrowsAsync(() => client.GetAll("owner", "name", (ApiOptions)null)); + await Assert.ThrowsAsync(() => client.GetAll(null, "name", new RepositoryForksListRequest())); + await Assert.ThrowsAsync(() => client.GetAll("owner", null, new RepositoryForksListRequest())); + await Assert.ThrowsAsync(() => client.GetAll(null, "name", new RepositoryForksListRequest(), ApiOptions.None)); + await Assert.ThrowsAsync(() => client.GetAll("owner", null, new RepositoryForksListRequest(), ApiOptions.None)); + await Assert.ThrowsAsync(() => client.GetAll("owner", "name", new RepositoryForksListRequest(), null)); + + await Assert.ThrowsAsync(() => client.GetAll("", "name")); + await Assert.ThrowsAsync(() => client.GetAll("owner", "")); + await Assert.ThrowsAsync(() => client.GetAll("", "name", ApiOptions.None)); + await Assert.ThrowsAsync(() => client.GetAll("owner", "", ApiOptions.None)); + await Assert.ThrowsAsync(() => client.GetAll("", "name", new RepositoryForksListRequest())); + await Assert.ThrowsAsync(() => client.GetAll("owner", "", new RepositoryForksListRequest())); + await Assert.ThrowsAsync(() => client.GetAll("", "name", new RepositoryForksListRequest(), ApiOptions.None)); + await Assert.ThrowsAsync(() => client.GetAll("owner", "", new RepositoryForksListRequest(), ApiOptions.None)); } } @@ -60,10 +115,11 @@ namespace Octokit.Tests.Clients public void RequestsCorrectUrl() { var connection = Substitute.For(); - var client = new RepositoriesClient(connection); + var client = new RepositoryForksClient(connection); + var newRepositoryFork = new NewRepositoryFork(); - client.Forks.Create("fake", "repo", newRepositoryFork); + client.Create("fake", "repo", newRepositoryFork); connection.Received().Post(Arg.Is(u => u.ToString() == "repos/fake/repo/forks"), newRepositoryFork); } @@ -71,24 +127,15 @@ namespace Octokit.Tests.Clients [Fact] public async Task EnsuresNonNullArguments() { - var client = new RepositoriesClient(Substitute.For()); + var client = new RepositoryForksClient(Substitute.For()); - await Assert.ThrowsAsync(() => client.Forks.Create(null, "name", new NewRepositoryFork())); - await Assert.ThrowsAsync(() => client.Forks.Create("owner", null, new NewRepositoryFork())); - await Assert.ThrowsAsync(() => client.Forks.Create("owner", "name", null)); - } + await Assert.ThrowsAsync(() => client.Create(null, "name", new NewRepositoryFork())); + await Assert.ThrowsAsync(() => client.Create("owner", null, new NewRepositoryFork())); + await Assert.ThrowsAsync(() => client.Create("owner", "name", null)); - [Fact] - public void UsesTheSuppliedHook() - { - var connection = Substitute.For(); - var client = new RepositoriesClient(connection); - var newRepositoryFork = new NewRepositoryFork { Organization = "aName" }; - - client.Forks.Create("owner", "repo", newRepositoryFork); - - connection.Received().Post(Arg.Any(), newRepositoryFork); + await Assert.ThrowsAsync(() => client.Create("", "name", new NewRepositoryFork())); + await Assert.ThrowsAsync(() => client.Create("owner", "", new NewRepositoryFork())); } } } -} \ No newline at end of file +} diff --git a/Octokit.Tests/Octokit.Tests.csproj b/Octokit.Tests/Octokit.Tests.csproj index ab7cfb98..9bc42615 100644 --- a/Octokit.Tests/Octokit.Tests.csproj +++ b/Octokit.Tests/Octokit.Tests.csproj @@ -229,6 +229,7 @@ + diff --git a/Octokit.Tests/Reactive/ObservableRepositoryForksClientTests.cs b/Octokit.Tests/Reactive/ObservableRepositoryForksClientTests.cs new file mode 100644 index 00000000..77acb660 --- /dev/null +++ b/Octokit.Tests/Reactive/ObservableRepositoryForksClientTests.cs @@ -0,0 +1,141 @@ +using System; +using NSubstitute; +using Octokit.Reactive; +using Xunit; + +namespace Octokit.Tests.Reactive +{ + public class ObservableRepositoryForksClientTests + { + public class TheCtor + { + [Fact] + public void EnsuresNonNullArguments() + { + Assert.Throws( + () => new ObservableRepositoryForksClient(null)); + } + } + + public class TheGetAllMethod + { + [Fact] + public void RequestsCorrectUrl() + { + var gitHubClient = Substitute.For(); + var client = new ObservableRepositoryForksClient(gitHubClient); + + client.GetAll("fake", "repo"); + + gitHubClient.Received().Repository.Forks.GetAll("fake", "repo"); + } + + [Fact] + public void RequestsCorrectUrlWithApiOptions() + { + var gitHubClient = Substitute.For(); + var client = new ObservableRepositoryForksClient(gitHubClient); + + var options = new ApiOptions + { + PageCount = 1, + StartPage = 1, + PageSize = 1 + }; + + client.GetAll("fake", "repo", options); + + gitHubClient.Received().Repository.Forks.GetAll("fake", "repo", options); + } + + [Fact] + public void RequestsCorrectUrlWithRequestParameters() + { + var gitHubClient = Substitute.For(); + var client = new ObservableRepositoryForksClient(gitHubClient); + + var repositoryForksListRequest = new RepositoryForksListRequest { Sort = Sort.Stargazers }; + + client.GetAll("fake", "repo", repositoryForksListRequest); + + gitHubClient.Received().Repository.Forks.GetAll( + "fake", "repo", repositoryForksListRequest); + } + + [Fact] + public void RequestsCorrectUrlWithRequestParametersWithApiOptions() + { + var gitHubClient = Substitute.For(); + var client = new ObservableRepositoryForksClient(gitHubClient); + + var options = new ApiOptions + { + PageCount = 1, + StartPage = 1, + PageSize = 1 + }; + + var repositoryForksListRequest = new RepositoryForksListRequest { Sort = Sort.Stargazers }; + + client.GetAll("fake", "repo", repositoryForksListRequest, options); + + gitHubClient.Received().Repository.Forks.GetAll("fake", "name", repositoryForksListRequest, options); + } + + [Fact] + public void EnsuresNonNullArguments() + { + var client = new ObservableRepositoryForksClient(Substitute.For()); + + Assert.Throws(() => client.GetAll(null, "name")); + Assert.Throws(() => client.GetAll("owner", null)); + Assert.Throws(() => client.GetAll(null, "name", ApiOptions.None)); + Assert.Throws(() => client.GetAll("owner", null, ApiOptions.None)); + Assert.Throws(() => client.GetAll("owner", "name", (ApiOptions)null)); + Assert.Throws(() => client.GetAll(null, "name", new RepositoryForksListRequest())); + Assert.Throws(() => client.GetAll("owner", null, new RepositoryForksListRequest())); + Assert.Throws(() => client.GetAll(null, "name", new RepositoryForksListRequest(), ApiOptions.None)); + Assert.Throws(() => client.GetAll("owner", null, new RepositoryForksListRequest(), ApiOptions.None)); + Assert.Throws(() => client.GetAll("owner", "name", new RepositoryForksListRequest(), null)); + + Assert.Throws(() => client.GetAll("", "name")); + Assert.Throws(() => client.GetAll("owner", "")); + Assert.Throws(() => client.GetAll("", "name", ApiOptions.None)); + Assert.Throws(() => client.GetAll("owner", "", ApiOptions.None)); + Assert.Throws(() => client.GetAll("", "name", new RepositoryForksListRequest())); + Assert.Throws(() => client.GetAll("owner", "", new RepositoryForksListRequest())); + Assert.Throws(() => client.GetAll("", "name", new RepositoryForksListRequest(), ApiOptions.None)); + Assert.Throws(() => client.GetAll("owner", "", new RepositoryForksListRequest(), ApiOptions.None)); + } + } + + public class TheCreateMethod + { + [Fact] + public void RequestsCorrectUrl() + { + var gitHubClient = Substitute.For(); + var client = new ObservableRepositoryForksClient(gitHubClient); + + var newRepositoryFork = new NewRepositoryFork(); + + client.Create("fake", "repo", newRepositoryFork); + + gitHubClient.Received().Repository.Forks.Create("fake", "repo", newRepositoryFork); + } + + [Fact] + public void EnsuresNonNullArguments() + { + var client = new ObservableRepositoryForksClient(Substitute.For()); + + Assert.Throws(() => client.Create(null, "name", new NewRepositoryFork())); + Assert.Throws(() => client.Create("owner", null, new NewRepositoryFork())); + Assert.Throws(() => client.Create("owner", "name", null)); + + Assert.Throws(() => client.Create("", "name", new NewRepositoryFork())); + Assert.Throws(() => client.Create("owner", "", new NewRepositoryFork())); + } + } + } +} diff --git a/Octokit/Clients/IRepositoryForksClient.cs b/Octokit/Clients/IRepositoryForksClient.cs index 8d026244..742b38d0 100644 --- a/Octokit/Clients/IRepositoryForksClient.cs +++ b/Octokit/Clients/IRepositoryForksClient.cs @@ -3,20 +3,72 @@ using System.Threading.Tasks; namespace Octokit { + /// + /// A client for GitHub's Repository Forks API. + /// + /// + /// See the Forks API documentation for more information. + /// public interface IRepositoryForksClient { /// /// Gets the list of forks defined for a repository /// - /// See API documentation for more information. - /// - Task> GetAll(string owner, string repositoryName, RepositoryForksListRequest request); + /// + /// See API documentation for more information. + /// + /// The owner of the repository + /// The name of the repository + /// A of s representing forks of specified repository. + Task> GetAll(string owner, string name); + + /// + /// Gets the list of forks defined for a repository + /// + /// + /// See API documentation for more information. + /// + /// The owner of the repository + /// The name of the repository + /// Options for changing the API response + /// A of s representing forks of specified repository. + Task> GetAll(string owner, string name, ApiOptions options); + + /// + /// Gets the list of forks defined for a repository + /// + /// + /// See API documentation for more information. + /// + /// The owner of the repository + /// The name of the repository + /// Used to request and filter a list of repository forks + /// A of s representing forks of specified repository. + Task> GetAll(string owner, string name, RepositoryForksListRequest request); + + /// + /// Gets the list of forks defined for a repository + /// + /// + /// See API documentation for more information. + /// + /// The owner of the repository + /// The name of the repository + /// Used to request and filter a list of repository forks + /// Options for changing the API response + /// A of s representing forks of specified repository. + Task> GetAll(string owner, string name, RepositoryForksListRequest request, ApiOptions options); /// /// Creates a fork for a repository. Specify organization in the fork parameter to create for an organization. /// - /// See API documentation for more information. - /// - Task Create(string owner, string repositoryName, NewRepositoryFork fork); + /// + /// See API documentation for more information. + /// + /// The owner of the repository + /// The name of the repository + /// Used to fork a repository + /// A representing the created fork of specified repository. + Task Create(string owner, string name, NewRepositoryFork fork); } } diff --git a/Octokit/Clients/RepositoryForksClient.cs b/Octokit/Clients/RepositoryForksClient.cs index c45a634b..0915cde3 100644 --- a/Octokit/Clients/RepositoryForksClient.cs +++ b/Octokit/Clients/RepositoryForksClient.cs @@ -3,6 +3,12 @@ using System.Threading.Tasks; namespace Octokit { + /// + /// A client for GitHub's Repository Forks API. + /// + /// + /// See the Forks API documentation for more information. + /// public class RepositoryForksClient : ApiClient, IRepositoryForksClient { /// @@ -17,30 +23,96 @@ namespace Octokit /// /// Gets the list of forks defined for a repository /// - /// See API documentation for more information. - /// - public Task> GetAll(string owner, string repositoryName, RepositoryForksListRequest request) + /// + /// See API documentation for more information. + /// + /// The owner of the repository + /// The name of the repository + /// A of s representing forks of specified repository. + public Task> GetAll(string owner, string name) { Ensure.ArgumentNotNullOrEmptyString(owner, "owner"); - Ensure.ArgumentNotNullOrEmptyString(repositoryName, "repositoryName"); + Ensure.ArgumentNotNullOrEmptyString(name, "name"); + + return GetAll(owner, name, ApiOptions.None); + } + + /// + /// Gets the list of forks defined for a repository + /// + /// + /// See API documentation for more information. + /// + /// The owner of the repository + /// The name of the repository + /// Options for changing the API response + /// A of s representing forks of specified repository. + public Task> GetAll(string owner, string name, ApiOptions options) + { + Ensure.ArgumentNotNullOrEmptyString(owner, "owner"); + Ensure.ArgumentNotNullOrEmptyString(name, "name"); + Ensure.ArgumentNotNull(options, "options"); + + return ApiConnection.GetAll(ApiUrls.RepositoryForks(owner, name), options); + } + + /// + /// Gets the list of forks defined for a repository + /// + /// + /// See API documentation for more information. + /// + /// The owner of the repository + /// The name of the repository + /// Used to request and filter a list of repository forks + /// A of s representing forks of specified repository. + public Task> GetAll(string owner, string name, RepositoryForksListRequest request) + { + Ensure.ArgumentNotNullOrEmptyString(owner, "owner"); + Ensure.ArgumentNotNullOrEmptyString(name, "name"); + + return GetAll(owner, name, request, ApiOptions.None); + } + + /// + /// Gets the list of forks defined for a repository + /// + /// + /// See API documentation for more information. + /// + /// The owner of the repository + /// The name of the repository + /// Used to request and filter a list of repository forks + /// Options for changing the API response + /// A of s representing forks of specified repository. + public Task> GetAll(string owner, string name, RepositoryForksListRequest request, ApiOptions options) + { + Ensure.ArgumentNotNullOrEmptyString(owner, "owner"); + Ensure.ArgumentNotNullOrEmptyString(name, "name"); + Ensure.ArgumentNotNull(options, "options"); return request == null - ? ApiConnection.GetAll(ApiUrls.RepositoryForks(owner, repositoryName)) - : ApiConnection.GetAll(ApiUrls.RepositoryForks(owner, repositoryName), request.ToParametersDictionary()); + ? ApiConnection.GetAll(ApiUrls.RepositoryForks(owner, name), options) : + ApiConnection.GetAll(ApiUrls.RepositoryForks(owner, name), request.ToParametersDictionary(), options); } /// /// Creates a fork for a repository. Specify organization in the fork parameter to create for an organization. /// - /// See API documentation for more information. - /// - public Task Create(string owner, string repositoryName, NewRepositoryFork fork) + /// + /// See API documentation for more information. + /// + /// The owner of the repository + /// The name of the repository + /// Used to fork a repository + /// A representing the created fork of specified repository. + public Task Create(string owner, string name, NewRepositoryFork fork) { Ensure.ArgumentNotNullOrEmptyString(owner, "owner"); - Ensure.ArgumentNotNullOrEmptyString(repositoryName, "repositoryName"); + Ensure.ArgumentNotNullOrEmptyString(name, "name"); Ensure.ArgumentNotNull(fork, "fork"); - return ApiConnection.Post(ApiUrls.RepositoryForks(owner, repositoryName), fork); + return ApiConnection.Post(ApiUrls.RepositoryForks(owner, name), fork); } } -} \ No newline at end of file +}