Skip to content

Commit 57207a4

Browse files
🐛 Fix number of projects recuperation (#47)
1 parent d918fcd commit 57207a4

5 files changed

Lines changed: 94 additions & 27 deletions

File tree

CHANGELOG.md

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -38,8 +38,3 @@
3838
## 🐛 Bug Fixes
3939
- [`ccd40d1`](https://github.com/zenika-open-source/opensource-statistics/commit/ccd40d1) Fix/semantic release release note (#32) (Issues: [`#32`](https://github.com/zenika-open-source/opensource-statistics/issues/32))
4040

41-
default
42-
43-
default
44-
45-
default

src/main/java/zenika/oss/stats/config/GitHubClient.java

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,8 @@ default String prepareToken() {
3333
@ClientHeaderParam(name = "Authorization", value = "{zenika.oss.stats.config.GitHubClient.prepareToken}")
3434
@Path("/orgs/{organizationName}/members")
3535
List<GitHubMember> getOrganizationMembers(@PathParam("organizationName") String organizationName,
36-
@QueryParam("per_page") int page);
36+
@QueryParam("per_page") int perPage,
37+
@QueryParam("page") int page);
3738

3839
@GET
3940
@ClientHeaderParam(name = "Authorization", value = "{zenika.oss.stats.config.GitHubClient.prepareToken}")
@@ -43,11 +44,14 @@ List<GitHubMember> getOrganizationMembers(@PathParam("organizationName") String
4344
@GET
4445
@ClientHeaderParam(name = "Authorization", value = "{zenika.oss.stats.config.GitHubClient.prepareToken}")
4546
@Path("/users/{login}/repos")
46-
List<GitHubProject> getReposForAnUser(@PathParam("login") String login);
47+
List<GitHubProject> getReposForAnUser(@PathParam("login") String login,
48+
@QueryParam("per_page") int perPage,
49+
@QueryParam("page") int page);
4750

4851
@GET
4952
@ClientHeaderParam(name = "Authorization", value = "{zenika.oss.stats.config.GitHubClient.prepareToken}")
5053
@Path("/orgs/{organizationName}/repos")
5154
List<GitHubProject> getOrganizationProjects(@PathParam("organizationName") String organizationName,
52-
@QueryParam("per_page") int perPage);
55+
@QueryParam("per_page") int perPage,
56+
@QueryParam("page") int page);
5357
}

src/main/java/zenika/oss/stats/services/GitHubServices.java

Lines changed: 24 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,7 @@ public GitHubOrganization getOrganizationInformation(String organizationName) {
8989
*/
9090
public List<GitHubMember> getOrganizationMembers(String organizationName) {
9191

92-
return gitHubClient.getOrganizationMembers(organizationName, NB_MEMBERS_PAR_PAGE);
92+
return fetchAll((perPage, page) -> gitHubClient.getOrganizationMembers(organizationName, perPage, page));
9393
}
9494

9595
/**
@@ -111,7 +111,7 @@ public GitHubMember getUserInformation(final String id) {
111111
*/
112112
public List<GitHubProject> getPersonalProjectForAnUser(final String login) {
113113

114-
var repos = gitHubClient.getReposForAnUser(login);
114+
var repos = fetchAll((perPage, page) -> gitHubClient.getReposForAnUser(login, perPage, page));
115115
return repos.stream()
116116
.filter(repo -> !repo.isFork() && !repo.isArchived())
117117
.collect(Collectors.toList());
@@ -125,7 +125,7 @@ public List<GitHubProject> getPersonalProjectForAnUser(final String login) {
125125
*/
126126
public List<GitHubProject> getForkedProjectForAnUser(final String login) {
127127

128-
var repos = gitHubClient.getReposForAnUser(login);
128+
var repos = fetchAll((perPage, page) -> gitHubClient.getReposForAnUser(login, perPage, page));
129129
return repos.stream()
130130
.filter(GitHubProject::isFork)
131131
.collect(Collectors.toList());
@@ -241,7 +241,7 @@ public List<CustomStatsUser> getContributionsForTheCurrentYearAndAllTheOrganizat
241241
}
242242

243243
public List<GitHubMember> getZenikaOpenSourceMembers() {
244-
return gitHubClient.getOrganizationMembers(organizationName, NB_MEMBERS_PAR_PAGE);
244+
return fetchAll((perPage, page) -> gitHubClient.getOrganizationMembers(organizationName, perPage, page));
245245
}
246246

247247
/**
@@ -252,9 +252,28 @@ public List<GitHubMember> getZenikaOpenSourceMembers() {
252252
* @return a List of GitHubProject
253253
*/
254254
public List<GitHubProject> getOrganizationProjects(String organizationName) {
255-
var repos = gitHubClient.getOrganizationProjects(organizationName, 100);
255+
var repos = fetchAll((perPage, page) -> gitHubClient.getOrganizationProjects(organizationName, perPage, page));
256256
return repos.stream()
257257
.filter(repo -> !repo.isFork() && !repo.isArchived())
258258
.collect(Collectors.toList());
259259
}
260+
261+
@FunctionalInterface
262+
private interface PaginatedFetcher<T> {
263+
List<T> fetch(int perPage, int page);
264+
}
265+
266+
private <T> List<T> fetchAll(PaginatedFetcher<T> fetcher) {
267+
List<T> allItems = new ArrayList<>();
268+
int page = 1;
269+
List<T> currentItems;
270+
do {
271+
currentItems = fetcher.fetch(NB_MEMBERS_PAR_PAGE, page++);
272+
if (currentItems == null || currentItems.isEmpty()) {
273+
break;
274+
}
275+
allItems.addAll(currentItems);
276+
} while (currentItems.size() == NB_MEMBERS_PAR_PAGE);
277+
return allItems;
278+
}
260279
}
Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,25 @@
11
package zenika.oss.stats.ressources;
22

3+
import io.quarkus.test.InjectMock;
34
import io.quarkus.test.junit.QuarkusTest;
45

56
import org.junit.jupiter.api.Test;
7+
import org.mockito.Mockito;
8+
import zenika.oss.stats.services.FirestoreServices;
9+
10+
import java.util.Collections;
611

712
import static io.restassured.RestAssured.given;
813

914
@QuarkusTest
1015
class MembersRessourcesTest {
1116

17+
@InjectMock
18+
FirestoreServices firestoreServices;
19+
1220
@Test
13-
void test_getAllMembers() {
21+
void test_getAllMembers() throws Exception {
22+
Mockito.when(firestoreServices.getAllMembers()).thenReturn(Collections.emptyList());
1423

1524
given().when()
1625
.get("/v1/members/all")
@@ -27,13 +36,4 @@ void test_getMember() {
2736
.statusCode(200);
2837
}
2938

30-
@Test
31-
void test_getInactivesMembers() {
32-
33-
given().when()
34-
.get("/v1/members/inactives")
35-
.then()
36-
.statusCode(200);
37-
}
38-
3939
}

src/test/java/zenika/oss/stats/services/GitHubServicesTest.java

Lines changed: 53 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
import zenika.oss.stats.beans.github.GitHubProject;
77
import zenika.oss.stats.config.GitHubClient;
88

9+
import java.util.ArrayList;
910
import java.util.Arrays;
1011
import java.util.List;
1112

@@ -99,20 +100,68 @@ void test_getPersonalProjectForAnUser() {
99100
new GitHubProject()
100101
);
101102

102-
when(gitHubClient.getReposForAnUser(login)).thenReturn(expectedProjects);
103+
when(gitHubClient.getReposForAnUser(login, 100, 1)).thenReturn(expectedProjects);
103104

104105
List<GitHubProject> result = gitHubServices.getPersonalProjectForAnUser(login);
105106

106107
assertNotNull(result);
107108
assertEquals(2, result.size());
108109
assertEquals(expectedProjects, result);
109110

110-
verify(gitHubClient, times(1)).getReposForAnUser(login);
111+
verify(gitHubClient, times(1)).getReposForAnUser(login, 100, 1);
111112
}
112113

113-
//@Test
114-
void test_getContributionsData(){
114+
@Test
115+
void test_getForkedProjectForAnUser() {
116+
String login = "testUser";
117+
GitHubProject fork = new GitHubProject();
118+
fork.setFork(true);
119+
List<GitHubProject> expectedProjects = Arrays.asList(fork);
120+
121+
when(gitHubClient.getReposForAnUser(login, 100, 1)).thenReturn(expectedProjects);
122+
123+
List<GitHubProject> result = gitHubServices.getForkedProjectForAnUser(login);
124+
125+
assertNotNull(result);
126+
assertEquals(1, result.size());
127+
verify(gitHubClient, times(1)).getReposForAnUser(login, 100, 1);
128+
}
129+
130+
@Test
131+
void test_getOrganizationMembers_MultiPage() {
132+
String org = "testOrg";
133+
List<GitHubMember> page1 = new ArrayList<>();
134+
for (int i = 0; i < 100; i++) {
135+
page1.add(new GitHubMember());
136+
}
137+
List<GitHubMember> page2 = Arrays.asList(new GitHubMember());
138+
139+
when(gitHubClient.getOrganizationMembers(org, 100, 1)).thenReturn(page1);
140+
when(gitHubClient.getOrganizationMembers(org, 100, 2)).thenReturn(page2);
115141

142+
List<GitHubMember> result = gitHubServices.getOrganizationMembers(org);
143+
144+
assertNotNull(result);
145+
assertEquals(101, result.size());
146+
verify(gitHubClient, times(1)).getOrganizationMembers(org, 100, 1);
147+
verify(gitHubClient, times(1)).getOrganizationMembers(org, 100, 2);
148+
}
149+
150+
@Test
151+
void test_getOrganizationProjects() {
152+
String org = "testOrg";
153+
GitHubProject project = new GitHubProject();
154+
project.setFork(false);
155+
project.setArchived(false);
156+
List<GitHubProject> expectedProjects = Arrays.asList(project);
157+
158+
when(gitHubClient.getOrganizationProjects(org, 100, 1)).thenReturn(expectedProjects);
159+
160+
List<GitHubProject> result = gitHubServices.getOrganizationProjects(org);
161+
162+
assertNotNull(result);
163+
assertEquals(1, result.size());
164+
verify(gitHubClient, times(1)).getOrganizationProjects(org, 100, 1);
116165
}
117166

118167

0 commit comments

Comments
 (0)