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 ObservableIssueTimelineClientTests { public class TheCtor { [Fact] public void EnsuresNonNullArguments() { Assert.Throws( () => new ObservableIssueTimelineClient(null)); } } public class TheGetAllForIssueMethod { [Fact] public async Task RequestsCorrectUrl() { var result = new List { new TimelineEventInfo() }; var connection = Substitute.For(); var gitHubClient = new GitHubClient(connection); var client = new ObservableIssueTimelineClient(gitHubClient); IApiResponse> response = new ApiResponse>( CreateResponse(HttpStatusCode.OK), result); gitHubClient.Connection.Get>(Args.Uri, Args.EmptyDictionary) .Returns(Task.FromResult(response)); var timelineEvents = await client.GetAllForIssue("fake", "repo", 42).ToList(); connection.Received().Get>( Arg.Is(u => u.ToString() == "repos/fake/repo/issues/42/timeline"), Arg.Any>()); Assert.Single(timelineEvents); } [Fact] public async Task RequestsCorrectUrlWithApiOptions() { var result = new List { new TimelineEventInfo() }; var connection = Substitute.For(); var gitHubClient = new GitHubClient(connection); var client = new ObservableIssueTimelineClient(gitHubClient); IApiResponse> response = new ApiResponse>(CreateResponse(HttpStatusCode.OK), result); gitHubClient.Connection.Get>(Args.Uri, Arg.Is>(d => d.Count == 1)) .Returns(Task.FromResult(response)); var timelineEvents = await client.GetAllForIssue("fake", "repo", 42, new ApiOptions { PageSize = 30 }).ToList(); connection.Received().Get>( Arg.Is(u => u.ToString() == "repos/fake/repo/issues/42/timeline"), Arg.Is>(d => d.Count == 1 && d["per_page"] == "30")); Assert.Single(timelineEvents); } [Fact] public async Task RequestCorrectUrlWithRepositoryId() { var result = new List { new TimelineEventInfo() }; var connection = Substitute.For(); var githubClient = new GitHubClient(connection); var client = new ObservableIssueTimelineClient(githubClient); IApiResponse> response = new ApiResponse>(CreateResponse(HttpStatusCode.OK), result); githubClient.Connection.Get>(Args.Uri, Args.EmptyDictionary) .Returns(Task.FromResult(response)); var timelineEvents = await client.GetAllForIssue(1, 42).ToList(); connection.Received().Get>( Arg.Is(u => u.ToString() == "repositories/1/issues/42/timeline"), Arg.Any>()); Assert.Single(timelineEvents); } [Fact] public async Task RequestCorrectUrlWithRepositoryIdAndApiOptions() { var result = new List { new TimelineEventInfo() }; var connection = Substitute.For(); var githubClient = new GitHubClient(connection); var client = new ObservableIssueTimelineClient(githubClient); IApiResponse> response = new ApiResponse>(CreateResponse(HttpStatusCode.OK), result); githubClient.Connection.Get>(Args.Uri, Arg.Is>(d => d.Count == 1)) .Returns(Task.FromResult(response)); var timelineEvents = await client.GetAllForIssue(1, 42, new ApiOptions { PageSize = 30 }).ToList(); connection.Received().Get>( Arg.Is(u => u.ToString() == "repositories/1/issues/42/timeline"), Arg.Is>(d => d.Count == 1 && d["per_page"] == "30")); Assert.Single(timelineEvents); } [Fact] public async Task EnsuresNonNullArguments() { var client = new ObservableIssueTimelineClient(Substitute.For()); Assert.Throws(() => client.GetAllForIssue(null, "repo", 42)); Assert.Throws(() => client.GetAllForIssue("owner", null, 42)); Assert.Throws(() => client.GetAllForIssue("owner", "repo", 42, null)); Assert.Throws(() => client.GetAllForIssue(1, 42, null)); Assert.Throws(() => client.GetAllForIssue("", "repo", 42)); Assert.Throws(() => client.GetAllForIssue("owner", "", 42)); } } } }