using System; using System.Collections.Generic; using System.Net; using System.Reactive.Linq; using System.Threading.Tasks; using NSubstitute; using Octokit.Internal; using Octokit.Reactive; using Xunit; using static Octokit.Internal.TestSetup; namespace Octokit.Tests.Reactive { public class ObservableIssuesEventsClientTests { public class TheCtor { [Fact] public void EnsuresNonNullArguments() { Assert.Throws( () => new ObservableIssuesEventsClient(null)); } } public class TheGetForIssueMethod { [Fact] public async Task RequestsCorrectUrl() { var result = new List { new IssueEvent() }; var connection = Substitute.For(); var gitHubClient = new GitHubClient(connection); var client = new ObservableIssuesEventsClient(gitHubClient); IApiResponse> response = new ApiResponse>(CreateResponse(HttpStatusCode.OK), result); gitHubClient.Connection.Get>(Args.Uri, Args.EmptyDictionary) .Returns(Task.FromResult(response)); var eventInfos = await client.GetAllForIssue("fake", "repo", 42).ToList(); connection.Received().Get>(Arg.Is(u => u.ToString() == "repos/fake/repo/issues/42/events"), Args.EmptyDictionary); Assert.Equal(1, eventInfos.Count); } [Fact] public async Task RequestsCorrectUrlWithRepositoryId() { var result = new List { new IssueEvent() }; var connection = Substitute.For(); var gitHubClient = new GitHubClient(connection); var client = new ObservableIssuesEventsClient(gitHubClient); IApiResponse> response = new ApiResponse>(CreateResponse(HttpStatusCode.OK), result); gitHubClient.Connection.Get>(Args.Uri, Args.EmptyDictionary) .Returns(Task.FromResult(response)); var eventInfos = await client.GetAllForIssue(1, 42).ToList(); connection.Received().Get>(Arg.Is(u => u.ToString() == "repositories/1/issues/42/events"), Args.EmptyDictionary); Assert.Equal(1, eventInfos.Count); } [Fact] public async Task RequestsCorrectUrlWithApiOptions() { var result = new List { new IssueEvent() }; var connection = Substitute.For(); var gitHubClient = new GitHubClient(connection); var client = new ObservableIssuesEventsClient(gitHubClient); var options = new ApiOptions { StartPage = 1, PageCount = 1, PageSize = 1 }; IApiResponse> response = new ApiResponse>(CreateResponse(HttpStatusCode.OK), result); gitHubClient.Connection.Get>(Args.Uri, Arg.Is>(d => d.Count == 2)) .Returns(Task.FromResult(response)); var eventInfos = await client.GetAllForIssue("fake", "repo", 42, options).ToList(); connection.Received().Get>(Arg.Is(u => u.ToString() == "repos/fake/repo/issues/42/events"), Arg.Is>(d => d.Count == 2)); Assert.Equal(1, eventInfos.Count); } [Fact] public async Task RequestsCorrectUrlWithRepositoryIdWithApiOptions() { var result = new List { new IssueEvent() }; var connection = Substitute.For(); var gitHubClient = new GitHubClient(connection); var client = new ObservableIssuesEventsClient(gitHubClient); var options = new ApiOptions { StartPage = 1, PageCount = 1, PageSize = 1 }; IApiResponse> response = new ApiResponse>( CreateResponse(HttpStatusCode.OK), result); gitHubClient.Connection.Get>(Args.Uri, Arg.Is>(d => d.Count == 2)) .Returns(Task.FromResult(response)); var eventInfos = await client.GetAllForIssue(1, 42, options).ToList(); connection.Received().Get>(Arg.Is(u => u.ToString() == "repositories/1/issues/42/events"), Arg.Is>(d => d.Count == 2)); Assert.Equal(1, eventInfos.Count); } [Fact] public async Task EnsuresNonNullArguments() { var client = new ObservableIssuesEventsClient(Substitute.For()); Assert.Throws(() => client.GetAllForIssue(null, "name", 1)); Assert.Throws(() => client.GetAllForIssue("owner", null, 1)); Assert.Throws(() => client.GetAllForIssue(null, "name", 1, ApiOptions.None)); Assert.Throws(() => client.GetAllForIssue("owner", null, 1, ApiOptions.None)); Assert.Throws(() => client.GetAllForIssue("owner", "name", 1, null)); Assert.Throws(() => client.GetAllForIssue(1, 1, null)); Assert.Throws(() => client.GetAllForIssue("", "name", 1)); Assert.Throws(() => client.GetAllForIssue("owner", "", 1)); Assert.Throws(() => client.GetAllForIssue("", "name", 1, ApiOptions.None)); Assert.Throws(() => client.GetAllForIssue("owner", "", 1, ApiOptions.None)); } } public class TheGetForRepositoryMethod { [Fact] public async Task RequestsCorrectUrl() { var result = new List { new IssueEvent() }; var connection = Substitute.For(); var gitHubClient = new GitHubClient(connection); var client = new ObservableIssuesEventsClient(gitHubClient); IApiResponse> response = new ApiResponse>(CreateResponse(HttpStatusCode.OK), result); gitHubClient.Connection.Get>(Args.Uri, Args.EmptyDictionary) .Returns(Task.FromResult(response)); var issueEvents = await client.GetAllForRepository("fake", "repo").ToList(); connection.Received().Get>(Arg.Is(u => u.ToString() == "repos/fake/repo/issues/events"), Args.EmptyDictionary); Assert.Equal(1, issueEvents.Count); } [Fact] public async Task RequestsCorrectUrlWithRepositoryId() { var result = new List { new IssueEvent() }; var connection = Substitute.For(); var gitHubClient = new GitHubClient(connection); var client = new ObservableIssuesEventsClient(gitHubClient); IApiResponse> response = new ApiResponse>(CreateResponse(HttpStatusCode.OK), result); gitHubClient.Connection.Get>(Args.Uri, Args.EmptyDictionary) .Returns(Task.FromResult(response)); var issueEvents = await client.GetAllForRepository(1).ToList(); connection.Received().Get>(Arg.Is(u => u.ToString() == "repositories/1/issues/events"), Args.EmptyDictionary); Assert.Equal(1, issueEvents.Count); } [Fact] public async Task RequestsCorrectUrlWithApiOptions() { var result = new List { new IssueEvent() }; var connection = Substitute.For(); var gitHubClient = new GitHubClient(connection); var client = new ObservableIssuesEventsClient(gitHubClient); var options = new ApiOptions { StartPage = 1, PageCount = 1, PageSize = 1 }; IApiResponse> response = new ApiResponse>(CreateResponse(HttpStatusCode.OK), result); gitHubClient.Connection.Get>(Args.Uri, Arg.Is>(d => d.Count == 2)) .Returns(Task.FromResult(response)); var issueEvents = await client.GetAllForRepository("fake", "repo", options).ToList(); connection.Received().Get>(Arg.Is(u => u.ToString() == "repos/fake/repo/issues/events"), Arg.Is>(d => d.Count == 2)); Assert.Equal(1, issueEvents.Count); } [Fact] public async Task RequestsCorrectUrlWithRepositoryIdWithApiOptions() { var result = new List { new IssueEvent() }; var connection = Substitute.For(); var gitHubClient = new GitHubClient(connection); var client = new ObservableIssuesEventsClient(gitHubClient); var options = new ApiOptions { StartPage = 1, PageCount = 1, PageSize = 1 }; IApiResponse> response = new ApiResponse>(CreateResponse(HttpStatusCode.OK), result); gitHubClient.Connection.Get>(Args.Uri, Arg.Is>(d => d.Count == 2)) .Returns(Task.FromResult(response)); var issueEvents = await client.GetAllForRepository(1, options).ToList(); connection.Received().Get>(Arg.Is(u => u.ToString() == "repositories/1/issues/events"), Arg.Is>(d => d.Count == 2)); Assert.Equal(1, issueEvents.Count); } [Fact] public async Task EnsuresNonNullArguments() { var client = new ObservableIssuesEventsClient(Substitute.For()); Assert.Throws(() => client.GetAllForRepository(null, "name")); Assert.Throws(() => client.GetAllForRepository("owner", null)); Assert.Throws(() => client.GetAllForRepository(null, "name", ApiOptions.None)); Assert.Throws(() => client.GetAllForRepository("owner", null, ApiOptions.None)); Assert.Throws(() => client.GetAllForRepository("owner", "name", null)); Assert.Throws(() => client.GetAllForRepository(1, null)); Assert.Throws(() => client.GetAllForRepository("", "name")); Assert.Throws(() => client.GetAllForRepository("owner", "")); Assert.Throws(() => client.GetAllForRepository("", "name", ApiOptions.None)); Assert.Throws(() => client.GetAllForRepository("owner", "", ApiOptions.None)); } } public class TheGetMethod { [Fact] public void RequestsCorrectUrl() { var gitHubClient = Substitute.For(); var client = new ObservableIssuesEventsClient(gitHubClient); client.Get("fake", "repo", 42); gitHubClient.Received().Issue.Events.Get("fake", "repo", 42); } [Fact] public void RequestsCorrectUrlWithRepositoryId() { var gitHubClient = Substitute.For(); var client = new ObservableIssuesEventsClient(gitHubClient); client.Get(1, 42); gitHubClient.Received().Issue.Events.Get(1, 42); } [Fact] public async Task EnsuresNonNullArguments() { var client = new ObservableIssuesEventsClient(Substitute.For()); Assert.Throws(() => client.Get(null, "name", 1)); Assert.Throws(() => client.Get("owner", null, 1)); Assert.Throws(() => client.Get("", "name", 1)); Assert.Throws(() => client.Get("owner", "", 1)); } } } }