Commit c84bea9f authored by Greg Messner's avatar Greg Messner
Browse files

Added support for BugzillaService and CustomIssueTrackerService (#404).

parent 3d879261
package org.gitlab4j.api; package org.gitlab4j.api;
import org.gitlab4j.api.GitLabApi.ApiVersion; import org.gitlab4j.api.GitLabApi.ApiVersion;
import org.gitlab4j.api.services.BugzillaService;
import org.gitlab4j.api.services.CustomIssueTrackerService;
import org.gitlab4j.api.services.ExternalWikiService; import org.gitlab4j.api.services.ExternalWikiService;
import org.gitlab4j.api.services.HipChatService; import org.gitlab4j.api.services.HipChatService;
import org.gitlab4j.api.services.JiraService; import org.gitlab4j.api.services.JiraService;
...@@ -95,22 +97,7 @@ public class ServicesApi extends AbstractApi { ...@@ -95,22 +97,7 @@ public class ServicesApi extends AbstractApi {
* @throws GitLabApiException if any exception occurs * @throws GitLabApiException if any exception occurs
*/ */
public HipChatService updateHipChatService(Object projectIdOrPath, HipChatService hipChat) throws GitLabApiException { public HipChatService updateHipChatService(Object projectIdOrPath, HipChatService hipChat) throws GitLabApiException {
GitLabApiForm formData = new GitLabApiForm() GitLabApiForm formData = hipChat.servicePropertiesForm();
.withParam("push_events", hipChat.getPushEvents())
.withParam("issues_events", hipChat.getIssuesEvents())
.withParam("confidential_issues_events", hipChat.getConfidentialIssuesEvents())
.withParam("merge_requests_events", hipChat.getMergeRequestsEvents())
.withParam("tag_push_events", hipChat.getTagPushEvents())
.withParam("note_events", hipChat.getNoteEvents())
.withParam("confidential_note_events", hipChat.getConfidentialNoteEvents())
.withParam("pipeline_events", hipChat.getPipelineEvents())
.withParam("token", hipChat.getToken(), true)
.withParam("color", hipChat.getColor())
.withParam("notify", hipChat.getNotify())
.withParam("room", hipChat.getRoom())
.withParam("api_version", hipChat.getApiVersion())
.withParam("server", hipChat.getServer())
.withParam("notify_only_broken_pipelines", hipChat.getNotifyOnlyBrokenPipelines());
Response response = put(Response.Status.OK, formData.asMap(), "projects", getProjectIdOrPath(projectIdOrPath), "services", "hipchat"); Response response = put(Response.Status.OK, formData.asMap(), "projects", getProjectIdOrPath(projectIdOrPath), "services", "hipchat");
return (response.readEntity(HipChatService.class)); return (response.readEntity(HipChatService.class));
} }
...@@ -212,30 +199,7 @@ public class ServicesApi extends AbstractApi { ...@@ -212,30 +199,7 @@ public class ServicesApi extends AbstractApi {
* @throws GitLabApiException if any exception occurs * @throws GitLabApiException if any exception occurs
*/ */
public SlackService updateSlackService(Object projectIdOrPath, SlackService slackNotifications) throws GitLabApiException { public SlackService updateSlackService(Object projectIdOrPath, SlackService slackNotifications) throws GitLabApiException {
GitLabApiForm formData = new GitLabApiForm() GitLabApiForm formData = slackNotifications.servicePropertiesForm();
.withParam("webhook", slackNotifications.getWebhook(), true)
.withParam("username", slackNotifications.getUsername())
.withParam("channel", slackNotifications.getDefaultChannel())
.withParam("notify_only_broken_pipelines", slackNotifications.getNotifyOnlyBrokenPipelines())
.withParam("notify_only_default_branch", slackNotifications.getNotifyOnlyDefaultBranch())
.withParam("push_events", slackNotifications.getPushEvents())
.withParam("issues_events", slackNotifications.getIssuesEvents())
.withParam("confidential_issues_events", slackNotifications.getConfidentialIssuesEvents())
.withParam("merge_requests_events", slackNotifications.getMergeRequestsEvents())
.withParam("tag_push_events", slackNotifications.getTagPushEvents())
.withParam("note_events", slackNotifications.getNoteEvents())
.withParam("confidential_note_events", slackNotifications.getConfidentialNoteEvents())
.withParam("pipeline_events", slackNotifications.getPipelineEvents())
.withParam("wiki_page_events", slackNotifications.getWikiPageEvents())
.withParam("push_channel", slackNotifications.getPushChannel())
.withParam("issue_channel", slackNotifications.getIssueChannel())
.withParam("confidential_issue_channel", slackNotifications.getConfidentialIssueChannel())
.withParam("merge_request_channel", slackNotifications.getMergeRequestChannel())
.withParam("note_channel", slackNotifications.getNoteChannel())
.withParam("confidential_note_channel", slackNotifications.getConfidentialNoteChannel())
.withParam("tag_push_channel", slackNotifications.getTagPushChannel())
.withParam("pipeline_channel", slackNotifications.getPipelineChannel())
.withParam("wiki_page_channel", slackNotifications.getWikiPageChannel());
Response response = put(Response.Status.OK, formData.asMap(), "projects", getProjectIdOrPath(projectIdOrPath), "services", "slack"); Response response = put(Response.Status.OK, formData.asMap(), "projects", getProjectIdOrPath(projectIdOrPath), "services", "slack");
return (response.readEntity(SlackService.class)); return (response.readEntity(SlackService.class));
} }
...@@ -289,15 +253,7 @@ public class ServicesApi extends AbstractApi { ...@@ -289,15 +253,7 @@ public class ServicesApi extends AbstractApi {
* @throws GitLabApiException if any exception occurs * @throws GitLabApiException if any exception occurs
*/ */
public JiraService updateJiraService(Object projectIdOrPath, JiraService jira) throws GitLabApiException { public JiraService updateJiraService(Object projectIdOrPath, JiraService jira) throws GitLabApiException {
GitLabApiForm formData = new GitLabApiForm() GitLabApiForm formData = jira.servicePropertiesForm();
.withParam("merge_requests_events", jira.getMergeRequestsEvents())
.withParam("commit_events", jira.getCommitEvents())
.withParam("url", jira.getUrl(), true)
.withParam("api_url", jira.getApiUrl())
.withParam("project_key", jira.getProjectKey())
.withParam("username", jira.getUsername(), true)
.withParam("password", jira.getPassword(), true)
.withParam("jira_issue_transition_id", jira.getJiraIssueTransitionId());
Response response = put(Response.Status.OK, formData.asMap(), "projects", getProjectIdOrPath(projectIdOrPath), "services", "jira"); Response response = put(Response.Status.OK, formData.asMap(), "projects", getProjectIdOrPath(projectIdOrPath), "services", "jira");
return (response.readEntity(JiraService.class)); return (response.readEntity(JiraService.class));
} }
...@@ -344,8 +300,7 @@ public class ServicesApi extends AbstractApi { ...@@ -344,8 +300,7 @@ public class ServicesApi extends AbstractApi {
* @throws GitLabApiException if any exception occurs * @throws GitLabApiException if any exception occurs
*/ */
public ExternalWikiService updateExternalWikiService(Object projectIdOrPath, ExternalWikiService externalWiki) throws GitLabApiException { public ExternalWikiService updateExternalWikiService(Object projectIdOrPath, ExternalWikiService externalWiki) throws GitLabApiException {
GitLabApiForm formData = new GitLabApiForm() GitLabApiForm formData = externalWiki.servicePropertiesForm();
.withParam("external_wiki_url", externalWiki.getExternalWikiUrl());
Response response = put(Response.Status.OK, formData.asMap(), "projects", getProjectIdOrPath(projectIdOrPath), "services", "external-wiki"); Response response = put(Response.Status.OK, formData.asMap(), "projects", getProjectIdOrPath(projectIdOrPath), "services", "external-wiki");
return (response.readEntity(ExternalWikiService.class)); return (response.readEntity(ExternalWikiService.class));
} }
...@@ -415,30 +370,7 @@ public class ServicesApi extends AbstractApi { ...@@ -415,30 +370,7 @@ public class ServicesApi extends AbstractApi {
* @throws GitLabApiException if any exception occurs * @throws GitLabApiException if any exception occurs
*/ */
public MattermostService updateMattermostService(Object projectIdOrPath, MattermostService mattermostNotifications) throws GitLabApiException { public MattermostService updateMattermostService(Object projectIdOrPath, MattermostService mattermostNotifications) throws GitLabApiException {
GitLabApiForm formData = new GitLabApiForm() GitLabApiForm formData = mattermostNotifications.servicePropertiesForm();
.withParam("webhook", mattermostNotifications.getWebhook(), true)
.withParam("username", mattermostNotifications.getUsername())
.withParam("channel", mattermostNotifications.getDefaultChannel())
.withParam("notify_only_broken_pipelines", mattermostNotifications.getNotifyOnlyBrokenPipelines())
.withParam("notify_only_default_branch", mattermostNotifications.getNotifyOnlyDefaultBranch())
.withParam("push_events", mattermostNotifications.getPushEvents())
.withParam("issues_events", mattermostNotifications.getIssuesEvents())
.withParam("confidential_issues_events", mattermostNotifications.getConfidentialIssuesEvents())
.withParam("merge_requests_events", mattermostNotifications.getMergeRequestsEvents())
.withParam("tag_push_events", mattermostNotifications.getTagPushEvents())
.withParam("note_events", mattermostNotifications.getNoteEvents())
.withParam("confidential_note_events", mattermostNotifications.getConfidentialNoteEvents())
.withParam("pipeline_events", mattermostNotifications.getPipelineEvents())
.withParam("wiki_page_events", mattermostNotifications.getWikiPageEvents())
.withParam("push_channel", mattermostNotifications.getPushChannel())
.withParam("issue_channel", mattermostNotifications.getIssueChannel())
.withParam("confidential_issue_channel", mattermostNotifications.getConfidentialIssueChannel())
.withParam("merge_request_channel", mattermostNotifications.getMergeRequestChannel())
.withParam("note_channel", mattermostNotifications.getNoteChannel())
.withParam("confidential_note_channel", mattermostNotifications.getConfidentialNoteChannel())
.withParam("tag_push_channel", mattermostNotifications.getTagPushChannel())
.withParam("pipeline_channel", mattermostNotifications.getPipelineChannel())
.withParam("wiki_page_channel", mattermostNotifications.getWikiPageChannel());
Response response = put(Response.Status.OK, formData.asMap(), "projects", getProjectIdOrPath(projectIdOrPath), "services", "mattermost"); Response response = put(Response.Status.OK, formData.asMap(), "projects", getProjectIdOrPath(projectIdOrPath), "services", "mattermost");
return (response.readEntity(MattermostService.class)); return (response.readEntity(MattermostService.class));
} }
...@@ -455,4 +387,110 @@ public class ServicesApi extends AbstractApi { ...@@ -455,4 +387,110 @@ public class ServicesApi extends AbstractApi {
Response.Status expectedStatus = (isApiVersion(ApiVersion.V3) ? Response.Status.OK : Response.Status.NO_CONTENT); Response.Status expectedStatus = (isApiVersion(ApiVersion.V3) ? Response.Status.OK : Response.Status.NO_CONTENT);
delete(expectedStatus, null, "projects", getProjectIdOrPath(projectIdOrPath), "services", "mattermost"); delete(expectedStatus, null, "projects", getProjectIdOrPath(projectIdOrPath), "services", "mattermost");
} }
/**
* Get the Bugzilla service settings for a project.
*
* <pre><code>GitLab Endpoint: GET /projects/:id/services/bugzilla</code></pre>
*
* @param projectIdOrPath id, path of the project, or a Project instance holding the project ID or path
* @return a BugzillaService instance holding the External Wiki service settings
* @throws GitLabApiException if any exception occurs
*/
public BugzillaService getBugzillaService(Object projectIdOrPath) throws GitLabApiException {
Response response = this.get(Response.Status.OK, null, "projects", getProjectIdOrPath(projectIdOrPath), "services", "bugzilla");
return (response.readEntity(BugzillaService.class));
}
/**
* Updates the Bugzilla service settings for a project.
*
* <pre><code>GitLab Endpoint: PUT /projects/:id/services/bugzilla</code></pre>
*
* The following properties on the BugzillaService instance are utilized in the update of the settings:
* <p>
* description (optional), description
* issuesUrl (required), issue url
* newIssueUrl (required), new Issue url
* projectUrl (required), project url
* pushEvents (optional) - Enable notifications for push events
* title (optional), the title for the custom issue tracker
* </p>
*
* @param projectIdOrPath id, path of the project, or a Project instance holding the project ID or path
* @param bugzillaService the BugzillaService instance holding the settings
* @return a BugzillaService instance holding the newly updated settings
* @throws GitLabApiException if any exception occurs
*/
public BugzillaService updateBugzillaService(Object projectIdOrPath, BugzillaService bugzillaService) throws GitLabApiException {
GitLabApiForm formData = bugzillaService.servicePropertiesForm();
Response response = put(Response.Status.OK, formData.asMap(), "projects", getProjectIdOrPath(projectIdOrPath), "services", "bugzilla");
return (response.readEntity(BugzillaService.class));
}
/**
* Deletes the Bugzilla service for a project.
*
* <pre><code>GitLab Endpoint: DELETE /projects/:id/services/bugzilla</code></pre>
*
* @param projectIdOrPath id, path of the project, or a Project instance holding the project ID or path
* @throws GitLabApiException if any exception occurs
*/
public void deleteBugzillaService(Object projectIdOrPath) throws GitLabApiException {
delete(Response.Status.OK, null, "projects", getProjectIdOrPath(projectIdOrPath), "services", "bugzilla");
}
/**
* Get the Custom Issue Tracker service settings for a project.
*
* <pre><code>GitLab Endpoint: GET /projects/:id/services/custom_issue_tracker</code></pre>
*
* @param projectIdOrPath id, path of the project, or a Project instance holding the project ID or path
* @return a ExternalWikiService instance holding the External Wiki service settings
* @throws GitLabApiException if any exception occurs
*/
public CustomIssueTrackerService getCustomIssueTrackerService(Object projectIdOrPath) throws GitLabApiException {
Response response = this.get(Response.Status.OK, null, "projects", getProjectIdOrPath(projectIdOrPath), "services", "custom-issue-tracker");
return (response.readEntity(CustomIssueTrackerService.class));
}
/**
* Updates the Custom Issue Tracker service settings for a project.
*
* <pre><code>GitLab Endpoint: PUT /projects/:id/services/custom_issue_tracker</code></pre>
*
* The following properties on the CustomIssueTrackerService instance are utilized in the update of the settings:
* <p>
* description (optional), description
* issuesUrl (required), issue url
* newIssueUrl (required), new Issue url
* projectUrl (required), project url
* pushEvents (optional) - Enable notifications for push events
* title (optional), the title for the custom issue tracker
* </p>
*
* @param projectIdOrPath id, path of the project, or a Project instance holding the project ID or path
* @param customIssueTracker the CustomIssueTrackerService instance holding the settings
* @return a CustomIssueTrackerService instance holding the newly updated settings
* @throws GitLabApiException if any exception occurs
*/
public CustomIssueTrackerService updateCustomIssueTrackerService(Object projectIdOrPath, CustomIssueTrackerService customIssueTracker) throws GitLabApiException {
GitLabApiForm formData = customIssueTracker.servicePropertiesForm();
Response response = put(Response.Status.OK, formData.asMap(), "projects", getProjectIdOrPath(projectIdOrPath), "services", "custom-issue-tracker");
return (response.readEntity(CustomIssueTrackerService.class));
}
/**
* Deletes the Custom Issue Tracker service for a project.
*
* <pre><code>GitLab Endpoint: DELETE /projects/:id/services/custom_issue_tracker</code></pre>
*
* @param projectIdOrPath id, path of the project, or a Project instance holding the project ID or path
* @throws GitLabApiException if any exception occurs
*/
public void deleteCustomIssueTrackerService(Object projectIdOrPath) throws GitLabApiException {
delete(Response.Status.OK, null, "projects", getProjectIdOrPath(projectIdOrPath), "services", "custom-issue-tracker");
}
} }
...@@ -7,6 +7,8 @@ import static org.junit.Assert.assertTrue; ...@@ -7,6 +7,8 @@ import static org.junit.Assert.assertTrue;
import static org.junit.Assume.assumeNotNull; import static org.junit.Assume.assumeNotNull;
import org.gitlab4j.api.models.Project; import org.gitlab4j.api.models.Project;
import org.gitlab4j.api.services.BugzillaService;
import org.gitlab4j.api.services.CustomIssueTrackerService;
import org.gitlab4j.api.services.ExternalWikiService; import org.gitlab4j.api.services.ExternalWikiService;
import org.gitlab4j.api.services.JiraService; import org.gitlab4j.api.services.JiraService;
import org.gitlab4j.api.services.MattermostService; import org.gitlab4j.api.services.MattermostService;
...@@ -32,6 +34,8 @@ import org.junit.runners.MethodSorters; ...@@ -32,6 +34,8 @@ import org.junit.runners.MethodSorters;
@FixMethodOrder(MethodSorters.NAME_ASCENDING) @FixMethodOrder(MethodSorters.NAME_ASCENDING)
public class TestServicesApi extends AbstractIntegrationTest { public class TestServicesApi extends AbstractIntegrationTest {
private static final String TEST_ENDPOINT = "https://foobar.com/gitlab_service/webhooks/";
private static GitLabApi gitLabApi; private static GitLabApi gitLabApi;
private static Project testProject; private static Project testProject;
...@@ -206,6 +210,7 @@ public class TestServicesApi extends AbstractIntegrationTest { ...@@ -206,6 +210,7 @@ public class TestServicesApi extends AbstractIntegrationTest {
.withUsername("GitLab4J"); .withUsername("GitLab4J");
MattermostService updatedService = gitLabApi.getServicesApi().updateMattermostService(testProject, service); MattermostService updatedService = gitLabApi.getServicesApi().updateMattermostService(testProject, service);
assertNotNull(updatedService); assertNotNull(updatedService);
assertEquals(service.getWebhook(), updatedService.getWebhook());
} finally { } finally {
try { gitLabApi.getServicesApi().deleteMattermostService(testProject); } catch (Exception ignore) {} try { gitLabApi.getServicesApi().deleteMattermostService(testProject); } catch (Exception ignore) {}
} }
...@@ -226,4 +231,90 @@ public class TestServicesApi extends AbstractIntegrationTest { ...@@ -226,4 +231,90 @@ public class TestServicesApi extends AbstractIntegrationTest {
assertNotNull(deleteMattermostService); assertNotNull(deleteMattermostService);
assertFalse(deleteMattermostService.getActive()); assertFalse(deleteMattermostService.getActive());
} }
@Test
public void testGetBugzillaService() throws GitLabApiException {
BugzillaService service = gitLabApi.getServicesApi().getBugzillaService(testProject);
assertNotNull(service);
}
@Test
public void testUpdateBugzillaService() throws GitLabApiException {
try {
BugzillaService service = new BugzillaService()
.withIssuesUrl(TEST_ENDPOINT + "issues")
.withNewIssueUrl(TEST_ENDPOINT + "new_issue")
.withProjectUrl(TEST_ENDPOINT + "project");
BugzillaService updatedService = gitLabApi.getServicesApi().updateBugzillaService(testProject, service);
assertNotNull(updatedService);
assertEquals(service.getIssuesUrl(), updatedService.getIssuesUrl());
assertEquals(service.getNewIssueUrl(), updatedService.getNewIssueUrl());
assertEquals(service.getProjectUrl(), updatedService.getProjectUrl());
} finally {
try { gitLabApi.getServicesApi().deleteBugzillaService(testProject); } catch (Exception ignore) {}
}
}
@Test
public void testDeleteBugzillaService() throws GitLabApiException {
BugzillaService service = new BugzillaService()
.withIssuesUrl(TEST_ENDPOINT + "issues")
.withNewIssueUrl(TEST_ENDPOINT + "new_issue")
.withProjectUrl(TEST_ENDPOINT + "project");
BugzillaService updatedService = gitLabApi.getServicesApi().updateBugzillaService(testProject, service);
assertNotNull(updatedService);
assertTrue(updatedService.getActive());
gitLabApi.getServicesApi().deleteBugzillaService(testProject);
BugzillaService deletedService = gitLabApi.getServicesApi().getBugzillaService(testProject);
assertNotNull(deletedService);
assertFalse(deletedService.getActive());
}
@Test
public void testGetCustomIssueTrackerService() throws GitLabApiException {
CustomIssueTrackerService service = gitLabApi.getServicesApi().getCustomIssueTrackerService(testProject);
assertNotNull(service);
}
@Test
public void testUpdateCustomIssueTrackerService() throws GitLabApiException {
try {
CustomIssueTrackerService service = new CustomIssueTrackerService()
.withIssuesUrl(TEST_ENDPOINT + "issues")
.withNewIssueUrl(TEST_ENDPOINT + "new_issue")
.withProjectUrl(TEST_ENDPOINT + "project");
CustomIssueTrackerService updatedService = gitLabApi.getServicesApi().updateCustomIssueTrackerService(testProject, service);
assertNotNull(updatedService);
assertEquals(service.getIssuesUrl(), updatedService.getIssuesUrl());
assertEquals(service.getNewIssueUrl(), updatedService.getNewIssueUrl());
assertEquals(service.getProjectUrl(), updatedService.getProjectUrl());
} finally {
try { gitLabApi.getServicesApi().deleteCustomIssueTrackerService(testProject); } catch (Exception ignore) {}
}
}
@Test
public void testDeleteCustomIssueTrackerService() throws GitLabApiException {
CustomIssueTrackerService service = new CustomIssueTrackerService()
.withIssuesUrl(TEST_ENDPOINT + "issues")
.withNewIssueUrl(TEST_ENDPOINT + "new_issue")
.withProjectUrl(TEST_ENDPOINT + "project");
CustomIssueTrackerService updatedService = gitLabApi.getServicesApi().updateCustomIssueTrackerService(testProject, service);
assertNotNull(updatedService);
assertTrue(updatedService.getActive());
gitLabApi.getServicesApi().deleteCustomIssueTrackerService(testProject);
CustomIssueTrackerService deletedService = gitLabApi.getServicesApi().getCustomIssueTrackerService(testProject);
assertNotNull(deletedService);
assertFalse(deletedService.getActive());
}
} }
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment