From 6bb3731868d8acc13ccfa47870a63656807b33a8 Mon Sep 17 00:00:00 2001
From: jez04 <david.jezek@vsb.cz>
Date: Wed, 19 Mar 2025 10:17:40 +0000
Subject: [PATCH] fix: update old text

---
 .../structure/test/ClassStructureTest.java    | 201 +++++++++++++-----
 1 file changed, 146 insertions(+), 55 deletions(-)

diff --git a/src/test/java/jez04/structure/test/ClassStructureTest.java b/src/test/java/jez04/structure/test/ClassStructureTest.java
index e13f549..21c3023 100644
--- a/src/test/java/jez04/structure/test/ClassStructureTest.java
+++ b/src/test/java/jez04/structure/test/ClassStructureTest.java
@@ -2,85 +2,176 @@ package jez04.structure.test;
 
 import static org.hamcrest.MatcherAssert.assertThat;
 
+import java.io.IOException;
+import java.lang.reflect.InvocationTargetException;
 import java.net.URISyntaxException;
+import java.nio.file.Files;
 import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.util.List;
 import java.util.Objects;
-import java.util.stream.Stream;
+import java.util.regex.Pattern;
 
 import org.hamcrest.Matchers;
+import org.junit.jupiter.api.AfterEach;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.MethodOrderer.OrderAnnotation;
+import org.junit.jupiter.api.Nested;
+import org.junit.jupiter.api.Order;
 import org.junit.jupiter.api.Test;
-import org.junit.jupiter.params.ParameterizedTest;
-import org.junit.jupiter.params.provider.CsvSource;
+import org.junit.jupiter.api.TestMethodOrder;
 
-import cz.vsb.fei.kelvin.unittest.SrcContains;
+import cz.vsb.fei.kelvin.unittest.ProjectContains;
 import cz.vsb.fei.kelvin.unittest.StructureHelper;
 import cz.vsb.fei.kelvin.unittest.TextFileContains;
 import cz.vsb.fei.kelvin.unittest.XmlFileContains;
