diff --git a/Octokit.Tests.Integration/Clients/RepositoryForksClientTests.cs b/Octokit.Tests.Integration/Clients/RepositoryForksClientTests.cs index a0d73878..5c19b2b2 100644 --- a/Octokit.Tests.Integration/Clients/RepositoryForksClientTests.cs +++ b/Octokit.Tests.Integration/Clients/RepositoryForksClientTests.cs @@ -20,6 +20,176 @@ namespace Octokit.Tests.Integration.Clients 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 28474a7b..a5f436e0 100644 --- a/Octokit.Tests/Clients/RepositoryForksClientTests.cs +++ b/Octokit.Tests/Clients/RepositoryForksClientTests.cs @@ -21,36 +21,93 @@ namespace Octokit.Tests.Clients public class TheGetAllMethod { [Fact] - public void RequestsCorrectUrl() + public async Task RequestsCorrectUrl() { var connection = Substitute.For(); var client = new RepositoriesClient(connection); - client.Forks.GetAll("fake", "repo"); + await client.Forks.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); - client.Forks.GetAll("fake", "repo", new RepositoryForksListRequest { Sort = Sort.Stargazers }); + var options = new ApiOptions + { + PageCount = 1, + StartPage = 1, + PageSize = 1 + }; + + await client.Forks.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 RepositoriesClient(connection); + + await client.Forks.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 RepositoriesClient(connection); + + var options = new ApiOptions + { + PageCount = 1, + StartPage = 1, + PageSize = 1 + }; + + await client.Forks.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")); - await Assert.ThrowsAsync(() => client.Forks.GetAll("owner", 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("owner", "name", (RepositoryForksListRequest)null)); + 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", null, 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)); } } @@ -61,6 +118,7 @@ namespace Octokit.Tests.Clients { var connection = Substitute.For(); var client = new RepositoriesClient(connection); + var newRepositoryFork = new NewRepositoryFork(); client.Forks.Create("fake", "repo", newRepositoryFork); @@ -71,23 +129,14 @@ 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())); } } } diff --git a/Octokit.Tests/Octokit.Tests.csproj b/Octokit.Tests/Octokit.Tests.csproj index 34824301..f9a3d74c 100644 --- a/Octokit.Tests/Octokit.Tests.csproj +++ b/Octokit.Tests/Octokit.Tests.csproj @@ -228,6 +228,7 @@ + diff --git a/Octokit.Tests/Reactive/ObservableRepositoryForksClientTests.cs b/Octokit.Tests/Reactive/ObservableRepositoryForksClientTests.cs new file mode 100644 index 00000000..20f2756c --- /dev/null +++ b/Octokit.Tests/Reactive/ObservableRepositoryForksClientTests.cs @@ -0,0 +1,143 @@ +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("owner", "name", (RepositoryForksListRequest)null)); + 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", null, 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())); + } + } + } +}