public async Task ReturnsEveryPageOfRepositories() { var firstPageUrl = new Uri("user/repos", UriKind.Relative); var secondPageUrl = new Uri("https://example.com/page/2"); var firstPageLinks = new Dictionary<string, Uri> { { "next", secondPageUrl } }; var firstPageResponse = new ApiResponse<List<Repository>>( CreateResponseWithApiInfo(firstPageLinks), new List<Repository> { new Repository(1), new Repository(2), new Repository(3) }); var thirdPageUrl = new Uri("https://example.com/page/3"); var secondPageLinks = new Dictionary<string, Uri> { { "next", thirdPageUrl } }; var secondPageResponse = new ApiResponse<List<Repository>> ( CreateResponseWithApiInfo(secondPageLinks), new List<Repository> { new Repository(4), new Repository(5), new Repository(6) }); var lastPageResponse = new ApiResponse<List<Repository>>( new Response(), new List<Repository> { new Repository(7) }); var gitHubClient = Substitute.For<IGitHubClient>(); gitHubClient.Connection.GetResponse<List<Repository>>(firstPageUrl) .Returns(Task.Factory.StartNew<IApiResponse<List<Repository>>>(() => firstPageResponse)); gitHubClient.Connection.GetResponse<List<Repository>>(secondPageUrl) .Returns(Task.Factory.StartNew<IApiResponse<List<Repository>>>(() => secondPageResponse)); gitHubClient.Connection.GetResponse<List<Repository>>(thirdPageUrl) .Returns(Task.Factory.StartNew<IApiResponse<List<Repository>>>(() => lastPageResponse)); var repositoriesClient = new ObservableRepositoriesClient(gitHubClient); var results = await repositoriesClient.GetAllForCurrent().ToArray(); Assert.Equal(7, results.Length); gitHubClient.Connection.Received(1).Get<List<Repository>>(firstPageUrl, null, null); gitHubClient.Connection.Received(1).Get<List<Repository>>(secondPageUrl, null, null); gitHubClient.Connection.Received(1).Get<List<Repository>>(thirdPageUrl, null, null); }
public async Task StopsMakingNewRequestsWhenTakeIsFulfilled() { var firstPageUrl = new Uri("user/repos", UriKind.Relative); var secondPageUrl = new Uri("https://example.com/page/2"); var firstPageLinks = new Dictionary<string, Uri> { { "next", secondPageUrl } }; var firstPageResponse = new ApiResponse<List<Repository>> { BodyAsObject = new List<Repository> { new Repository {Id = 1}, new Repository {Id = 2}, new Repository {Id = 3} }, ApiInfo = CreateApiInfo(firstPageLinks) }; var thirdPageUrl = new Uri("https://example.com/page/3"); var secondPageLinks = new Dictionary<string, Uri> { { "next", thirdPageUrl } }; var secondPageResponse = new ApiResponse<List<Repository>> { BodyAsObject = new List<Repository> { new Repository {Id = 4}, new Repository {Id = 5}, new Repository {Id = 6} }, ApiInfo = CreateApiInfo(secondPageLinks) }; var fourthPageUrl = new Uri("https://example.com/page/4"); var thirdPageLinks = new Dictionary<string, Uri> { { "next", fourthPageUrl } }; var thirdPageResponse = new ApiResponse<List<Repository>> { BodyAsObject = new List<Repository> { new Repository {Id = 7} }, ApiInfo = CreateApiInfo(thirdPageLinks) }; var lastPageResponse = new ApiResponse<List<Repository>> { BodyAsObject = new List<Repository> { new Repository {Id = 8} }, ApiInfo = CreateApiInfo(new Dictionary<string, Uri>()) }; var gitHubClient = Substitute.For<IGitHubClient>(); gitHubClient.Connection.GetResponse<List<Repository>>(firstPageUrl) .Returns(Task.Factory.StartNew<IResponse<List<Repository>>>(() => firstPageResponse)); gitHubClient.Connection.GetResponse<List<Repository>>(secondPageUrl) .Returns(Task.Factory.StartNew<IResponse<List<Repository>>>(() => secondPageResponse)); gitHubClient.Connection.GetResponse<List<Repository>>(thirdPageUrl) .Returns(Task.Factory.StartNew<IResponse<List<Repository>>>(() => thirdPageResponse)); gitHubClient.Connection.GetResponse<List<Repository>>(fourthPageUrl) .Returns(Task.Factory.StartNew<IResponse<List<Repository>>>(() => lastPageResponse)); var repositoriesClient = new ObservableRepositoriesClient(gitHubClient); var results = await repositoriesClient.GetAllForCurrent().Take(4).ToArray(); Assert.Equal(4, results.Length); gitHubClient.Connection.Received(1).Get<List<Repository>>(firstPageUrl, null, null); gitHubClient.Connection.Received(1).Get<List<Repository>>(secondPageUrl, null, null); gitHubClient.Connection.Received(0).Get<List<Repository>>(thirdPageUrl, null, null); gitHubClient.Connection.Received(0).Get<List<Repository>>(fourthPageUrl, null, null); }