Skip to content

Commit 70dc24d

Browse files
robinsocClarck Robinson
and
Clarck Robinson
authored
refacto: use the new API to retrieve the project by the project id (#183)
Part of [request #22618](https://tuleap.net/plugins/tracker/?aid=22618) Stop using the deprecated client in Jenkins plugin Co-authored-by: Clarck Robinson <[email protected]>
1 parent 16a296d commit 70dc24d

File tree

6 files changed

+212
-9
lines changed

6 files changed

+212
-9
lines changed

src/main/java/io/jenkins/plugins/tuleap_api/client/Project.java

+6
Original file line numberDiff line numberDiff line change
@@ -3,5 +3,11 @@
33
public interface Project {
44

55
Integer getId();
6+
67
String getShortname();
8+
9+
String getLabel();
10+
11+
String getUri();
12+
713
}

src/main/java/io/jenkins/plugins/tuleap_api/client/ProjectApi.java

+2
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import io.jenkins.plugins.tuleap_api.client.authentication.AccessToken;
44
import io.jenkins.plugins.tuleap_api.client.exceptions.ProjectNotFoundException;
5+
import io.jenkins.plugins.tuleap_credentials.TuleapAccessToken;
56

67
import java.util.List;
78

@@ -11,5 +12,6 @@ public interface ProjectApi {
1112
String PROJECT_GROUPS = "/user_groups";
1213

1314
Project getProjectByShortname(String shortname, AccessToken token) throws ProjectNotFoundException;
15+
Project getProjectById(String projectId, TuleapAccessToken token) ;
1416
List<UserGroup> getProjectUserGroups(Integer projectId, AccessToken token);
1517
}

src/main/java/io/jenkins/plugins/tuleap_api/client/internals/TuleapApiClient.java

+23
Original file line numberDiff line numberDiff line change
@@ -246,6 +246,29 @@ public Project getProjectByShortname(String shortname, AccessToken token) throws
246246
}
247247
}
248248

