From 875cdfd55a7dbfdf89f683204f9d2e1f24fb4db0 Mon Sep 17 00:00:00 2001 From: John Burns Date: Mon, 15 Dec 2025 11:37:44 -0600 Subject: [PATCH] improve test class detection in nullability rules --- .../archrules/nullability/HaveNoTests.java | 6 ++- .../NebulaNullabilityArchRules.java | 3 +- .../nullability/HaveNoTestsTest.java | 54 +++++++++++++++++++ 3 files changed, 61 insertions(+), 2 deletions(-) create mode 100644 archrules-nullability/src/archRulesTest/java/com/netflix/nebula/archrules/nullability/HaveNoTestsTest.java diff --git a/archrules-nullability/src/archRules/java/com/netflix/nebula/archrules/nullability/HaveNoTests.java b/archrules-nullability/src/archRules/java/com/netflix/nebula/archrules/nullability/HaveNoTests.java index 6eaa1c6..9f0514c 100644 --- a/archrules-nullability/src/archRules/java/com/netflix/nebula/archrules/nullability/HaveNoTests.java +++ b/archrules-nullability/src/archRules/java/com/netflix/nebula/archrules/nullability/HaveNoTests.java @@ -11,6 +11,10 @@ public HaveNoTests() { @Override public boolean test(JavaClass javaClass) { return javaClass.getMembers().stream() - .noneMatch(it -> it.isAnnotatedWith("org.junit.jupiter.api.Test")); + .noneMatch(it -> it.isMetaAnnotatedWith("org.junit.platform.commons.annotation.Testable")); + } + + public static HaveNoTests haveNoTests() { + return new HaveNoTests(); } } diff --git a/archrules-nullability/src/archRules/java/com/netflix/nebula/archrules/nullability/NebulaNullabilityArchRules.java b/archrules-nullability/src/archRules/java/com/netflix/nebula/archrules/nullability/NebulaNullabilityArchRules.java index 6dda1b1..c914d3f 100644 --- a/archrules-nullability/src/archRules/java/com/netflix/nebula/archrules/nullability/NebulaNullabilityArchRules.java +++ b/archrules-nullability/src/archRules/java/com/netflix/nebula/archrules/nullability/NebulaNullabilityArchRules.java @@ -10,6 +10,7 @@ import java.util.HashMap; import java.util.Map; +import static com.netflix.nebula.archrules.nullability.HaveNoTests.haveNoTests; import static com.tngtech.archunit.lang.conditions.ArchConditions.fullyQualifiedName; public class NebulaNullabilityArchRules implements ArchRulesService { @@ -18,7 +19,7 @@ public class NebulaNullabilityArchRules implements ArchRulesService { .areTopLevelClasses() .and().arePublic() .and().containAnyMembersThat(HasModifiers.Predicates.modifier(JavaModifier.PUBLIC)) - .and(new HaveNoTests()) + .and(haveNoTests()) .and().areNotAnnotatedWith("kotlin.Metadata") .should().beAnnotatedWith("org.jspecify.annotations.NullMarked") .allowEmptyShould(true) diff --git a/archrules-nullability/src/archRulesTest/java/com/netflix/nebula/archrules/nullability/HaveNoTestsTest.java b/archrules-nullability/src/archRulesTest/java/com/netflix/nebula/archrules/nullability/HaveNoTestsTest.java new file mode 100644 index 0000000..39cf319 --- /dev/null +++ b/archrules-nullability/src/archRulesTest/java/com/netflix/nebula/archrules/nullability/HaveNoTestsTest.java @@ -0,0 +1,54 @@ +package com.netflix.nebula.archrules.nullability; + +import com.tngtech.archunit.core.domain.JavaClass; +import com.tngtech.archunit.core.importer.ClassFileImporter; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.ValueSource; + +import static com.netflix.nebula.archrules.nullability.HaveNoTests.haveNoTests; +import static org.assertj.core.api.Assertions.assertThat; + +class HaveNoTestsTest { + @Test + public void test_jupiter_test() { + JavaClass codeToTest = new ClassFileImporter().importClass(UsesJupiterTest.class); + HaveNoTests instance = haveNoTests(); + assertThat(instance.test(codeToTest)).isFalse(); + } + + @Test + public void test_jupiter_parameterized_test() { + JavaClass codeToTest = new ClassFileImporter().importClass(UsesJupiterParameterizedTest.class); + HaveNoTests instance = haveNoTests(); + assertThat(instance.test(codeToTest)).isFalse(); + } + + @Test + public void test_nothing() { + JavaClass codeToTest = new ClassFileImporter().importClass(UsesNothing.class); + HaveNoTests instance = haveNoTests(); + assertThat(instance.test(codeToTest)).isTrue(); + } + + static class UsesJupiterTest { + @Test + void test() { + + } + } + + static class UsesJupiterParameterizedTest { + @ParameterizedTest + @ValueSource(strings = {"a", "b"}) + void test(String param) { + + } + } + + static class UsesNothing { + void test() { + + } + } +}