diff --git a/src/main/java/com/spotify/github/v3/checks/CheckRunOutput.java b/src/main/java/com/spotify/github/v3/checks/CheckRunOutput.java index 95a644b4..76014b40 100644 --- a/src/main/java/com/spotify/github/v3/checks/CheckRunOutput.java +++ b/src/main/java/com/spotify/github/v3/checks/CheckRunOutput.java @@ -7,9 +7,9 @@ * Licensed 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. @@ -22,6 +22,7 @@ import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.google.common.base.Preconditions; import com.spotify.github.GithubStyle; import java.util.List; import java.util.Optional; @@ -87,4 +88,20 @@ public interface CheckRunOutput { * @return the optional */ Optional annotationsUrl(); + + /** + * Automatically validates the maximum length of properties. + *

+ * GitHub does not validate these properly on their side (at least in GHE 3.2) and returns 422 + * HTTP responses instead. To avoid that, let's validate the data in this client library. + */ + @Value.Check + @SuppressWarnings("checkstyle:magicnumber") + default void check() { + // max values from https://docs.github.com/en/enterprise-server@3.5/rest/checks/runs#create-a-check-run + Preconditions.checkState(summary().map(String::length).orElse(0) <= 65535, + "'summary' exceeded max length of 65535 characters"); + Preconditions.checkState(text().map(String::length).orElse(0) <= 65535, + "'text' exceeded max length of 65535 characters"); + } } diff --git a/src/test/java/com/spotify/github/v3/checks/CheckRunActionTest.java b/src/test/java/com/spotify/github/v3/checks/CheckRunActionTest.java index 0646fb7c..2e7bbe0d 100644 --- a/src/test/java/com/spotify/github/v3/checks/CheckRunActionTest.java +++ b/src/test/java/com/spotify/github/v3/checks/CheckRunActionTest.java @@ -20,15 +20,9 @@ package com.spotify.github.v3.checks; -import static org.hamcrest.CoreMatchers.is; -import static org.hamcrest.MatcherAssert.assertThat; import static org.junit.jupiter.api.Assertions.assertThrows; -import com.spotify.github.FixtureHelper; -import com.spotify.github.jackson.Json; import com.spotify.github.v3.checks.ImmutableCheckRunAction.Builder; -import java.io.IOException; -import java.time.ZonedDateTime; import org.junit.Test; public class CheckRunActionTest { diff --git a/src/test/java/com/spotify/github/v3/checks/CheckRunOutputTest.java b/src/test/java/com/spotify/github/v3/checks/CheckRunOutputTest.java new file mode 100644 index 00000000..e8658c90 --- /dev/null +++ b/src/test/java/com/spotify/github/v3/checks/CheckRunOutputTest.java @@ -0,0 +1,49 @@ +/*- + * -\-\- + * github-client + * -- + * Copyright (C) 2016 - 2022 Spotify AB + * -- + * Licensed 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.spotify.github.v3.checks; + +import static org.junit.jupiter.api.Assertions.assertThrows; + +import com.spotify.github.v3.checks.ImmutableCheckRunOutput.Builder; +import org.junit.Test; + +public class CheckRunOutputTest { + + private Builder builder() { + return ImmutableCheckRunOutput.builder(); + } + + @Test + public void allowsCreationWithinLimits() { + builder().build(); + builder() + .text("t".repeat(65535)).summary("s".repeat(65535)).build(); + } + + @Test + public void failsCreationWhenMaxLengthExceeded() { + assertThrows(IllegalStateException.class, + () -> builder().text("t".repeat(65536)).build()); + assertThrows(IllegalStateException.class, + () -> builder().summary("s".repeat(65536)).build()); + } +} +