Skip to content

Commit 5a50fa5

Browse files
committed
Handle 422 response
Issue gh-32
1 parent b18ea1d commit 5a50fa5

File tree

4 files changed

+38
-2
lines changed

4 files changed

+38
-2
lines changed

api/github/src/main/java/com/github/api/GitHubApi.java

+15-1
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
import java.util.Arrays;
2626
import java.util.List;
2727
import java.util.Map;
28+
import java.util.logging.Logger;
2829

2930
import com.fasterxml.jackson.annotation.JsonInclude;
3031
import com.fasterxml.jackson.core.JsonProcessingException;
@@ -37,6 +38,8 @@
3738
*/
3839
public class GitHubApi {
3940

41+
private static final Logger LOGGER = Logger.getLogger(GitHubApi.class.getName());
42+
4043
private final HttpClient httpClient;
4144

4245
private final ObjectMapper objectMapper;
@@ -110,7 +113,18 @@ public void createMilestone(Repository repository, Milestone milestone) {
110113
.POST(bodyValue(milestone))
111114
.build();
112115
// @formatter:on
113-
performRequest(httpRequest, Void.class);
116+
try {
117+
performRequest(httpRequest, Void.class);
118+
}
119+
catch (HttpClientException ex) {
120+
if (ex.getStatusCode() == 422) {
121+
LOGGER.warning("Unable to create milestone %s: response=%s".formatted(milestone.title(),
122+
ex.getResponseBody()));
123+
}
124+
else {
125+
throw ex;
126+
}
127+
}
114128
}
115129

116130
/**

api/github/src/test/java/com/github/api/GitHubApiTests.java

+20
Original file line numberDiff line numberDiff line change
@@ -132,6 +132,26 @@ public void createMilestoneWhenValidParametersThenSuccess() throws Exception {
132132
json.assertThat("$.due_on", is("2022-05-04T12:00:00Z"));
133133
}
134134

135+
@Test
136+
public void createMilestoneWhenAlreadyExistsThenSuccessWithWarning() throws Exception {
137+
this.server.enqueue(json("CreateMilestoneErrorResponse.json").setResponseCode(422));
138+
139+
var dueOn = Instant.parse("2022-05-04T12:00:00Z");
140+
var milestone = new Milestone("1.0.0", null, dueOn);
141+
this.githubApi.createMilestone(this.repository, milestone);
142+
143+
var recordedRequest = this.server.takeRequest();
144+
assertThat(recordedRequest.getMethod()).isEqualTo("POST");
145+
assertThat(recordedRequest.getPath()).isEqualTo("/repos/spring-projects/spring-security/milestones");
146+
assertThat(recordedRequest.getHeader("Accept")).isEqualTo("application/json");
147+
assertThat(recordedRequest.getHeader("Content-Type")).isEqualTo("application/json");
148+
assertThat(recordedRequest.getHeader("Authorization")).isEqualTo("Bearer %s".formatted(AUTH_TOKEN));
149+
150+
var json = JsonAssert.with(recordedRequest.getBody().readString(Charset.defaultCharset()));
151+
json.assertThat("$.title", is("1.0.0"));
152+
json.assertThat("$.due_on", is("2022-05-04T12:00:00Z"));
153+
}
154+
135155
@Test
136156
public void getMilestonesWhenExistsThenSuccess() throws Exception {
137157
this.server.enqueue(json("MilestonesResponse.json"));
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
{"message":"Validation Failed","errors":[{"resource":"Milestone","code":"already_exists","field":"title"}],"documentation_url":"https://docs.github.com/rest/issues/milestones#create-a-milestone"}

api/sagan/src/test/java/io/spring/api/SaganApiTests.java

+2-1
Original file line numberDiff line numberDiff line change
@@ -159,7 +159,8 @@ public void createReleaseWhenValidParametersThenSuccess() throws Exception {
159159

160160
var json = JsonAssert.with(recordedRequest.getBody().readString(Charset.defaultCharset()));
161161
json.assertThat("$.version", is("6.1.0"));
162-
json.assertThat("$.referenceDocUrl", is("https://docs.spring.io/spring-security/reference/{version}/index.html"));
162+
json.assertThat("$.referenceDocUrl",
163+
is("https://docs.spring.io/spring-security/reference/{version}/index.html"));
163164
json.assertThat("$.apiDocUrl", is("https://docs.spring.io/spring-security/site/docs/{version}/api/"));
164165
json.assertThat("$.status", is("GENERAL_AVAILABILITY"));
165166
json.assertThat("$.current", is(true));

0 commit comments

Comments
 (0)