+import lab.data.Level;
+import lab.data.Score;
+import lab.storage.JpaConnector;
 
 class ClassStructureTest {
 
 	StructureHelper helper = StructureHelper.getInstance(ClassStructureTest.class);
-	
-	@Test
-	void lombokAsDependencyTest() throws URISyntaxException {
-		XmlFileContains xmlFileContains = new XmlFileContains("pom.xml", "/project/dependencies/dependency/artifactId[text() = 'lombok']");
-		Path root = TextFileContains.getProjectRoot(getClass()); 
-		assertThat(root, xmlFileContains);
-	}
 
 	@Test
-	void lombokAsAnnotationProcessorTest() throws URISyntaxException {
-		assertThat(TextFileContains.getProjectRoot(getClass()), new XmlFileContains("pom.xml", "/project/build/plugins/plugin/artifactId[text() = 'maven-compiler-plugin']"));
-		assertThat(TextFileContains.getProjectRoot(getClass()), new XmlFileContains("pom.xml", "/project/build/plugins/plugin/configuration/annotationProcessorPaths/path/artifactId[text() = 'lombok']"));
+	void jakartaAndHibernateAsDependencyTest() throws URISyntaxException {
+		assertThat(TextFileContains.getProjectRoot(getClass()), new XmlFileContains("pom.xml",
+				"/project/dependencies/dependency/artifactId[text() = 'jakarta.persistence-api']"));
+		assertThat(TextFileContains.getProjectRoot(getClass()), new XmlFileContains("pom.xml",
+				"/project/dependencies/dependency/artifactId[text() = 'hibernate-core']"));
 	}
 
 	@Test
-	void moduleInfoTest() throws URISyntaxException {
-		assertThat(TextFileContains.getProjectRoot(getClass()), new TextFileContains("module-info.java", "lombok;"));
+	void jakartaInModulInfoTest() throws URISyntaxException {
+		assertThat(TextFileContains.getProjectRoot(getClass()),
+				new TextFileContains("module-info.java", "jakarta.persistence;"));
+		assertThat(TextFileContains.getProjectRoot(getClass()),
+				new TextFileContains("module-info.java", "opens\\slab.data;"));
 	}
 
-	@CsvSource({
-		"Config,@Getter,1",
-		"Config,@.*Builder,1",
-		"Config,@.*Default,3"
-		})
-	@ParameterizedTest(name = "useLombokTest in {1} annotation {2}")
-	void useLombokConfigTest(String className, String text, int count) throws URISyntaxException, ClassNotFoundException {
-		Class<?> config = helper.getClass(className);
-		assertThat(config, new SrcContains(text).count(count));
+	@Test
+	void pesistenceXmlTest() throws URISyntaxException {
+		ProjectContains projectContains = new ProjectContains("persistence.xml");
+		assertThat(TextFileContains.getProjectRoot(getClass()), projectContains);
+		assertThat(projectContains.getFoundFiles(), Matchers.not(Matchers.hasSize(0)));
+		Path persistenceXml = projectContains.getFoundFiles().getFirst();
+		assertThat(persistenceXml.toAbsolutePath().toString(),
+				Matchers.endsWith(Paths.get("resources", "META-INF", "persistence.xml").toString()));
 	}
 
-	@CsvSource({
-		"Score,@Setter,1",
-		"Score,@Getter,1",
-		"Score,@AllArgsConstructor,1",
-		"Score,@EqualsAndHashCode,1",
-		"Score,@ToString,1"
-		})
-	@ParameterizedTest(name = "useLombokTest in {1} annotation {2}")
-	void useLombokOrDataTest(String className, String text, int count) throws URISyntaxException, ClassNotFoundException {
-		Class<?> config = helper.getClass(className);
-		assertThat(config, Matchers.anyOf(new SrcContains(text).count(count),
-				new SrcContains("@Data").count(1)));
-	}
-	
 	@Test
-	void recordTest() throws URISyntaxException {
-		
-		long recordCount = Stream.concat(
-				helper.getAllNonInnerClasses().stream(),
-				helper.getAllInnerClasses().stream())
-				.filter(className -> !className.startsWith("javafx")).map(className -> {
-					try {
-						return helper.getClassDirectly(className);
-					} catch (ClassNotFoundException e) {
-						e.printStackTrace();
-						return null;
-					}
-				}).filter(Objects::nonNull).filter(clazz -> clazz.isRecord()).count();
-		assertThat(recordCount, Matchers.greaterThanOrEqualTo(1L));
-		
+	void useEnumeratedTest() throws URISyntaxException {
+		assertThat(TextFileContains.getProjectRoot(getClass()),
+				new TextFileContains("Score.java", "@Enumerated\\(\\s*EnumType.STRING\\s*\\)"));
 	}
-	
 
+	@TestMethodOrder(OrderAnnotation.class)
+	@Nested
+	class JpaConnectorTests {
+
+		private Score template = new Score(null, "Tester", 100, Level.EASY);
+		private JpaConnector connector;
+
+		@BeforeEach
+		void init() {
+			connector = new JpaConnector();
+		}
+
+		@AfterEach
+		void cleanUp() {
+			connector.stop();
+		}
+
+		boolean same(Score s1, Score s2) {
+			return s1.getLevel() == s2.getLevel() && s1.getPoints() == s2.getPoints()
+					&& Objects.equals(s1.getName(), s2.getName());
+		}
+
+		@Test
+		@Order(100)
+		void jpaScoreInsertTest() {
+			Score savedScore = connector.save(template);
+			assertThat(savedScore.getId(), Matchers.notNullValue());
+		}
+
+		@Test
+		@Order(200)
+		void jpaScoreReadTest() {
+			List<Score> savedScores = connector.getAll().stream().filter(s -> same(s, template)).toList();
+			assertThat(savedScores, Matchers.not(Matchers.hasSize(0)));
+		}
+
+		@Test
+		@Order(250)
+		void jpaReadSortedTest() {
+			for (int i = 0; i < 20; i++) {
+				connector.save(template.toBuilder().points(i).build());
+			}
+			List<Score> result = connector.getFirstTen();
+			assertThat(result, Matchers.hasSize(10));
+			for (int i = 0; i < result.size()-1; i++) {
+				assertThat(result.get(i).getPoints(), Matchers.greaterThanOrEqualTo(result.get(i+1).getPoints()));
+			}
+		}
+
+		@Test
+		@Order(300)
+		void jpaScoreModifyTest() {
+			List<Score> savedScores = connector.getAll().stream().filter(s -> same(s, template)).toList();
+			List<Long> savedIds = savedScores.stream().map(Score::getId).toList();
+			assertThat(savedScores, Matchers.not(Matchers.hasSize(0)));
+			for (Score score : savedScores) {
+				score.setLevel(Level.HARD);
+				connector.save(score);
+			}
+			List<Score> modifiedScores = connector.getAll().stream().filter(s -> savedIds.contains(s.getId())).toList();
+			assertThat(modifiedScores, Matchers.not(Matchers.hasSize(0)));
+			List<Score> originalDataScores = connector.getAll().stream().filter(s -> same(s, template)).toList();
+			assertThat(originalDataScores, Matchers.hasSize(0));
+		}
+
+		@Test
+		@Order(400)
+		void jpaScoreDeleteTest() {
+			template.setLevel(Level.HARD);
+			List<Score> savedScores = connector.getAll().stream().filter(s -> same(s, template)).toList();
+			List<Long> savedIds = savedScores.stream().map(Score::getId).toList();
+			assertThat(savedScores, Matchers.not(Matchers.hasSize(0)));
+			connector.delete(savedScores);
+			List<Score> modifiedScores = connector.getAll().stream().filter(s -> savedIds.contains(s.getId())).toList();
+			assertThat(modifiedScores, Matchers.hasSize(0));
+			List<Score> originalDataScores = connector.getAll().stream().filter(s -> same(s, template)).toList();
+			assertThat(originalDataScores, Matchers.hasSize(0));
+		}
+
+		@Test
+		@Order(400)
+		void jpaMergeTest() {
+			connector.save(template);
+			connector.find(template.getId());
+			Score copy = template.toBuilder().points(500).build();
+			Score result = connector.save(copy);
+			assertThat(result, Matchers.not(Matchers.sameInstance(copy)));
+		}
+
+		@Test
+		@Order(500)
+		void jpamodifyNoPersistNoMergeTest() throws URISyntaxException, IOException, IllegalAccessException, InvocationTargetException, NoSuchMethodException, SecurityException {
+			template.setName("aaa");
+			connector.save(template);
+			connector.modifyNoPersistOrMerge(template.getId(), score -> score.setName("ok"));
+			Object em = connector.getEntityManager();
+			em.getClass().getMethod("clear").invoke(em);
+			
+			assertThat(connector.find(template.getId()).getName(), Matchers.equalTo("ok"));
+			TextFileContains textFileContains = new TextFileContains("JpaConnector.java",
+					"void\\s+modifyNoPersistOrMerge[\\s\\S]*}").multiline(true);
+			assertThat(TextFileContains.getProjectRoot(ClassStructureTest.class), textFileContains);
+			Path score = textFileContains.getFoundFiles().getFirst();
+			String src = Files.readString(score);
+			String method = Pattern.compile("void\\s+modifyNoPersistOrMerge[\\s\\S]*}").matcher(src).results().findFirst().get().group();
+			assertThat(method, Matchers.not(Matchers.containsString("persist")));
+			assertThat(method, Matchers.not(Matchers.containsString("merge")));
+		}
+	}
 }
-- 
GitLab