From be0b926b6a5b3d7d63378c766e97f4f21a11e7de Mon Sep 17 00:00:00 2001 From: Steve Ayers Date: Tue, 13 May 2025 17:26:00 -0400 Subject: [PATCH 1/4] Fix negation operator in toString --- build.gradle.kts | 2 +- .../buf/protovalidate/ValidationResult.java | 24 ++-- .../protovalidate/ValidationResultTest.java | 121 ++++++++++++++++++ .../ValidatorCelExpressionTest.java | 1 + 4 files changed, 137 insertions(+), 11 deletions(-) create mode 100644 src/test/java/build/buf/protovalidate/ValidationResultTest.java diff --git a/build.gradle.kts b/build.gradle.kts index f865d311..8f17533e 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -219,7 +219,7 @@ allprojects { mavenPublishing { val isAutoReleased = project.hasProperty("signingInMemoryKey") - publishToMavenCentral(SonatypeHost.CENTRAL_PORTAL, automaticRelease = true) + publishToMavenCentral(SonatypeHost.S01) if (isAutoReleased) { signAllPublications() } diff --git a/src/main/java/build/buf/protovalidate/ValidationResult.java b/src/main/java/build/buf/protovalidate/ValidationResult.java index eb060f44..74ab67ec 100644 --- a/src/main/java/build/buf/protovalidate/ValidationResult.java +++ b/src/main/java/build/buf/protovalidate/ValidationResult.java @@ -68,18 +68,22 @@ public List getViolations() { @Override public String toString() { StringBuilder builder = new StringBuilder(); - builder.append("Validation error:"); - for (Violation violation : violations) { - builder.append("\n - "); - if (!violation.toProto().hasField()) { - builder.append(FieldPathUtils.fieldPathString(violation.toProto().getField())); - builder.append(": "); + if (isSuccess()) { + builder.append("Validation OK"); + } else { + builder.append("Validation error:"); + for (Violation violation : violations) { + builder.append("\n - "); + if (violation.toProto().hasField()) { + builder.append(FieldPathUtils.fieldPathString(violation.toProto().getField())); + builder.append(": "); + } + builder.append( + String.format( + "%s [%s]", violation.toProto().getMessage(), violation.toProto().getRuleId())); } - builder.append( - String.format( - "%s [%s]", violation.toProto().getMessage(), violation.toProto().getRuleId())); } - return builder.toString(); + return builder.toString(); } /** diff --git a/src/test/java/build/buf/protovalidate/ValidationResultTest.java b/src/test/java/build/buf/protovalidate/ValidationResultTest.java new file mode 100644 index 00000000..38d547a5 --- /dev/null +++ b/src/test/java/build/buf/protovalidate/ValidationResultTest.java @@ -0,0 +1,121 @@ +// Copyright 2023-2024 Buf Technologies, Inc. +// +// 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 build.buf.protovalidate; + +import static org.assertj.core.api.Assertions.assertThat; + +import build.buf.validate.FieldPathElement; +import java.util.ArrayList; +import java.util.List; +import org.junit.jupiter.api.Test; + +class ValidationResultTest { + @Test + void testToStringNoViolations() { + + List violations = new ArrayList(); + ValidationResult result = new ValidationResult(violations); + + assertThat(result.toString()).isEqualTo("Validation OK"); + assertThat(result.isSuccess()).isTrue(); + } + + @Test + void testToStringSingleViolation() { + FieldPathElement elem = + FieldPathElement.newBuilder().setFieldNumber(5).setFieldName("test_field_name").build(); + + RuleViolation violation = + RuleViolation.newBuilder() + .setRuleId("int32.const") + .setMessage("value must equal 42") + .addFirstFieldPathElement(elem) + .build(); + List violations = new ArrayList(); + violations.add(violation); + ValidationResult result = new ValidationResult(violations); + + assertThat(result.toString()) + .isEqualTo("Validation error:\n - test_field_name: value must equal 42 [int32.const]"); + } + + @Test + void testToStringMultipleViolations() { + FieldPathElement elem = + FieldPathElement.newBuilder().setFieldNumber(5).setFieldName("test_field_name").build(); + + RuleViolation violation1 = + RuleViolation.newBuilder() + .setRuleId("int32.const") + .setMessage("value must equal 42") + .addFirstFieldPathElement(elem) + .build(); + + RuleViolation violation2 = + RuleViolation.newBuilder() + .setRuleId("int32.required") + .setMessage("value is required") + .addFirstFieldPathElement(elem) + .build(); + List violations = new ArrayList(); + violations.add(violation1); + violations.add(violation2); + ValidationResult result = new ValidationResult(violations); + + assertThat(result.toString()) + .isEqualTo("Validation error:\n - test_field_name: value must equal 42 [int32.const]\n - test_field_name: value is required [int32.required]"); + } + + @Test + void testToStringSingleViolationMultipleFieldPathElements() { + FieldPathElement elem1 = + FieldPathElement.newBuilder().setFieldNumber(5).setFieldName("test_field_name").build(); + FieldPathElement elem2 = + FieldPathElement.newBuilder().setFieldNumber(5).setFieldName("nested_name").build(); + + List elems = new ArrayList(); + elems.add(elem1); + elems.add(elem2); + + RuleViolation violation1 = + RuleViolation.newBuilder() + .setRuleId("int32.const") + .setMessage("value must equal 42") + .addAllFieldPathElements(elems) + .build(); + + List violations = new ArrayList(); + violations.add(violation1); + ValidationResult result = new ValidationResult(violations); + + assertThat(result.toString()) + .isEqualTo("Validation error:\n - test_field_name.nested_name: value must equal 42 [int32.const]"); + } + + @Test + void testToStringSingleViolationNoFieldPathElements() { + RuleViolation violation = + RuleViolation.newBuilder() + .setRuleId("int32.const") + .setMessage("value must equal 42") + .build(); + List violations = new ArrayList(); + violations.add(violation); + ValidationResult result = new ValidationResult(violations); + + assertThat(result.toString()) + .isEqualTo("Validation error:\n - value must equal 42 [int32.const]"); + } +} diff --git a/src/test/java/build/buf/protovalidate/ValidatorCelExpressionTest.java b/src/test/java/build/buf/protovalidate/ValidatorCelExpressionTest.java index b709a680..5e01bc2a 100644 --- a/src/test/java/build/buf/protovalidate/ValidatorCelExpressionTest.java +++ b/src/test/java/build/buf/protovalidate/ValidatorCelExpressionTest.java @@ -84,6 +84,7 @@ public void testFieldExpressionRepeatedMessage() throws Exception { // Invalid message checks ValidationResult invalidResult = validator.validate(invalidMsg); assertThat(invalidResult.isSuccess()).isFalse(); + assertThat(invalidResult.toProto().getViolationsList()).containsExactly(expectedViolation); } From b6c2a8407617869996a01ea1ded972fcc7fb7858 Mon Sep 17 00:00:00 2001 From: Steve Ayers Date: Tue, 13 May 2025 17:26:11 -0400 Subject: [PATCH 2/4] Format --- src/main/java/build/buf/protovalidate/ValidationResult.java | 2 +- .../java/build/buf/protovalidate/ValidationResultTest.java | 6 ++++-- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/src/main/java/build/buf/protovalidate/ValidationResult.java b/src/main/java/build/buf/protovalidate/ValidationResult.java index 74ab67ec..90be5349 100644 --- a/src/main/java/build/buf/protovalidate/ValidationResult.java +++ b/src/main/java/build/buf/protovalidate/ValidationResult.java @@ -83,7 +83,7 @@ public String toString() { "%s [%s]", violation.toProto().getMessage(), violation.toProto().getRuleId())); } } - return builder.toString(); + return builder.toString(); } /** diff --git a/src/test/java/build/buf/protovalidate/ValidationResultTest.java b/src/test/java/build/buf/protovalidate/ValidationResultTest.java index 38d547a5..6cde132b 100644 --- a/src/test/java/build/buf/protovalidate/ValidationResultTest.java +++ b/src/test/java/build/buf/protovalidate/ValidationResultTest.java @@ -75,7 +75,8 @@ void testToStringMultipleViolations() { ValidationResult result = new ValidationResult(violations); assertThat(result.toString()) - .isEqualTo("Validation error:\n - test_field_name: value must equal 42 [int32.const]\n - test_field_name: value is required [int32.required]"); + .isEqualTo( + "Validation error:\n - test_field_name: value must equal 42 [int32.const]\n - test_field_name: value is required [int32.required]"); } @Test @@ -101,7 +102,8 @@ void testToStringSingleViolationMultipleFieldPathElements() { ValidationResult result = new ValidationResult(violations); assertThat(result.toString()) - .isEqualTo("Validation error:\n - test_field_name.nested_name: value must equal 42 [int32.const]"); + .isEqualTo( + "Validation error:\n - test_field_name.nested_name: value must equal 42 [int32.const]"); } @Test From 278e23c9f6b6198bc0b69f2f4ac9debba7832ad6 Mon Sep 17 00:00:00 2001 From: Steve Ayers Date: Tue, 13 May 2025 17:26:40 -0400 Subject: [PATCH 3/4] Revert --- build.gradle.kts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle.kts b/build.gradle.kts index 8f17533e..f865d311 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -219,7 +219,7 @@ allprojects { mavenPublishing { val isAutoReleased = project.hasProperty("signingInMemoryKey") - publishToMavenCentral(SonatypeHost.S01) + publishToMavenCentral(SonatypeHost.CENTRAL_PORTAL, automaticRelease = true) if (isAutoReleased) { signAllPublications() } From 47f87fe0042d3397720252864e81ab30308d03e0 Mon Sep 17 00:00:00 2001 From: Steve Ayers Date: Tue, 13 May 2025 17:28:25 -0400 Subject: [PATCH 4/4] Revert --- .../java/build/buf/protovalidate/ValidatorCelExpressionTest.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/test/java/build/buf/protovalidate/ValidatorCelExpressionTest.java b/src/test/java/build/buf/protovalidate/ValidatorCelExpressionTest.java index 5e01bc2a..b709a680 100644 --- a/src/test/java/build/buf/protovalidate/ValidatorCelExpressionTest.java +++ b/src/test/java/build/buf/protovalidate/ValidatorCelExpressionTest.java @@ -84,7 +84,6 @@ public void testFieldExpressionRepeatedMessage() throws Exception { // Invalid message checks ValidationResult invalidResult = validator.validate(invalidMsg); assertThat(invalidResult.isSuccess()).isFalse(); - assertThat(invalidResult.toProto().getViolationsList()).containsExactly(expectedViolation); }