using System; using System.Collections.Generic; using System.Reactive.Threading.Tasks; using System.Threading.Tasks; using NSubstitute; using Octokit.Reactive; using Xunit; namespace Octokit.Tests.Reactive { public class ObservableStarredClientTests { public class TheCtor { [Fact] public void EnsuresNonNullArguments() { Assert.Throws(() => new ObservableStarredClient(null)); } } public class TheGetAllStargazersMethod { [Fact] public void RequestsCorrectUrl() { var endpoint = new Uri("repos/fight/club/stargazers", UriKind.Relative); var connection = Substitute.For(); var gitHubClient = Substitute.For(); gitHubClient.Connection.Returns(connection); var client = new ObservableStarredClient(gitHubClient); client.GetAllStargazers("fight", "club"); connection.Received().Get>(endpoint, Args.EmptyDictionary); } [Fact] public void RequestsCorrectUrlWithRepositoryId() { var endpoint = new Uri("repositories/1/stargazers", UriKind.Relative); var connection = Substitute.For(); var gitHubClient = Substitute.For(); gitHubClient.Connection.Returns(connection); var client = new ObservableStarredClient(gitHubClient); client.GetAllStargazers(1); connection.Received().Get>(endpoint, Args.EmptyDictionary); } [Fact] public void RequestsCorrectUrlWithApiOptions() { var endpoint = new Uri("repos/fight/club/stargazers", UriKind.Relative); var connection = Substitute.For(); var gitHubClient = Substitute.For(); gitHubClient.Connection.Returns(connection); var client = new ObservableStarredClient(gitHubClient); var options = new ApiOptions { PageCount = 1, StartPage = 1, PageSize = 1 }; client.GetAllStargazers("fight", "club", options); connection.Received().Get>(endpoint, Arg.Is>(d => d.Count == 2)); } [Fact] public void RequestsCorrectUrlWithApiOptionsWithRepositoryId() { var endpoint = new Uri("repositories/1/stargazers", UriKind.Relative); var connection = Substitute.For(); var gitHubClient = Substitute.For(); gitHubClient.Connection.Returns(connection); var client = new ObservableStarredClient(gitHubClient); var options = new ApiOptions { PageCount = 1, StartPage = 1, PageSize = 1 }; client.GetAllStargazers(1, options); connection.Received().Get>(endpoint, Arg.Is>(d => d.Count == 2)); } [Fact] public void RequestsCorrectUrlWithTimestamps() { var endpoint = new Uri("repos/fight/club/stargazers", UriKind.Relative); var connection = Substitute.For(); var gitHubClient = Substitute.For(); gitHubClient.Connection.Returns(connection); var client = new ObservableStarredClient(gitHubClient); client.GetAllStargazersWithTimestamps("fight", "club"); connection.Received().Get>(endpoint, Args.EmptyDictionary, AcceptHeaders.StarJson); } [Fact] public void RequestsCorrectUrlWithTimestampsWithRepositoryId() { var endpoint = new Uri("repositories/1/stargazers", UriKind.Relative); var connection = Substitute.For(); var gitHubClient = Substitute.For(); gitHubClient.Connection.Returns(connection); var client = new ObservableStarredClient(gitHubClient); client.GetAllStargazersWithTimestamps(1); connection.Received().Get>(endpoint, Args.EmptyDictionary, AcceptHeaders.StarJson); } [Fact] public void RequestsCorrectUrlWithTimestampsWithApiOptions() { var endpoint = new Uri("repos/fight/club/stargazers", UriKind.Relative); var connection = Substitute.For(); var gitHubClient = Substitute.For(); gitHubClient.Connection.Returns(connection); var client = new ObservableStarredClient(gitHubClient); var options = new ApiOptions { PageCount = 1, StartPage = 1, PageSize = 1 }; client.GetAllStargazersWithTimestamps("fight", "club", options); connection.Received().Get>(endpoint, Arg.Is>(d => d.Count == 2), AcceptHeaders.StarJson); } [Fact] public void RequestsCorrectUrlWithTimestampsWithApiOptionsWithRepositoryId() { var endpoint = new Uri("repositories/1/stargazers", UriKind.Relative); var connection = Substitute.For(); var gitHubClient = Substitute.For(); gitHubClient.Connection.Returns(connection); var client = new ObservableStarredClient(gitHubClient); var options = new ApiOptions { PageCount = 1, StartPage = 1, PageSize = 1 }; client.GetAllStargazersWithTimestamps(1, options); connection.Received().Get>(endpoint, Arg.Is>(d => d.Count == 2), AcceptHeaders.StarJson); } [Fact] public void EnsuresNonNullArguments() { var client = new ObservableStarredClient(Substitute.For()); Assert.Throws(() => client.GetAllStargazers(null, "club")); Assert.Throws(() => client.GetAllStargazers("fight", null)); Assert.Throws(() => client.GetAllStargazers(null, "club", ApiOptions.None)); Assert.Throws(() => client.GetAllStargazers("fight", null, ApiOptions.None)); Assert.Throws(() => client.GetAllStargazers("fight", "club", null)); Assert.Throws(() => client.GetAllStargazersWithTimestamps(null, "club")); Assert.Throws(() => client.GetAllStargazersWithTimestamps("fight", null)); Assert.Throws(() => client.GetAllStargazersWithTimestamps(null, "club", ApiOptions.None)); Assert.Throws(() => client.GetAllStargazersWithTimestamps("fight", null, ApiOptions.None)); Assert.Throws(() => client.GetAllStargazersWithTimestamps("fight", "club", null)); Assert.Throws(() => client.GetAllStargazers(1, null)); Assert.Throws(() => client.GetAllStargazersWithTimestamps(1, null)); Assert.Throws(() => client.GetAllStargazers("", "club")); Assert.Throws(() => client.GetAllStargazers("fight", "")); Assert.Throws(() => client.GetAllStargazers("", "club", ApiOptions.None)); Assert.Throws(() => client.GetAllStargazers("fight", "", ApiOptions.None)); Assert.Throws(() => client.GetAllStargazersWithTimestamps("", "club")); Assert.Throws(() => client.GetAllStargazersWithTimestamps("fight", "")); Assert.Throws(() => client.GetAllStargazersWithTimestamps("", "club", ApiOptions.None)); Assert.Throws(() => client.GetAllStargazersWithTimestamps("fight", "", ApiOptions.None)); } } public class TheGetAllForCurrentMethod { [Fact] public void RequestsCorrectUrl() { var endpoint = new Uri("user/starred", UriKind.Relative); var connection = Substitute.For(); var gitHubClient = Substitute.For(); gitHubClient.Connection.Returns(connection); var client = new ObservableStarredClient(gitHubClient); client.GetAllForCurrent(); connection.Received().Get>(endpoint, Args.EmptyDictionary); } [Fact] public void RequestsCorrectUrlWithApiOptions() { var endpoint = new Uri("user/starred", UriKind.Relative); var connection = Substitute.For(); var gitHubClient = Substitute.For(); gitHubClient.Connection.Returns(connection); var client = new ObservableStarredClient(gitHubClient); var options = new ApiOptions { PageCount = 1, StartPage = 1, PageSize = 1 }; client.GetAllForCurrent(options); connection.Received().Get>(endpoint, Arg.Is>(d => d.Count == 2 && d["per_page"] == "1" && d["page"] == "1")); } [Fact] public void RequestsCorrectUrlParametrized() { var endpoint = new Uri("user/starred", UriKind.Relative); var connection = Substitute.For(); var gitHubClient = Substitute.For(); gitHubClient.Connection.Returns(connection); var client = new ObservableStarredClient(gitHubClient); var request = new StarredRequest { SortDirection = SortDirection.Ascending }; client.GetAllForCurrent(request); connection.Received().Get>(endpoint, Arg.Is>(d => d.Count == 2 && d["direction"] == "asc")); } [Fact] public void RequestsCorrectUrlParametrizedWithApiOptions() { var endpoint = new Uri("user/starred", UriKind.Relative); var connection = Substitute.For(); var gitHubClient = Substitute.For(); gitHubClient.Connection.Returns(connection); var client = new ObservableStarredClient(gitHubClient); var options = new ApiOptions { PageCount = 1, StartPage = 1, PageSize = 1 }; var request = new StarredRequest { SortDirection = SortDirection.Ascending }; client.GetAllForCurrent(request, options); connection.Received().Get>(endpoint, Arg.Is>(d => d.Count == 4 && d["direction"] == "asc" && d["per_page"] == "1" && d["page"] == "1")); } [Fact] public void RequestsCorrectUrlWithTimestamps() { var endpoint = new Uri("user/starred", UriKind.Relative); var connection = Substitute.For(); var gitHubClient = Substitute.For(); gitHubClient.Connection.Returns(connection); var client = new ObservableStarredClient(gitHubClient); client.GetAllForCurrentWithTimestamps(); connection.Received().Get>(endpoint, Args.EmptyDictionary); } [Fact] public void RequestsCorrectUrlWithTimestampsWithApiOptions() { var endpoint = new Uri("user/starred", UriKind.Relative); var connection = Substitute.For(); var gitHubClient = Substitute.For(); gitHubClient.Connection.Returns(connection); var client = new ObservableStarredClient(gitHubClient); var options = new ApiOptions { PageCount = 1, StartPage = 1, PageSize = 1 }; client.GetAllForCurrentWithTimestamps(options); connection.Received().Get>(endpoint, Arg.Is>(d => d.Count == 2 && d["per_page"] == "1" && d["page"] == "1")); } [Fact] public void RequestsCorrectUrlWithTimestampsParametrized() { var endpoint = new Uri("user/starred", UriKind.Relative); var connection = Substitute.For(); var gitHubClient = Substitute.For(); gitHubClient.Connection.Returns(connection); var client = new ObservableStarredClient(gitHubClient); var request = new StarredRequest { SortDirection = SortDirection.Ascending }; client.GetAllForCurrentWithTimestamps(request); connection.Received().Get>(endpoint, Arg.Is>(d => d.Count == 2 && d["direction"] == "asc")); } [Fact] public void RequestsCorrectUrlWithTimestampsParametrizedWithApiOptions() { var endpoint = new Uri("user/starred", UriKind.Relative); var connection = Substitute.For(); var gitHubClient = Substitute.For(); gitHubClient.Connection.Returns(connection); var client = new ObservableStarredClient(gitHubClient); var options = new ApiOptions { PageCount = 1, StartPage = 1, PageSize = 1 }; var request = new StarredRequest { SortDirection = SortDirection.Ascending }; client.GetAllForCurrentWithTimestamps(request, options); connection.Received().Get>(endpoint, Arg.Is>(d => d.Count == 4 && d["direction"] == "asc" && d["per_page"] == "1" && d["page"] == "1")); } [Fact] public void EnsuresNonNullArguments() { var client = new ObservableStarredClient(Substitute.For()); Assert.Throws(() => client.GetAllForCurrent((ApiOptions)null)); Assert.Throws(() => client.GetAllForCurrent((StarredRequest)null)); Assert.Throws(() => client.GetAllForCurrentWithTimestamps((ApiOptions)null)); Assert.Throws(() => client.GetAllForCurrentWithTimestamps((StarredRequest)null)); Assert.Throws(() => client.GetAllForCurrent(null, new ApiOptions())); Assert.Throws(() => client.GetAllForCurrent(new StarredRequest(), null)); Assert.Throws(() => client.GetAllForCurrentWithTimestamps(null, new ApiOptions())); Assert.Throws(() => client.GetAllForCurrentWithTimestamps(new StarredRequest(), null)); } } public class TheGetAllForUserMethod { [Fact] public void RequestsCorrectUrl() { var endpoint = new Uri("users/banana/starred", UriKind.Relative); var connection = Substitute.For(); var gitHubClient = Substitute.For(); gitHubClient.Connection.Returns(connection); var client = new ObservableStarredClient(gitHubClient); client.GetAllForUser("banana"); connection.Received().Get>(endpoint, Args.EmptyDictionary); } [Fact] public void RequestsCorrectUrlWithApiOptions() { var endpoint = new Uri("users/banana/starred", UriKind.Relative); var connection = Substitute.For(); var gitHubClient = Substitute.For(); gitHubClient.Connection.Returns(connection); var client = new ObservableStarredClient(gitHubClient); var options = new ApiOptions { PageCount = 1, StartPage = 1, PageSize = 1 }; client.GetAllForUser("banana", options); connection.Received().Get>(endpoint, Arg.Is>(d => d.Count == 2 && d["per_page"] == "1" && d["page"] == "1")); } [Fact] public void RequestsCorrectUrlParametrized() { var endpoint = new Uri("users/banana/starred", UriKind.Relative); var connection = Substitute.For(); var gitHubClient = Substitute.For(); gitHubClient.Connection.Returns(connection); var client = new ObservableStarredClient(gitHubClient); var starredRequest = new StarredRequest { SortDirection = SortDirection.Ascending }; client.GetAllForUser("banana", starredRequest); connection.Received().Get>(endpoint, Arg.Is>(d => d.Count == 2 && d["direction"] == "asc")); } [Fact] public void RequestsCorrectUrlParametrizedWithApiOptions() { var endpoint = new Uri("users/banana/starred", UriKind.Relative); var connection = Substitute.For(); var gitHubClient = Substitute.For(); gitHubClient.Connection.Returns(connection); var client = new ObservableStarredClient(gitHubClient); var options = new ApiOptions { PageCount = 1, StartPage = 1, PageSize = 1 }; var starredRequest = new StarredRequest { SortDirection = SortDirection.Ascending }; client.GetAllForUser("banana", starredRequest, options); connection.Received().Get>(endpoint, Arg.Is>(d => d.Count == 4 && d["direction"] == "asc" && d["direction"] == "asc" && d["per_page"] == "1" && d["page"] == "1")); } [Fact] public void RequestsCorrectUrlWithTimestamps() { var endpoint = new Uri("users/banana/starred", UriKind.Relative); var connection = Substitute.For(); var gitHubClient = Substitute.For(); gitHubClient.Connection.Returns(connection); var client = new ObservableStarredClient(gitHubClient); client.GetAllForUserWithTimestamps("banana"); connection.Received().Get>(endpoint, Args.EmptyDictionary); } [Fact] public void RequestsCorrectUrlWithTimestampsWithApiOptions() { var endpoint = new Uri("users/banana/starred", UriKind.Relative); var connection = Substitute.For(); var gitHubClient = Substitute.For(); gitHubClient.Connection.Returns(connection); var client = new ObservableStarredClient(gitHubClient); var options = new ApiOptions { PageCount = 1, StartPage = 1, PageSize = 1 }; client.GetAllForUserWithTimestamps("banana", options); connection.Received().Get>(endpoint, Arg.Is>(d => d.Count == 2 && d["per_page"] == "1" && d["page"] == "1")); } [Fact] public void RequestsCorrectUrlWithTimestampsParametrized() { var endpoint = new Uri("users/banana/starred", UriKind.Relative); var connection = Substitute.For(); var gitHubClient = Substitute.For(); gitHubClient.Connection.Returns(connection); var client = new ObservableStarredClient(gitHubClient); var starredRequest = new StarredRequest { SortDirection = SortDirection.Ascending }; client.GetAllForUserWithTimestamps("banana", starredRequest); connection.Received().Get>(endpoint, Arg.Is>(d => d.Count == 2 && d["direction"] == "asc")); } [Fact] public void RequestsCorrectUrlWithTimestampsParametrizedWithApiOptions() { var endpoint = new Uri("users/banana/starred", UriKind.Relative); var connection = Substitute.For(); var gitHubClient = Substitute.For(); gitHubClient.Connection.Returns(connection); var client = new ObservableStarredClient(gitHubClient); var options = new ApiOptions { PageCount = 1, StartPage = 1, PageSize = 1 }; var starredRequest = new StarredRequest { SortDirection = SortDirection.Ascending }; client.GetAllForUserWithTimestamps("banana", starredRequest, options); connection.Received().Get>(endpoint, Arg.Is>(d => d.Count == 4 && d["direction"] == "asc" && d["direction"] == "asc" && d["per_page"] == "1" && d["page"] == "1")); } [Fact] public void EnsuresNonNullArguments() { var client = new ObservableStarredClient(Substitute.For()); Assert.Throws(() => client.GetAllForUser(null)); Assert.Throws(() => client.GetAllForUser(null, ApiOptions.None)); Assert.Throws(() => client.GetAllForUser("banana", (ApiOptions)null)); Assert.Throws(() => client.GetAllForUser(null, new StarredRequest())); Assert.Throws(() => client.GetAllForUser("banana", (StarredRequest)null)); Assert.Throws(() => client.GetAllForUser(null, new StarredRequest(), ApiOptions.None)); Assert.Throws(() => client.GetAllForUser("banana", null, ApiOptions.None)); Assert.Throws(() => client.GetAllForUser("banana", new StarredRequest(), null)); Assert.Throws(() => client.GetAllForUserWithTimestamps(null)); Assert.Throws(() => client.GetAllForUserWithTimestamps(null, ApiOptions.None)); Assert.Throws(() => client.GetAllForUserWithTimestamps("banana", (ApiOptions)null)); Assert.Throws(() => client.GetAllForUserWithTimestamps(null, new StarredRequest())); Assert.Throws(() => client.GetAllForUserWithTimestamps("banana", (StarredRequest)null)); Assert.Throws(() => client.GetAllForUserWithTimestamps(null, new StarredRequest(), ApiOptions.None)); Assert.Throws(() => client.GetAllForUserWithTimestamps("banana", null, ApiOptions.None)); Assert.Throws(() => client.GetAllForUserWithTimestamps("banana", new StarredRequest(), null)); Assert.Throws(() => client.GetAllForUser("")); Assert.Throws(() => client.GetAllForUser("", ApiOptions.None)); Assert.Throws(() => client.GetAllForUser("", new StarredRequest(), ApiOptions.None)); Assert.Throws(() => client.GetAllForUserWithTimestamps("")); Assert.Throws(() => client.GetAllForUserWithTimestamps("", ApiOptions.None)); Assert.Throws(() => client.GetAllForUserWithTimestamps("", new StarredRequest(), ApiOptions.None)); } } public class TheCheckStarredMethod { [Fact] public async Task EnsuresArguments() { var client = new ObservableStarredClient(Substitute.For()); await Assert.ThrowsAsync(() => client.CheckStarred(null, "james").ToTask()); await Assert.ThrowsAsync(() => client.CheckStarred("james", null).ToTask()); } [Fact] public void ChecksStarredForUser() { var gitHubClient = Substitute.For(); var client = new ObservableStarredClient(gitHubClient); client.CheckStarred("jugglingnutcase", "katiejamie"); gitHubClient.Activity.Starring.Received().CheckStarred("jugglingnutcase", "katiejamie"); } } public class TheStarRepoMethod { [Fact] public async Task EnsuresArguments() { var client = new ObservableStarredClient(Substitute.For()); await Assert.ThrowsAsync(() => client.StarRepo(null, "james").ToTask()); await Assert.ThrowsAsync(() => client.StarRepo("james", null).ToTask()); } [Fact] public void ChecksStarredForUser() { var gitHubClient = Substitute.For(); var client = new ObservableStarredClient(gitHubClient); client.StarRepo("jugglingnutcase", "katiejamie"); gitHubClient.Activity.Starring.Received().StarRepo("jugglingnutcase", "katiejamie"); } } public class TheRemoveStarFromRepoMethod { [Fact] public async Task EnsuresArguments() { var client = new ObservableStarredClient(Substitute.For()); await Assert.ThrowsAsync(() => client.RemoveStarFromRepo(null, "james").ToTask()); await Assert.ThrowsAsync(() => client.RemoveStarFromRepo("james", null).ToTask()); } [Fact] public void ChecksStarredForUser() { var gitHubClient = Substitute.For(); var client = new ObservableStarredClient(gitHubClient); client.RemoveStarFromRepo("jugglingnutcase", "katiejamie"); gitHubClient.Activity.Starring.Received().RemoveStarFromRepo("jugglingnutcase", "katiejamie"); } } } }