diff --git a/testing/pom.xml b/testing/pom.xml index 71d6d78..7d467a4 100644 --- a/testing/pom.xml +++ b/testing/pom.xml @@ -43,6 +43,10 @@ org.flywaydb flyway-database-postgresql + + com.google.testing.compile + compile-testing + diff --git a/testing/src/main/java/at/test/drm/DogEntity.java b/testing/src/main/java/at/test/drm/DogEntity.java index dad00cc..671d403 100644 --- a/testing/src/main/java/at/test/drm/DogEntity.java +++ b/testing/src/main/java/at/test/drm/DogEntity.java @@ -2,13 +2,9 @@ import at.drm.annotation.Relation; import at.drm.model.RelationIdentity; +import jakarta.persistence.*; import lombok.Data; -import jakarta.persistence.Entity; -import jakarta.persistence.GeneratedValue; -import jakarta.persistence.GenerationType; -import jakarta.persistence.Id; - @Relation @Entity @Data @@ -16,5 +12,6 @@ public class DogEntity implements RelationIdentity { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) + @Column(unique = true, nullable = false) private Long id; } diff --git a/testing/src/test/java/at/test/drm/RelationProcessorTest.java b/testing/src/test/java/at/test/drm/RelationProcessorTest.java new file mode 100644 index 0000000..bc2703f --- /dev/null +++ b/testing/src/test/java/at/test/drm/RelationProcessorTest.java @@ -0,0 +1,83 @@ +package at.test.drm; + +import com.google.testing.compile.Compilation; +import com.google.testing.compile.CompilationSubject; +import com.google.testing.compile.Compiler; +import com.google.testing.compile.JavaFileObjects; +import org.junit.jupiter.api.Test; + +import javax.tools.JavaFileObject; + +import static com.google.common.truth.Truth.assertThat; + +class RelationProcessorTest { + + @Test + void shouldGenerateCodeForRelationAnnotation() { + + // 1. Fake input class + JavaFileObject source = JavaFileObjects.forSourceString( + "test.User", + """ + package test; + + import at.drm.annotation.Relation; + + @Relation + public class User { + } + """ + ); + + // 2. Run processor + Compilation compilation = Compiler.javac() + .withProcessors(new at.drm.processor.RelationProcessor()) + .compile(source); + + // 3. Assert compilation success + assertThat(compilation.status()) + .isEqualTo(Compilation.Status.SUCCESS); + + // 4. Assert something was generated + assertThat(compilation.generatedSourceFiles()) + .isNotEmpty(); + + // 5. Get generated file content + String generated = String.valueOf(CompilationSubject.assertThat(compilation) + .generatedSourceFile("test.UserRelation") + .contentsAsUtf8String()); + + // 6. Strong assertions + assertThat(generated).contains("package test;"); + assertThat(generated).contains("class UserRelation"); + } + + + @Test + void shouldNotGenerateWhenAnnotationMissing() { + + // 1. Input WITHOUT @Relation + JavaFileObject source = JavaFileObjects.forSourceString( + "test.User", + """ + package test; + + public class User { + } + """ + ); + + // 2. Run processor + Compilation compilation = Compiler.javac() + .withProcessors(new at.drm.processor.RelationProcessor()) + .compile(source); + + // 3. Should still compile successfully + assertThat(compilation.status()) + .isEqualTo(Compilation.Status.SUCCESS); + + // 4. But should NOT generate any files + assertThat(compilation.generatedSourceFiles()) + .isEmpty(); + } +} \ No newline at end of file