using System; using System.Collections.Generic; using System.Net; using System.Threading.Tasks; using NSubstitute; using Octokit.Internal; using Xunit; using static Octokit.Internal.TestSetup; namespace Octokit.Tests.Models { public class ReadOnlyPagedCollectionTests { public class TheGetNextPageMethod { [Fact] public async Task ReturnsTheNextPage() { var nextPageUrl = new Uri("https://example.com/page/2"); var listResponse = new ApiResponse>(CreateResponse(HttpStatusCode.OK), new List { new object(), new object() }); var nextPageResponse = Task.FromResult>>(listResponse); var links = new Dictionary { { "next", nextPageUrl } }; var scopes = new List(); var httpResponse = Substitute.For(); httpResponse.ApiInfo.Returns(new ApiInfo(links, scopes, scopes, "etag", new RateLimit(new Dictionary()))); var response = new ApiResponse>(httpResponse, new List()); var connection = Substitute.For(); connection.Get>(nextPageUrl, null, null).Returns(nextPageResponse); var pagedCollection = new ReadOnlyPagedCollection( response, nextPageUri => connection.Get>(nextPageUrl, null, null)); var nextPage = await pagedCollection.GetNextPage(); Assert.NotNull(nextPage); Assert.Equal(2, nextPage.Count); } [Fact] public async Task WhenNoInformationSetReturnsNull() { var nextPageUrl = new Uri("https://example.com/page/2"); var listResponse = new ApiResponse>(CreateResponse(HttpStatusCode.OK), new List { new object(), new object() }); var nextPageResponse = Task.FromResult>>(listResponse); var links = new Dictionary(); var scopes = new List(); var httpResponse = Substitute.For(); httpResponse.ApiInfo.Returns(new ApiInfo(links, scopes, scopes, "etag", new RateLimit(new Dictionary()))); var response = new ApiResponse>(httpResponse, new List()); var connection = Substitute.For(); connection.Get>(nextPageUrl, null, null).Returns(nextPageResponse); var pagedCollection = new ReadOnlyPagedCollection( response, nextPageUri => connection.Get>(nextPageUrl, null, null)); var nextPage = await pagedCollection.GetNextPage(); Assert.Null(nextPage); } [Fact] public async Task WhenInlineFuncKillsPaginationReturnNull() { var nextPageUrl = new Uri("https://example.com/page/2"); var listResponse = new ApiResponse>(CreateResponse(HttpStatusCode.OK), new List { new object(), new object() }); var nextPageResponse = Task.FromResult>>(listResponse); var links = new Dictionary { { "next", nextPageUrl } }; var scopes = new List(); var httpResponse = Substitute.For(); httpResponse.ApiInfo.Returns(new ApiInfo(links, scopes, scopes, "etag", new RateLimit(new Dictionary()))); var response = new ApiResponse>(httpResponse, new List()); var connection = Substitute.For(); connection.Get>(nextPageUrl, null, null).Returns(nextPageResponse); var pageCount = 1; var pagedCollection = new ReadOnlyPagedCollection( response, nextPageUri => { if (pageCount > 1) { return null; } pageCount++; return connection.Get>(nextPageUrl, null, null); }); var first = await pagedCollection.GetNextPage(); var second = await pagedCollection.GetNextPage(); Assert.NotNull(first); Assert.Null(second); } } } }