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.Get <List <Repository> >(firstPageUrl, Arg.Any <IDictionary <string, string> >(), null) .Returns(Task.Factory.StartNew <IApiResponse <List <Repository> > >(() => firstPageResponse)); gitHubClient.Connection.Get <List <Repository> >(secondPageUrl, Arg.Any <IDictionary <string, string> >(), null) .Returns(Task.Factory.StartNew <IApiResponse <List <Repository> > >(() => secondPageResponse)); gitHubClient.Connection.Get <List <Repository> >(thirdPageUrl, Arg.Any <IDictionary <string, string> >(), null) .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, Arg.Any <IDictionary <string, string> >(), null); gitHubClient.Connection.Received(1).Get <List <Repository> >(secondPageUrl, Arg.Any <IDictionary <string, string> >(), null); gitHubClient.Connection.Received(1).Get <List <Repository> >(thirdPageUrl, Arg.Any <IDictionary <string, string> >(), null); }
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> > { 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 lastPageResponse = new ApiResponse <List <Repository> > { BodyAsObject = new List <Repository> { new Repository { Id = 7 } }, 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> > >(() => 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> > ( 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 fourthPageUrl = new Uri("https://example.com/page/4"); var thirdPageLinks = new Dictionary <string, Uri> { { "next", fourthPageUrl } }; var thirdPageResponse = new ApiResponse <List <Repository> > ( CreateResponseWithApiInfo(thirdPageLinks), new List <Repository> { new Repository(7) } ); var lastPageResponse = new ApiResponse <List <Repository> > ( new Response(), new List <Repository> { new Repository(8) } ); var gitHubClient = Substitute.For <IGitHubClient>(); gitHubClient.Connection.GetResponse <List <Repository> >(firstPageUrl) .Returns(Task.FromResult <IApiResponse <List <Repository> > >(firstPageResponse)); gitHubClient.Connection.GetResponse <List <Repository> >(secondPageUrl) .Returns(Task.FromResult <IApiResponse <List <Repository> > >(secondPageResponse)); gitHubClient.Connection.GetResponse <List <Repository> >(thirdPageUrl) .Returns(Task.FromResult <IApiResponse <List <Repository> > >(thirdPageResponse)); gitHubClient.Connection.GetResponse <List <Repository> >(fourthPageUrl) .Returns(Task.FromResult <IApiResponse <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); }