From 7dc347429b06fb4ea36d8ec79cbeceebeb7c0604 Mon Sep 17 00:00:00 2001 From: j0nathan33 Date: Tue, 18 Apr 2017 14:08:09 -0400 Subject: [PATCH 1/8] Add new api call for get information from bamboo --- .../cdancy/bitbucket/rest/BitbucketApi.java | 13 +-- .../rest/fallbacks/BitbucketFallbacks.java | 14 +++ .../bitbucket/rest/features/BuildApi.java | 54 +++++++++ .../rest/features/BuildApiMockTest.java | 106 ++++++++++++++++++ src/test/resources/build-status-error.json | 9 ++ src/test/resources/build-status.json | 24 ++++ src/test/resources/build-summary.json | 5 + 7 files changed, 216 insertions(+), 9 deletions(-) create mode 100644 src/main/java/com/cdancy/bitbucket/rest/features/BuildApi.java create mode 100644 src/test/java/com/cdancy/bitbucket/rest/features/BuildApiMockTest.java create mode 100644 src/test/resources/build-status-error.json create mode 100644 src/test/resources/build-status.json create mode 100644 src/test/resources/build-summary.json diff --git a/src/main/java/com/cdancy/bitbucket/rest/BitbucketApi.java b/src/main/java/com/cdancy/bitbucket/rest/BitbucketApi.java index cf3c4582..b78c1792 100644 --- a/src/main/java/com/cdancy/bitbucket/rest/BitbucketApi.java +++ b/src/main/java/com/cdancy/bitbucket/rest/BitbucketApi.java @@ -19,15 +19,7 @@ import java.io.Closeable; -import com.cdancy.bitbucket.rest.features.AdminApi; -import com.cdancy.bitbucket.rest.features.BranchApi; -import com.cdancy.bitbucket.rest.features.CommentsApi; -import com.cdancy.bitbucket.rest.features.CommitsApi; -import com.cdancy.bitbucket.rest.features.ProjectApi; -import com.cdancy.bitbucket.rest.features.PullRequestApi; -import com.cdancy.bitbucket.rest.features.RepositoryApi; -import com.cdancy.bitbucket.rest.features.SystemApi; -import com.cdancy.bitbucket.rest.features.TagApi; +import com.cdancy.bitbucket.rest.features.*; import org.jclouds.rest.annotations.Delegate; @@ -59,4 +51,7 @@ public interface BitbucketApi extends Closeable { @Delegate AdminApi adminApi(); + + @Delegate + BuildApi buildApi(); } diff --git a/src/main/java/com/cdancy/bitbucket/rest/fallbacks/BitbucketFallbacks.java b/src/main/java/com/cdancy/bitbucket/rest/fallbacks/BitbucketFallbacks.java index 18b07866..beb6a077 100644 --- a/src/main/java/com/cdancy/bitbucket/rest/fallbacks/BitbucketFallbacks.java +++ b/src/main/java/com/cdancy/bitbucket/rest/fallbacks/BitbucketFallbacks.java @@ -29,6 +29,7 @@ import com.cdancy.bitbucket.rest.domain.branch.BranchModel; import com.cdancy.bitbucket.rest.domain.branch.BranchPage; import com.cdancy.bitbucket.rest.domain.branch.BranchPermissionPage; +import com.cdancy.bitbucket.rest.domain.build.StatusPage; import com.cdancy.bitbucket.rest.domain.comment.Comments; import com.cdancy.bitbucket.rest.domain.common.Error; import com.cdancy.bitbucket.rest.domain.participants.Participants; @@ -104,6 +105,15 @@ public Object createOrPropagate(Throwable throwable) throws Exception { } } + public static final class StatusPageOnError implements Fallback { + public Object createOrPropagate(Throwable throwable) throws Exception { + if (checkNotNull(throwable, "throwable") != null) { + return createStatusPageFromErrors(getErrors(throwable.getMessage())); + } + throw propagate(throwable); + } + } + public static final class BranchPermissionPageOnError implements Fallback { public Object createOrPropagate(Throwable throwable) throws Exception { if (checkNotNull(throwable, "throwable") != null) { @@ -273,6 +283,10 @@ public static UserPage createUserPageFromErrors(List errors) { return UserPage.create(-1, -1, -1, -1, true, null, errors); } + public static StatusPage createStatusPageFromErrors(List errors) { + return StatusPage.create(-1, -1, -1, -1, true, null, errors); + } + public static BranchPermissionPage createBranchPermissionPageFromErrors(List errors) { return BranchPermissionPage.create(-1, -1, -1, -1, true, null, errors); } diff --git a/src/main/java/com/cdancy/bitbucket/rest/features/BuildApi.java b/src/main/java/com/cdancy/bitbucket/rest/features/BuildApi.java new file mode 100644 index 00000000..ad808e81 --- /dev/null +++ b/src/main/java/com/cdancy/bitbucket/rest/features/BuildApi.java @@ -0,0 +1,54 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.cdancy.bitbucket.rest.features; + +import com.cdancy.bitbucket.rest.annotations.Documentation; +import com.cdancy.bitbucket.rest.domain.build.StatusPage; +import com.cdancy.bitbucket.rest.domain.build.Summary; +import com.cdancy.bitbucket.rest.fallbacks.BitbucketFallbacks; +import com.cdancy.bitbucket.rest.filters.BitbucketAuthentication; +import org.jclouds.javax.annotation.Nullable; +import org.jclouds.rest.annotations.Fallback; +import org.jclouds.rest.annotations.RequestFilters; + +import javax.inject.Named; +import javax.ws.rs.*; +import javax.ws.rs.core.MediaType; + +@Produces(MediaType.APPLICATION_JSON) +@RequestFilters(BitbucketAuthentication.class) +@Path("/rest/build-status/{jclouds.api-version}") +public interface BuildApi { + + @Named("build:status") + @Documentation({"https://developer.atlassian.com/static/rest/bitbucket-server/4.14.4/bitbucket-build-rest.html#idm44911111531152"}) + @Consumes(MediaType.APPLICATION_JSON) + @Path("/commits/{commitId}") + @Fallback(BitbucketFallbacks.StatusPageOnError.class) + @GET + StatusPage status(@PathParam("commitId") String commitId, + @Nullable @QueryParam("start") Integer start, + @Nullable @QueryParam("limit") Integer limit); + + @Named("build:status-summary") + @Documentation({"https://developer.atlassian.com/static/rest/bitbucket-server/4.14.4/bitbucket-build-rest.html#idm44911111484336"}) + @Consumes(MediaType.APPLICATION_JSON) + @Path("/commits/stats/{commitId}") + @GET + Summary summary(@PathParam("commitId") String commitId); +} diff --git a/src/test/java/com/cdancy/bitbucket/rest/features/BuildApiMockTest.java b/src/test/java/com/cdancy/bitbucket/rest/features/BuildApiMockTest.java new file mode 100644 index 00000000..adb672fb --- /dev/null +++ b/src/test/java/com/cdancy/bitbucket/rest/features/BuildApiMockTest.java @@ -0,0 +1,106 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.cdancy.bitbucket.rest.features; + +import com.cdancy.bitbucket.rest.BitbucketApi; +import com.cdancy.bitbucket.rest.BitbucketApiMetadata; +import com.cdancy.bitbucket.rest.domain.admin.UserPage; +import com.cdancy.bitbucket.rest.domain.build.Status; +import com.cdancy.bitbucket.rest.domain.build.StatusPage; +import com.cdancy.bitbucket.rest.domain.build.Summary; +import com.cdancy.bitbucket.rest.internal.BaseBitbucketMockTest; +import com.google.common.collect.ImmutableMap; +import com.squareup.okhttp.mockwebserver.MockResponse; +import com.squareup.okhttp.mockwebserver.MockWebServer; +import org.testng.annotations.Test; + +import java.io.IOException; +import java.util.Map; + +import static org.assertj.core.api.Assertions.assertThat; + +/** + * Mock tests for the {@link BuildApi} class. + */ +@Test(groups = "unit", testName = "BranchApiMockTest") +public class BuildApiMockTest extends BaseBitbucketMockTest { + + public void testGetStatus() throws Exception { + MockWebServer server = mockEtcdJavaWebServer(); + + server.enqueue(new MockResponse().setBody(payloadFromResource("/build-status.json")).setResponseCode(200)); + BitbucketApi baseApi = api(server.getUrl("/")); + BuildApi api = baseApi.buildApi(); + try { + StatusPage statusPage = api.status("306bcf274566f2e89f75ae6f7faf10beff38382012", 0, 100); + assertThat(statusPage).isNotNull(); + assertThat(statusPage.errors()).isEmpty(); + assertThat(statusPage.size() == 2).isTrue(); + assertThat(statusPage.values().get(0).state().equals(Status.StatusState.FAILED)).isTrue(); + + Map queryParams = ImmutableMap.of("limit", 100, "start", 0); + assertSent(server, "GET", "/rest/build-status/" + BitbucketApiMetadata.API_VERSION + + "/commits/306bcf274566f2e89f75ae6f7faf10beff38382012", queryParams); + } finally { + baseApi.close(); + server.shutdown(); + } + } + + public void testGetStatusOnError() throws Exception { + MockWebServer server = mockEtcdJavaWebServer(); + + server.enqueue(new MockResponse().setBody(payloadFromResource("/build-status-error.json")).setResponseCode(200)); + BitbucketApi baseApi = api(server.getUrl("/")); + BuildApi api = baseApi.buildApi(); + try { + StatusPage statusPage = api.status("306bcf274566f2e89f75ae6f7faf10beff38382012", 0, 100); + assertThat(statusPage).isNotNull(); + assertThat(statusPage.values()).isEmpty(); + assertThat(statusPage.errors().size() == 1).isTrue(); + + Map queryParams = ImmutableMap.of("limit", 100, "start", 0); + assertSent(server, "GET", "/rest/build-status/" + BitbucketApiMetadata.API_VERSION + + "/commits/306bcf274566f2e89f75ae6f7faf10beff38382012", queryParams); + } finally { + baseApi.close(); + server.shutdown(); + } + } + + public void testGetSummary() throws Exception { + MockWebServer server = mockEtcdJavaWebServer(); + + server.enqueue(new MockResponse().setBody(payloadFromResource("/build-summary.json")).setResponseCode(200)); + BitbucketApi baseApi = api(server.getUrl("/")); + BuildApi api = baseApi.buildApi(); + try { + Summary statusPage = api.summary("306bcf274566f2e89f75ae6f7faf10beff38382012"); + assertThat(statusPage).isNotNull(); + assertThat(statusPage.failed() == 1); + assertThat(statusPage.inProgress() == 2); + assertThat(statusPage.successful() == 3); + + assertSent(server, "GET", "/rest/build-status/" + BitbucketApiMetadata.API_VERSION + + "/commits/stats/306bcf274566f2e89f75ae6f7faf10beff38382012"); + } finally { + baseApi.close(); + server.shutdown(); + } + } +} diff --git a/src/test/resources/build-status-error.json b/src/test/resources/build-status-error.json new file mode 100644 index 00000000..69d6cfea --- /dev/null +++ b/src/test/resources/build-status-error.json @@ -0,0 +1,9 @@ +{ + "errors": [ + { + "context": null, + "message": "You are not permitted to access this resource", + "exceptionName": null + } + ] +} \ No newline at end of file diff --git a/src/test/resources/build-status.json b/src/test/resources/build-status.json new file mode 100644 index 00000000..1433de93 --- /dev/null +++ b/src/test/resources/build-status.json @@ -0,0 +1,24 @@ +{ + "isLastPage": true, + "limit": 100, + "size": 2, + "start": 0, + "values": [ + { + "dateAdded": 1492526977926, + "description": "#120 failed\n(1 test failed)\nin 45 minutes", + "key": "AC-TEST", + "name": "develop", + "state": "FAILED", + "url": "https://bamboo.acme.com/browse/AC-TEST-120" + }, + { + "dateAdded": 1492525545176, + "description": "#110 successful\n(with 1288 tests)\nin 6 minutes", + "key": "AC-TEST2", + "name": "develop", + "state": "SUCCESSFUL", + "url": "https://bamboo.acme.com/browse/AC-TEST2-110" + } + ] +} \ No newline at end of file diff --git a/src/test/resources/build-summary.json b/src/test/resources/build-summary.json new file mode 100644 index 00000000..1a62587f --- /dev/null +++ b/src/test/resources/build-summary.json @@ -0,0 +1,5 @@ +{ + "failed": 1, + "inProgress": 2, + "successful": 3 +} \ No newline at end of file From 6c07463b6aa8fd728985127a150c8da4456a3591 Mon Sep 17 00:00:00 2001 From: j0nathan33 Date: Thu, 20 Apr 2017 14:22:02 -0400 Subject: [PATCH 2/8] Fix test and Add new LiveTest --- .../rest/features/BuildApiLiveTest.java | 33 +++++++++++++++++++ .../rest/features/BuildApiMockTest.java | 10 +++--- 2 files changed, 38 insertions(+), 5 deletions(-) create mode 100644 src/test/java/com/cdancy/bitbucket/rest/features/BuildApiLiveTest.java diff --git a/src/test/java/com/cdancy/bitbucket/rest/features/BuildApiLiveTest.java b/src/test/java/com/cdancy/bitbucket/rest/features/BuildApiLiveTest.java new file mode 100644 index 00000000..9529ac9f --- /dev/null +++ b/src/test/java/com/cdancy/bitbucket/rest/features/BuildApiLiveTest.java @@ -0,0 +1,33 @@ +package com.cdancy.bitbucket.rest.features; + +import com.cdancy.bitbucket.rest.BaseBitbucketApiLiveTest; +import com.cdancy.bitbucket.rest.domain.admin.UserPage; +import com.cdancy.bitbucket.rest.domain.build.StatusPage; +import com.cdancy.bitbucket.rest.domain.build.Summary; +import org.testng.annotations.Test; + +import static org.assertj.core.api.Assertions.assertThat; + +@Test(groups = "live", testName = "BuildApiLiveTest") +public class BuildApiLiveTest extends BaseBitbucketApiLiveTest { + + @Test + public void testGetStatusByNonExistentCommit() { + StatusPage statusPage = api().status(randomString(),0,100); + assertThat(statusPage).isNotNull(); + assertThat(statusPage.size() == 0).isTrue(); + } + + @Test + public void testGetSummaryByNonExistentCommit() { + Summary statusPage = api().summary(randomString()); + assertThat(statusPage).isNotNull(); + assertThat(statusPage.successful() == 0).isTrue(); + assertThat(statusPage.inProgress() == 0).isTrue(); + assertThat(statusPage.failed() == 0).isTrue(); + } + + private BuildApi api() { + return api.buildApi(); + } +} diff --git a/src/test/java/com/cdancy/bitbucket/rest/features/BuildApiMockTest.java b/src/test/java/com/cdancy/bitbucket/rest/features/BuildApiMockTest.java index adb672fb..b0fb915e 100644 --- a/src/test/java/com/cdancy/bitbucket/rest/features/BuildApiMockTest.java +++ b/src/test/java/com/cdancy/bitbucket/rest/features/BuildApiMockTest.java @@ -90,11 +90,11 @@ public void testGetSummary() throws Exception { BitbucketApi baseApi = api(server.getUrl("/")); BuildApi api = baseApi.buildApi(); try { - Summary statusPage = api.summary("306bcf274566f2e89f75ae6f7faf10beff38382012"); - assertThat(statusPage).isNotNull(); - assertThat(statusPage.failed() == 1); - assertThat(statusPage.inProgress() == 2); - assertThat(statusPage.successful() == 3); + Summary summary = api.summary("306bcf274566f2e89f75ae6f7faf10beff38382012"); + assertThat(summary).isNotNull(); + assertThat(summary.failed() == 1).isTrue(); + assertThat(summary.inProgress() == 2).isTrue(); + assertThat(summary.successful() == 3).isTrue(); assertSent(server, "GET", "/rest/build-status/" + BitbucketApiMetadata.API_VERSION + "/commits/stats/306bcf274566f2e89f75ae6f7faf10beff38382012"); From 6c22c2a84b1a54c9b2d71c788e890f76e00a3f53 Mon Sep 17 00:00:00 2001 From: j0nathan33 Date: Thu, 20 Apr 2017 14:27:36 -0400 Subject: [PATCH 3/8] Add missing latestCommit in object Reference --- .../bitbucket/rest/domain/pullrequest/Reference.java | 12 ++++++++++-- .../rest/features/PullRequestApiMockTest.java | 4 +++- src/test/resources/pull-request.json | 3 ++- 3 files changed, 15 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/cdancy/bitbucket/rest/domain/pullrequest/Reference.java b/src/main/java/com/cdancy/bitbucket/rest/domain/pullrequest/Reference.java index a7514b83..d4c0ac5c 100644 --- a/src/main/java/com/cdancy/bitbucket/rest/domain/pullrequest/Reference.java +++ b/src/main/java/com/cdancy/bitbucket/rest/domain/pullrequest/Reference.java @@ -34,6 +34,9 @@ public abstract class Reference { @Nullable public abstract String displayId(); + @Nullable + public abstract String latestCommit(); + Reference() { } @@ -47,8 +50,13 @@ public static Reference create(String id, MinimalRepository repository) { return create(id, repository, displayId); } - @SerializedNames({"id", "repository", "displayId"}) + @Deprecated public static Reference create(String id, MinimalRepository repository, String displayId) { - return new AutoValue_Reference(id != null ? id : "refs/heads/master", repository, displayId); + return create(id, repository, displayId, null); + } + + @SerializedNames({"id", "repository", "displayId", "latestCommit"}) + public static Reference create(String id, MinimalRepository repository, String displayId, String latestCommit) { + return new AutoValue_Reference(id != null ? id : "refs/heads/master", repository, displayId, latestCommit); } } diff --git a/src/test/java/com/cdancy/bitbucket/rest/features/PullRequestApiMockTest.java b/src/test/java/com/cdancy/bitbucket/rest/features/PullRequestApiMockTest.java index 31929dff..9fc4ed43 100644 --- a/src/test/java/com/cdancy/bitbucket/rest/features/PullRequestApiMockTest.java +++ b/src/test/java/com/cdancy/bitbucket/rest/features/PullRequestApiMockTest.java @@ -67,7 +67,8 @@ public void testCreatePullRequest() throws Exception { MinimalRepository repository1 = MinimalRepository.create("my-repo", null, proj1); MinimalRepository repository2 = MinimalRepository.create("my-repo", null, proj2); - Reference fromRef = Reference.create("refs/heads/feature-ABC-123", repository1, "feature-ABC-123"); + String commitId = "930228bb501e07c2653771858320873d94518e33"; + Reference fromRef = Reference.create("refs/heads/feature-ABC-123", repository1, "feature-ABC-123", commitId); Reference toRef = Reference.create("refs/heads/master", repository2); CreatePullRequest cpr = CreatePullRequest.create("Talking Nerdy", "Some description", fromRef, toRef, null, null); PullRequest pr = api.create(repository2.project().key(), repository2.slug(), cpr); @@ -78,6 +79,7 @@ public void testCreatePullRequest() throws Exception { assertThat(pr.fromRef().repository().slug()).isEqualToIgnoringCase("my-repo"); assertThat(pr.id()).isEqualTo(101); assertThat(pr.links()).isNotNull(); + assertThat(pr.fromRef().latestCommit().equals(commitId)); assertSent(server, "POST", "/rest/api/" + BitbucketApiMetadata.API_VERSION + "/projects/PRJ/repos/my-repo/pull-requests"); } finally { diff --git a/src/test/resources/pull-request.json b/src/test/resources/pull-request.json index ddaba1dc..66d6236f 100644 --- a/src/test/resources/pull-request.json +++ b/src/test/resources/pull-request.json @@ -16,7 +16,8 @@ "project": { "key": "PRJ" } - } + }, + "latestCommit": "930228bb501e07c2653771858320873d94518e33" }, "toRef": { "id": "refs/heads/master", From fc6ca6a2d4a23906143e718a9089307922841b52 Mon Sep 17 00:00:00 2001 From: j0nathan33 Date: Thu, 20 Apr 2017 14:34:51 -0400 Subject: [PATCH 4/8] Fix build --- .../cdancy/bitbucket/rest/BitbucketApi.java | 11 ++++++++++- .../bitbucket/rest/features/BuildApi.java | 7 ++++++- .../rest/features/BuildApiLiveTest.java | 18 +++++++++++++++++- .../rest/features/BuildApiMockTest.java | 8 +++----- 4 files changed, 36 insertions(+), 8 deletions(-) diff --git a/src/main/java/com/cdancy/bitbucket/rest/BitbucketApi.java b/src/main/java/com/cdancy/bitbucket/rest/BitbucketApi.java index b78c1792..1185aea5 100644 --- a/src/main/java/com/cdancy/bitbucket/rest/BitbucketApi.java +++ b/src/main/java/com/cdancy/bitbucket/rest/BitbucketApi.java @@ -19,7 +19,16 @@ import java.io.Closeable; -import com.cdancy.bitbucket.rest.features.*; +import com.cdancy.bitbucket.rest.features.AdminApi; +import com.cdancy.bitbucket.rest.features.BuildApi; +import com.cdancy.bitbucket.rest.features.BranchApi; +import com.cdancy.bitbucket.rest.features.CommentsApi; +import com.cdancy.bitbucket.rest.features.CommitsApi; +import com.cdancy.bitbucket.rest.features.ProjectApi; +import com.cdancy.bitbucket.rest.features.PullRequestApi; +import com.cdancy.bitbucket.rest.features.RepositoryApi; +import com.cdancy.bitbucket.rest.features.SystemApi; +import com.cdancy.bitbucket.rest.features.TagApi; import org.jclouds.rest.annotations.Delegate; diff --git a/src/main/java/com/cdancy/bitbucket/rest/features/BuildApi.java b/src/main/java/com/cdancy/bitbucket/rest/features/BuildApi.java index ad808e81..e8161feb 100644 --- a/src/main/java/com/cdancy/bitbucket/rest/features/BuildApi.java +++ b/src/main/java/com/cdancy/bitbucket/rest/features/BuildApi.java @@ -27,7 +27,12 @@ import org.jclouds.rest.annotations.RequestFilters; import javax.inject.Named; -import javax.ws.rs.*; +import javax.ws.rs.Consumes; +import javax.ws.rs.GET; +import javax.ws.rs.Path; +import javax.ws.rs.PathParam; +import javax.ws.rs.Produces; +import javax.ws.rs.QueryParam; import javax.ws.rs.core.MediaType; @Produces(MediaType.APPLICATION_JSON) diff --git a/src/test/java/com/cdancy/bitbucket/rest/features/BuildApiLiveTest.java b/src/test/java/com/cdancy/bitbucket/rest/features/BuildApiLiveTest.java index 9529ac9f..62b92e12 100644 --- a/src/test/java/com/cdancy/bitbucket/rest/features/BuildApiLiveTest.java +++ b/src/test/java/com/cdancy/bitbucket/rest/features/BuildApiLiveTest.java @@ -1,7 +1,23 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + package com.cdancy.bitbucket.rest.features; import com.cdancy.bitbucket.rest.BaseBitbucketApiLiveTest; -import com.cdancy.bitbucket.rest.domain.admin.UserPage; import com.cdancy.bitbucket.rest.domain.build.StatusPage; import com.cdancy.bitbucket.rest.domain.build.Summary; import org.testng.annotations.Test; diff --git a/src/test/java/com/cdancy/bitbucket/rest/features/BuildApiMockTest.java b/src/test/java/com/cdancy/bitbucket/rest/features/BuildApiMockTest.java index b0fb915e..eeaf8125 100644 --- a/src/test/java/com/cdancy/bitbucket/rest/features/BuildApiMockTest.java +++ b/src/test/java/com/cdancy/bitbucket/rest/features/BuildApiMockTest.java @@ -19,7 +19,6 @@ import com.cdancy.bitbucket.rest.BitbucketApi; import com.cdancy.bitbucket.rest.BitbucketApiMetadata; -import com.cdancy.bitbucket.rest.domain.admin.UserPage; import com.cdancy.bitbucket.rest.domain.build.Status; import com.cdancy.bitbucket.rest.domain.build.StatusPage; import com.cdancy.bitbucket.rest.domain.build.Summary; @@ -29,7 +28,6 @@ import com.squareup.okhttp.mockwebserver.MockWebServer; import org.testng.annotations.Test; -import java.io.IOException; import java.util.Map; import static org.assertj.core.api.Assertions.assertThat; @@ -55,7 +53,7 @@ public void testGetStatus() throws Exception { Map queryParams = ImmutableMap.of("limit", 100, "start", 0); assertSent(server, "GET", "/rest/build-status/" + BitbucketApiMetadata.API_VERSION - + "/commits/306bcf274566f2e89f75ae6f7faf10beff38382012", queryParams); + + "/commits/306bcf274566f2e89f75ae6f7faf10beff38382012", queryParams); } finally { baseApi.close(); server.shutdown(); @@ -76,7 +74,7 @@ public void testGetStatusOnError() throws Exception { Map queryParams = ImmutableMap.of("limit", 100, "start", 0); assertSent(server, "GET", "/rest/build-status/" + BitbucketApiMetadata.API_VERSION - + "/commits/306bcf274566f2e89f75ae6f7faf10beff38382012", queryParams); + + "/commits/306bcf274566f2e89f75ae6f7faf10beff38382012", queryParams); } finally { baseApi.close(); server.shutdown(); @@ -97,7 +95,7 @@ public void testGetSummary() throws Exception { assertThat(summary.successful() == 3).isTrue(); assertSent(server, "GET", "/rest/build-status/" + BitbucketApiMetadata.API_VERSION - + "/commits/stats/306bcf274566f2e89f75ae6f7faf10beff38382012"); + + "/commits/stats/306bcf274566f2e89f75ae6f7faf10beff38382012"); } finally { baseApi.close(); server.shutdown(); From ffcc11a1017d2e09c66fea2e9f8ca9c9301347d1 Mon Sep 17 00:00:00 2001 From: j0nathan33 Date: Thu, 20 Apr 2017 14:39:50 -0400 Subject: [PATCH 5/8] Fix missing file --- .../bitbucket/rest/domain/build/Status.java | 48 +++++++++++++++++++ .../rest/domain/build/StatusPage.java | 39 +++++++++++++++ .../bitbucket/rest/domain/build/Summary.java | 36 ++++++++++++++ 3 files changed, 123 insertions(+) create mode 100644 src/main/java/com/cdancy/bitbucket/rest/domain/build/Status.java create mode 100644 src/main/java/com/cdancy/bitbucket/rest/domain/build/StatusPage.java create mode 100644 src/main/java/com/cdancy/bitbucket/rest/domain/build/Summary.java diff --git a/src/main/java/com/cdancy/bitbucket/rest/domain/build/Status.java b/src/main/java/com/cdancy/bitbucket/rest/domain/build/Status.java new file mode 100644 index 00000000..9b10782e --- /dev/null +++ b/src/main/java/com/cdancy/bitbucket/rest/domain/build/Status.java @@ -0,0 +1,48 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.cdancy.bitbucket.rest.domain.build; + +import com.google.auto.value.AutoValue; +import org.jclouds.json.SerializedNames; + +@AutoValue +public abstract class Status { + + public enum StatusState { + SUCCESSFUL, + FAILED + } + + public abstract long dateAdded(); + + public abstract String description(); + + public abstract String key(); + + public abstract String name(); + + public abstract StatusState state(); + + public abstract String url(); + + @SerializedNames({"dateAdded", "description", "key", "name", "state", "url"}) + public static Status create(long dateAdded, String description, String key, String name, StatusState state, + String url) { + return new AutoValue_Status(dateAdded, description, key, name, state, url); + } +} diff --git a/src/main/java/com/cdancy/bitbucket/rest/domain/build/StatusPage.java b/src/main/java/com/cdancy/bitbucket/rest/domain/build/StatusPage.java new file mode 100644 index 00000000..ea9d417d --- /dev/null +++ b/src/main/java/com/cdancy/bitbucket/rest/domain/build/StatusPage.java @@ -0,0 +1,39 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.cdancy.bitbucket.rest.domain.build; + +import com.cdancy.bitbucket.rest.domain.common.Error; +import com.cdancy.bitbucket.rest.domain.common.ErrorsHolder; +import com.cdancy.bitbucket.rest.domain.common.Page; +import com.cdancy.bitbucket.rest.utils.Utils; +import com.google.auto.value.AutoValue; +import org.jclouds.javax.annotation.Nullable; +import org.jclouds.json.SerializedNames; + +import java.util.List; + +@AutoValue +public abstract class StatusPage implements Page, ErrorsHolder { + + @SerializedNames({"start", "limit", "size", "nextPageStart", "isLastPage", "values", "errors"}) + public static StatusPage create(int start, int limit, int size, int nextPageStart, boolean isLastPage, + @Nullable List values, @Nullable List errors) { + return new AutoValue_StatusPage(start, limit, size, nextPageStart, isLastPage, + Utils.nullToEmpty(values), Utils.nullToEmpty(errors)); + } +} diff --git a/src/main/java/com/cdancy/bitbucket/rest/domain/build/Summary.java b/src/main/java/com/cdancy/bitbucket/rest/domain/build/Summary.java new file mode 100644 index 00000000..b1d92d4c --- /dev/null +++ b/src/main/java/com/cdancy/bitbucket/rest/domain/build/Summary.java @@ -0,0 +1,36 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.cdancy.bitbucket.rest.domain.build; + +import com.google.auto.value.AutoValue; +import org.jclouds.json.SerializedNames; + +@AutoValue +public abstract class Summary { + + public abstract long failed(); + + public abstract long inProgress(); + + public abstract long successful(); + + @SerializedNames({"failed", "inProgress", "successful"}) + public static Summary create(long failed, long inProgress, long successful) { + return new AutoValue_Summary(failed, inProgress, successful); + } +} From 8e214592414b9178a5f4c6c5d753fa45bb92e868 Mon Sep 17 00:00:00 2001 From: j0nathan33 Date: Thu, 20 Apr 2017 14:41:25 -0400 Subject: [PATCH 6/8] Edit test after codeReview --- .../com/cdancy/bitbucket/rest/features/BuildApiMockTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/java/com/cdancy/bitbucket/rest/features/BuildApiMockTest.java b/src/test/java/com/cdancy/bitbucket/rest/features/BuildApiMockTest.java index eeaf8125..f2cfdcf9 100644 --- a/src/test/java/com/cdancy/bitbucket/rest/features/BuildApiMockTest.java +++ b/src/test/java/com/cdancy/bitbucket/rest/features/BuildApiMockTest.java @@ -35,7 +35,7 @@ /** * Mock tests for the {@link BuildApi} class. */ -@Test(groups = "unit", testName = "BranchApiMockTest") +@Test(groups = "unit", testName = "BuildApiMockTest") public class BuildApiMockTest extends BaseBitbucketMockTest { public void testGetStatus() throws Exception { From 299c487c5a8c0077063737dd8efa9e7f9a46ac9f Mon Sep 17 00:00:00 2001 From: j0nathan33 Date: Fri, 21 Apr 2017 10:36:28 -0400 Subject: [PATCH 7/8] Rename BuildApi to BuildStatusApi after codeReview --- .../java/com/cdancy/bitbucket/rest/BitbucketApi.java | 4 ++-- .../features/{BuildApi.java => BuildStatusApi.java} | 2 +- ...dApiLiveTest.java => BuildStatusApiLiveTest.java} | 8 ++++---- ...dApiMockTest.java => BuildStatusApiMockTest.java} | 12 ++++++------ 4 files changed, 13 insertions(+), 13 deletions(-) rename src/main/java/com/cdancy/bitbucket/rest/features/{BuildApi.java => BuildStatusApi.java} (98%) rename src/test/java/com/cdancy/bitbucket/rest/features/{BuildApiLiveTest.java => BuildStatusApiLiveTest.java} (89%) rename src/test/java/com/cdancy/bitbucket/rest/features/{BuildApiMockTest.java => BuildStatusApiMockTest.java} (92%) diff --git a/src/main/java/com/cdancy/bitbucket/rest/BitbucketApi.java b/src/main/java/com/cdancy/bitbucket/rest/BitbucketApi.java index 1185aea5..c256869e 100644 --- a/src/main/java/com/cdancy/bitbucket/rest/BitbucketApi.java +++ b/src/main/java/com/cdancy/bitbucket/rest/BitbucketApi.java @@ -20,7 +20,7 @@ import java.io.Closeable; import com.cdancy.bitbucket.rest.features.AdminApi; -import com.cdancy.bitbucket.rest.features.BuildApi; +import com.cdancy.bitbucket.rest.features.BuildStatusApi; import com.cdancy.bitbucket.rest.features.BranchApi; import com.cdancy.bitbucket.rest.features.CommentsApi; import com.cdancy.bitbucket.rest.features.CommitsApi; @@ -62,5 +62,5 @@ public interface BitbucketApi extends Closeable { AdminApi adminApi(); @Delegate - BuildApi buildApi(); + BuildStatusApi buildStatusApiApi(); } diff --git a/src/main/java/com/cdancy/bitbucket/rest/features/BuildApi.java b/src/main/java/com/cdancy/bitbucket/rest/features/BuildStatusApi.java similarity index 98% rename from src/main/java/com/cdancy/bitbucket/rest/features/BuildApi.java rename to src/main/java/com/cdancy/bitbucket/rest/features/BuildStatusApi.java index e8161feb..01c609c3 100644 --- a/src/main/java/com/cdancy/bitbucket/rest/features/BuildApi.java +++ b/src/main/java/com/cdancy/bitbucket/rest/features/BuildStatusApi.java @@ -38,7 +38,7 @@ @Produces(MediaType.APPLICATION_JSON) @RequestFilters(BitbucketAuthentication.class) @Path("/rest/build-status/{jclouds.api-version}") -public interface BuildApi { +public interface BuildStatusApi { @Named("build:status") @Documentation({"https://developer.atlassian.com/static/rest/bitbucket-server/4.14.4/bitbucket-build-rest.html#idm44911111531152"}) diff --git a/src/test/java/com/cdancy/bitbucket/rest/features/BuildApiLiveTest.java b/src/test/java/com/cdancy/bitbucket/rest/features/BuildStatusApiLiveTest.java similarity index 89% rename from src/test/java/com/cdancy/bitbucket/rest/features/BuildApiLiveTest.java rename to src/test/java/com/cdancy/bitbucket/rest/features/BuildStatusApiLiveTest.java index 62b92e12..dd63d5a6 100644 --- a/src/test/java/com/cdancy/bitbucket/rest/features/BuildApiLiveTest.java +++ b/src/test/java/com/cdancy/bitbucket/rest/features/BuildStatusApiLiveTest.java @@ -24,8 +24,8 @@ import static org.assertj.core.api.Assertions.assertThat; -@Test(groups = "live", testName = "BuildApiLiveTest") -public class BuildApiLiveTest extends BaseBitbucketApiLiveTest { +@Test(groups = "live", testName = "BuildStatusApiLiveTest") +public class BuildStatusApiLiveTest extends BaseBitbucketApiLiveTest { @Test public void testGetStatusByNonExistentCommit() { @@ -43,7 +43,7 @@ public void testGetSummaryByNonExistentCommit() { assertThat(statusPage.failed() == 0).isTrue(); } - private BuildApi api() { - return api.buildApi(); + private BuildStatusApi api() { + return api.buildStatusApiApi(); } } diff --git a/src/test/java/com/cdancy/bitbucket/rest/features/BuildApiMockTest.java b/src/test/java/com/cdancy/bitbucket/rest/features/BuildStatusApiMockTest.java similarity index 92% rename from src/test/java/com/cdancy/bitbucket/rest/features/BuildApiMockTest.java rename to src/test/java/com/cdancy/bitbucket/rest/features/BuildStatusApiMockTest.java index f2cfdcf9..54fdc9c2 100644 --- a/src/test/java/com/cdancy/bitbucket/rest/features/BuildApiMockTest.java +++ b/src/test/java/com/cdancy/bitbucket/rest/features/BuildStatusApiMockTest.java @@ -33,17 +33,17 @@ import static org.assertj.core.api.Assertions.assertThat; /** - * Mock tests for the {@link BuildApi} class. + * Mock tests for the {@link BuildStatusApi} class. */ -@Test(groups = "unit", testName = "BuildApiMockTest") -public class BuildApiMockTest extends BaseBitbucketMockTest { +@Test(groups = "unit", testName = "BuildStatusApiMockTest") +public class BuildStatusApiMockTest extends BaseBitbucketMockTest { public void testGetStatus() throws Exception { MockWebServer server = mockEtcdJavaWebServer(); server.enqueue(new MockResponse().setBody(payloadFromResource("/build-status.json")).setResponseCode(200)); BitbucketApi baseApi = api(server.getUrl("/")); - BuildApi api = baseApi.buildApi(); + BuildStatusApi api = baseApi.buildStatusApiApi(); try { StatusPage statusPage = api.status("306bcf274566f2e89f75ae6f7faf10beff38382012", 0, 100); assertThat(statusPage).isNotNull(); @@ -65,7 +65,7 @@ public void testGetStatusOnError() throws Exception { server.enqueue(new MockResponse().setBody(payloadFromResource("/build-status-error.json")).setResponseCode(200)); BitbucketApi baseApi = api(server.getUrl("/")); - BuildApi api = baseApi.buildApi(); + BuildStatusApi api = baseApi.buildStatusApiApi(); try { StatusPage statusPage = api.status("306bcf274566f2e89f75ae6f7faf10beff38382012", 0, 100); assertThat(statusPage).isNotNull(); @@ -86,7 +86,7 @@ public void testGetSummary() throws Exception { server.enqueue(new MockResponse().setBody(payloadFromResource("/build-summary.json")).setResponseCode(200)); BitbucketApi baseApi = api(server.getUrl("/")); - BuildApi api = baseApi.buildApi(); + BuildStatusApi api = baseApi.buildStatusApiApi(); try { Summary summary = api.summary("306bcf274566f2e89f75ae6f7faf10beff38382012"); assertThat(summary).isNotNull(); From 7aeffab083d7ef204cc237e829a429ecd84b3b20 Mon Sep 17 00:00:00 2001 From: j0nathan33 Date: Fri, 21 Apr 2017 10:38:56 -0400 Subject: [PATCH 8/8] Fix typo --- src/main/java/com/cdancy/bitbucket/rest/BitbucketApi.java | 2 +- .../bitbucket/rest/features/BuildStatusApiLiveTest.java | 2 +- .../bitbucket/rest/features/BuildStatusApiMockTest.java | 6 +++--- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/main/java/com/cdancy/bitbucket/rest/BitbucketApi.java b/src/main/java/com/cdancy/bitbucket/rest/BitbucketApi.java index c256869e..7a709ff9 100644 --- a/src/main/java/com/cdancy/bitbucket/rest/BitbucketApi.java +++ b/src/main/java/com/cdancy/bitbucket/rest/BitbucketApi.java @@ -62,5 +62,5 @@ public interface BitbucketApi extends Closeable { AdminApi adminApi(); @Delegate - BuildStatusApi buildStatusApiApi(); + BuildStatusApi buildStatusApi(); } diff --git a/src/test/java/com/cdancy/bitbucket/rest/features/BuildStatusApiLiveTest.java b/src/test/java/com/cdancy/bitbucket/rest/features/BuildStatusApiLiveTest.java index dd63d5a6..799648a1 100644 --- a/src/test/java/com/cdancy/bitbucket/rest/features/BuildStatusApiLiveTest.java +++ b/src/test/java/com/cdancy/bitbucket/rest/features/BuildStatusApiLiveTest.java @@ -44,6 +44,6 @@ public void testGetSummaryByNonExistentCommit() { } private BuildStatusApi api() { - return api.buildStatusApiApi(); + return api.buildStatusApi(); } } diff --git a/src/test/java/com/cdancy/bitbucket/rest/features/BuildStatusApiMockTest.java b/src/test/java/com/cdancy/bitbucket/rest/features/BuildStatusApiMockTest.java index 54fdc9c2..cd262f02 100644 --- a/src/test/java/com/cdancy/bitbucket/rest/features/BuildStatusApiMockTest.java +++ b/src/test/java/com/cdancy/bitbucket/rest/features/BuildStatusApiMockTest.java @@ -43,7 +43,7 @@ public void testGetStatus() throws Exception { server.enqueue(new MockResponse().setBody(payloadFromResource("/build-status.json")).setResponseCode(200)); BitbucketApi baseApi = api(server.getUrl("/")); - BuildStatusApi api = baseApi.buildStatusApiApi(); + BuildStatusApi api = baseApi.buildStatusApi(); try { StatusPage statusPage = api.status("306bcf274566f2e89f75ae6f7faf10beff38382012", 0, 100); assertThat(statusPage).isNotNull(); @@ -65,7 +65,7 @@ public void testGetStatusOnError() throws Exception { server.enqueue(new MockResponse().setBody(payloadFromResource("/build-status-error.json")).setResponseCode(200)); BitbucketApi baseApi = api(server.getUrl("/")); - BuildStatusApi api = baseApi.buildStatusApiApi(); + BuildStatusApi api = baseApi.buildStatusApi(); try { StatusPage statusPage = api.status("306bcf274566f2e89f75ae6f7faf10beff38382012", 0, 100); assertThat(statusPage).isNotNull(); @@ -86,7 +86,7 @@ public void testGetSummary() throws Exception { server.enqueue(new MockResponse().setBody(payloadFromResource("/build-summary.json")).setResponseCode(200)); BitbucketApi baseApi = api(server.getUrl("/")); - BuildStatusApi api = baseApi.buildStatusApiApi(); + BuildStatusApi api = baseApi.buildStatusApi(); try { Summary summary = api.summary("306bcf274566f2e89f75ae6f7faf10beff38382012"); assertThat(summary).isNotNull();