249+
@Override
250+
@SuppressFBWarnings("NP_NULL_ON_SOME_PATH_FROM_RETURN_VALUE") // see https://github.com/spotbugs/spotbugs/issues/651
251+
public Project getProjectById(String projectId, TuleapAccessToken token) {
252+
final Request request = new Request.Builder()
253+
.url(this.tuleapConfiguration.getApiBaseUrl() + this.PROJECT_API + "/" + projectId)
254+
.addHeader(this.AUTHORIZATION_HEADER, token.getToken().getPlainText())
255+
.get()
256+
.build();
257+
258+
try (final Response response = this.client.newCall(request).execute()) {
259+
if (! response.isSuccessful()) {
260+
throw new InvalidTuleapResponseException(response);
261+
}
262+
263+
return this.objectMapper.readValue(
264+
Objects.requireNonNull(response.body()).string(),
265+
ProjectEntity.class
266+
);
267+
} catch (IOException | InvalidTuleapResponseException e) {
268+
throw new RuntimeException("Error while contacting Tuleap server", e);
269+
}
270+
}
271+
249272
@Override
250273
@SuppressFBWarnings("NP_NULL_ON_SOME_PATH_FROM_RETURN_VALUE") // see https://github.com/spotbugs/spotbugs/issues/651
251274
public List<UserGroup> getProjectUserGroups(Integer projectId, AccessToken token) {

src/main/java/io/jenkins/plugins/tuleap_api/client/internals/entities/ProjectEntity.java

+18-2
Original file line numberDiff line numberDiff line change
@@ -7,19 +7,35 @@ public class ProjectEntity implements Project {
77

88
private String shortname;
99
private Integer id;
10+
private final String uri;
11+
private final String label;
1012

1113
public ProjectEntity(
1214
@JsonProperty("shortname") String shortname,
13-
@JsonProperty("id") Integer id
14-
){
15+
@JsonProperty("id") Integer id,
16+
@JsonProperty("uri") String uri,
17+
@JsonProperty("label") String label
18+
) {
1519
this.shortname = shortname;
1620
this.id = id;
21+
this.uri = uri;
22+
this.label = label;
1723
}
1824

1925
public String getShortname() {
2026
return this.shortname;
2127
}
2228

29+
@Override
30+
public String getUri() {
31+
return this.uri;
32+
}
33+
34+
@Override
35+
public String getLabel() {
36+
return this.label;
37+
}
38+
2339
public Integer getId() {
2440
return this.id;
2541
}

src/test/java/io/jenkins/plugins/tuleap_api/client/internals/TuleapApiClientTest.java

+44-7
Original file line numberDiff line numberDiff line change
@@ -171,9 +171,9 @@ public void itShouldReturnTheUserMemberShipList() throws IOException {
171171
.thenReturn(jsonUserGroupsPayload2)
172172
.thenReturn(jsonUserGroupsPayload3);
173173

174-
UserGroup userGroup1 = new UserGroupEntity("project_members", new ProjectEntity("coincoin", 22));
175-
UserGroup userGroup2 = new UserGroupEntity("project_admins", new ProjectEntity("coincoin", 22));
176-
UserGroup userGroup3 = new UserGroupEntity("project_members", new ProjectEntity("git-test", 33));
174+
UserGroup userGroup1 = new UserGroupEntity("project_members", new ProjectEntity("coincoin", 22, "projects/106", "coincoin"));
175+
UserGroup userGroup2 = new UserGroupEntity("project_admins", new ProjectEntity("coincoin", 22, "projects/106", "coincoin"));
176+
UserGroup userGroup3 = new UserGroupEntity("project_members", new ProjectEntity("git-test", 33, "projects/113", "git-test"));
177177

178178
List<UserGroup> expectedList = Arrays.asList(userGroup1, userGroup2, userGroup3);
179179

@@ -210,7 +210,7 @@ public void itShouldCallGetUserMembershipNameIfTheServerReturns400() throws IOEx
210210
.thenReturn(jsonUserMembershipPayload)
211211
.thenReturn(jsonUserGroupsPayload1);
212212

213-
UserGroup userGroup1 = new UserGroupEntity("project_members", new ProjectEntity("coincoin", 22));
213+
UserGroup userGroup1 = new UserGroupEntity("project_members", new ProjectEntity("coincoin", 22, "projects/106", "coincoin"));
214214
List<UserGroup> expectedList = Arrays.asList(userGroup1);
215215

216216
List<UserGroup> resultList = this.tuleapApiClient.getUserMembership(this.accessToken);
@@ -235,8 +235,8 @@ public void itShouldReturnUserMembership() throws IOException {
235235
when(responseBody.string())
236236
.thenReturn(projectMembershipPayload);
237237

238-
UserGroup userMembership1 = new UserGroupEntity("project_members", new ProjectEntity("coincoin", 106));
239-
UserGroup userMembership2 = new UserGroupEntity("atchoum", new ProjectEntity("git-test", 113));
238+
UserGroup userMembership1 = new UserGroupEntity("project_members", new ProjectEntity("coincoin", 106, "projects/106", "coincoin"));
239+
UserGroup userMembership2 = new UserGroupEntity("atchoum", new ProjectEntity("git-test", 113, "projects/113", "git-test"));
240240

241241
List<UserGroup> expectedList = Arrays.asList(userMembership1, userMembership2);
242242

@@ -290,7 +290,7 @@ public void itReturnsTheUserGroup() throws IOException {
290290
when(responseBody.string())
291291
.thenReturn(jsonUserGroupsPayload);
292292

293-
UserGroup expectedUserGroup = new UserGroupEntity("project_members", new ProjectEntity("coincoin", 22));
293+
UserGroup expectedUserGroup = new UserGroupEntity("project_members", new ProjectEntity("coincoin", 22, "projects/106", "coincoin"));
294294
UserGroup resultUserGroup = tuleapApiClient.getUserGroup("106_3", accessToken);
295295
assertEquals(expectedUserGroup.getGroupName(), resultUserGroup.getGroupName());
296296
assertEquals(expectedUserGroup.getProjectName(), resultUserGroup.getProjectName());
@@ -679,4 +679,41 @@ public CredentialsDescriptor getDescriptor() {
679679
}
680680
};
681681
}
682+
683+
@Test(expected = RuntimeException.class)
684+
public void itThrowsExceptionWhenTheProjectCannotBeRetrieved() throws IOException, FileContentNotFoundException {
685+
TuleapAccessToken tuleapAccessToken = this.getTuleapAccessTokenStubClass();
686+
Call call = mock(Call.class);
687+
Response response = mock(Response.class);
688+
689+
when(client.newCall(any())).thenReturn(call);
690+
when(call.execute()).thenReturn(response);
691+
when(response.code()).thenReturn(400);
692+
when(response.isSuccessful()).thenReturn(false);
693+
694+
tuleapApiClient.getProjectById("10", tuleapAccessToken);
695+
}
696+
697+
@Test
698+
public void itReturnsTheWantedGivenIdProject() throws IOException {
699+
TuleapAccessToken tuleapAccessToken = this.getTuleapAccessTokenStubClass();
700+
Call call = mock(Call.class);
701+
Response response = mock(Response.class);
702+
ResponseBody responseBody = mock(ResponseBody.class);
703+
String payload = IOUtils.toString(TuleapApiClientTest.class.getResourceAsStream("single_project_payload.json"), UTF_8);
704+
705+
when(client.newCall(any())).thenReturn(call);
706+
when(call.execute()).thenReturn(response);
707+
when(response.isSuccessful()).thenReturn(true);
708+
when(response.body()).thenReturn(responseBody);
709+
when(responseBody.string()).thenReturn(payload);
710+
711+
Project project = tuleapApiClient.getProjectById("use-me", tuleapAccessToken);
712+
713+
assertEquals("use-me", project.getShortname());
714+
Integer expectedId = 118;
715+
assertEquals(expectedId, project.getId());
716+
assertEquals("Use Me", project.getLabel());
717+
assertEquals("projects/118", project.getUri());
718+
}
682719
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,119 @@
1+
{
2+
"resources": [
3+
{
4+
"type": "docman_metadata",
5+
"uri": "projects/118/docman_metadata"
6+
},
7+
{
8+
"type": "docman_service",
9+
"uri": "projects/118/docman_service"
10+
},
11+
{
12+
"type": "trackers",
13+
"uri": "projects/118/trackers"
14+
},
15+
{
16+
"type": "backlog",
17+
"uri": "projects/118/backlog"
18+
},
19+
{
20+
"type": "milestones",
21+
"uri": "projects/118/milestones"
22+
},
23+
{
24+
"type": "plannings",
25+
"uri": "projects/118/plannings"
26+
},
27+
{
28+
"type": "git",
29+
"uri": "projects/118/git"
30+
},
31+
{
32+
"type": "svn",
33+
"uri": "projects/118/svn"
34+
},
35+
{
36+
"type": "testmanagement_campaigns",
37+
"uri": "projects/118/testmanagement_campaigns"
38+
},
39+
{
40+
"type": "testmanagement_definitions",
41+
"uri": "projects/118/testmanagement_definitions"
42+
},
43+
{
44+
"type": "testmanagement_nodes",
45+
"uri": "projects/118/testmanagement_nodes"
46+
},
47+
{
48+
"type": "frs_packages",
49+
"uri": "projects/118/frs_packages"
50+
},
51+
{
52+
"type": "frs_service",
53+
"uri": "projects/118/frs_service"
54+
},
55+
{
56+
"type": "project_services",
57+
"uri": "projects/118/project_services"
58+
},
59+
{
60+
"type": "user_groups",
61+
"uri": "projects/118/user_groups"
62+
},
63+
{
64+
"type": "phpwiki",
65+
"uri": "projects/118/phpwiki"
66+
},
67+
{
68+
"type": "heartbeats",
69+
"uri": "projects/118/heartbeats"
70+
},
71+
{
72+
"type": "labels",
73+
"uri": "projects/118/labels"
74+
}
75+
],
76+
"additional_informations": {
77+
"agiledashboard": {
78+
"root_planning": {
79+
"id": 29,
80+
"uri": "route-not-yet-implemented",
81+
"label": "Release Planning",
82+
"project": {
83+
"id": 118,
84+
"uri": "projects/118",
85+
"label": null
86+
},
87+
"milestone_tracker": {
88+
"id": 155,
89+
"uri": "trackers/155",
90+
"label": "Releases",
91+
"project": {
92+
"id": 118,
93+
"uri": "projects/118",
94+
"label": "Use Me"
95+
}
96+
},
97+
"backlog_trackers": [
98+
{
99+
"id": 153,
100+
"uri": "trackers/153"
101+
},
102+
{
103+
"id": 160,
104+
"uri": "trackers/160"
105+
}
106+
],
107+
"milestones_uri": "plannings/29/milestones"
108+
}
109+
}
110+
},
111+
"is_member_of": true,
112+
"id": 118,
113+
"uri": "projects/118",
114+
"label": "Use Me",
115+
"shortname": "use-me",
116+
"status": "active",
117+
"access": "public",
118+
"is_template": false
119+
}

0 commit comments

Comments
 (0)