From 10fe4a99cb05f8afe1d2b0198b1c5fd023d8196d Mon Sep 17 00:00:00 2001
From: opitzju <julian.opitz@stud.hs-hannover.de>
Date: Wed, 1 Dec 2021 17:56:48 +0100
Subject: [PATCH] =?UTF-8?q?H2=20in-memory=20db=20f=C3=BCr=20unit=20tests?=
 =?UTF-8?q?=20hinzugef=C3=BCgt?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 pom.xml                                       |  7 +++++
 .../edu/hsh/dbs2/imdb/logic/GenreManager.java |  4 +--
 .../java/edu/hsh/dbs2/imdb/logic/Manager.java | 14 ++++++----
 .../edu/hsh/dbs2/imdb/logic/MovieManager.java |  6 ++---
 .../hsh/dbs2/imdb/logic/PersonManager.java    |  4 +--
 src/test/java/edu/hsh/dbs2/imdb/TestDB.java   |  3 +--
 src/test/resources/META-INF/persistence.xml   | 26 +++++++++++++++++++
 7 files changed, 50 insertions(+), 14 deletions(-)
 create mode 100644 src/test/resources/META-INF/persistence.xml

diff --git a/pom.xml b/pom.xml
index 0a08385..5e5c18f 100644
--- a/pom.xml
+++ b/pom.xml
@@ -23,6 +23,12 @@
       <version>4.13.2</version>
       <scope>test</scope>
     </dependency>
+    <dependency>
+      <groupId>com.h2database</groupId>
+      <artifactId>h2</artifactId>
+      <version>1.4.200</version>
+      <scope>test</scope>
+    </dependency>
     <dependency>
       <groupId>com.oracle.database.jdbc</groupId>
       <artifactId>ojdbc8</artifactId>
@@ -37,6 +43,7 @@
       <groupId>org.projectlombok</groupId>
       <artifactId>lombok</artifactId>
       <version>1.18.22</version>
+      <scope>compile</scope>
     </dependency>
   </dependencies>
 
diff --git a/src/main/java/edu/hsh/dbs2/imdb/logic/GenreManager.java b/src/main/java/edu/hsh/dbs2/imdb/logic/GenreManager.java
index 4408f48..1191fb2 100644
--- a/src/main/java/edu/hsh/dbs2/imdb/logic/GenreManager.java
+++ b/src/main/java/edu/hsh/dbs2/imdb/logic/GenreManager.java
@@ -7,7 +7,7 @@ import java.util.Collection;
 import java.util.List;
 import java.util.stream.Collectors;
 
-public class GenreManager extends Manager {
+public class GenreManager extends Manager<Genre> {
 
 	GenreManager(EntityManagerFactory sessionFactory) {
 		super(sessionFactory);
@@ -19,7 +19,7 @@ public class GenreManager extends Manager {
 	}
 
 	Collection<Genre> getGenreImpl() {
-		return query(Genre.class, (cb, cq) -> cq.select(cq.from(Genre.class)));
+		return query((cb, cq) -> cq.select(cq.from(Genre.class)));
 	}
 
 }
diff --git a/src/main/java/edu/hsh/dbs2/imdb/logic/Manager.java b/src/main/java/edu/hsh/dbs2/imdb/logic/Manager.java
index ceefb40..87d91ef 100644
--- a/src/main/java/edu/hsh/dbs2/imdb/logic/Manager.java
+++ b/src/main/java/edu/hsh/dbs2/imdb/logic/Manager.java
@@ -6,27 +6,31 @@ import jakarta.persistence.RollbackException;
 import jakarta.persistence.criteria.CriteriaBuilder;
 import jakarta.persistence.criteria.CriteriaQuery;
 
+import java.lang.reflect.ParameterizedType;
 import java.util.List;
 import java.util.function.BiConsumer;
 import java.util.function.Consumer;
 
-public class Manager {
+public class Manager<T> {
 
     private final ThreadLocal<EntityManager> localManager;
+    private final Class<T> type;
 
+    @SuppressWarnings("unchecked")
     protected Manager(EntityManagerFactory sessionFactory) {
         this.localManager = ThreadLocal.withInitial(sessionFactory::createEntityManager);
+        this.type = (Class<T>) ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[0];
     }
 
-    protected <T> List<T> queryNoClose(Class<T> type, BiConsumer<CriteriaBuilder, CriteriaQuery<T>> function) {
+    protected List<T> queryNoClose(BiConsumer<CriteriaBuilder, CriteriaQuery<T>> function) {
         var manager = getEntityManager();
         var cb = manager.getCriteriaBuilder();
         var cq = cb.createQuery(type);
         function.accept(cb, cq);
         return manager.createQuery(cq).getResultList();
     }
-    protected <T> List<T> query(Class<T> type, BiConsumer<CriteriaBuilder, CriteriaQuery<T>> function) {
-        var result = queryNoClose(type, function);
+    protected List<T> query(BiConsumer<CriteriaBuilder, CriteriaQuery<T>> function) {
+        var result = queryNoClose(function);
         closeEntityManager();
         return result;
     }
@@ -55,7 +59,7 @@ public class Manager {
         }
     }
 
-    protected  <T> T mergeIfDetached(T entity) {
+    protected  <E> E mergeIfDetached(E entity) {
         var manager = getEntityManager();
         if (!manager.contains(entity))
             return manager.merge(entity);
diff --git a/src/main/java/edu/hsh/dbs2/imdb/logic/MovieManager.java b/src/main/java/edu/hsh/dbs2/imdb/logic/MovieManager.java
index 6cff03c..6015352 100644
--- a/src/main/java/edu/hsh/dbs2/imdb/logic/MovieManager.java
+++ b/src/main/java/edu/hsh/dbs2/imdb/logic/MovieManager.java
@@ -10,7 +10,7 @@ import java.util.List;
 import java.util.Optional;
 import java.util.stream.Collectors;
 
-public class MovieManager extends Manager {
+public class MovieManager extends Manager<Movie> {
 	private final GenreManager genreManager;
 	private final PersonManager personManager;
 	private final MovieMapper mapper = new MovieMapper();
@@ -22,7 +22,7 @@ public class MovieManager extends Manager {
 	}
 
 	public List<MovieDTO> getMovieList(final String search) {
-		var movies = query(Movie.class, (cb, cq) -> {
+		var movies = query((cb, cq) -> {
 			var root = cq.from(Movie.class);
 			cq.select(root);
 			if (search != null && search.length() > 0)
@@ -73,7 +73,7 @@ public class MovieManager extends Manager {
 	}
 
 	private Optional<Movie> findMovieById(final long id) {
-		return queryNoClose(Movie.class, (cb, cq) -> {
+		return queryNoClose((cb, cq) -> {
 			var root = cq.from(Movie.class);
 			cq.select(root).where(cb.equal(root.get("id"), id));
 		}).stream().findAny();
diff --git a/src/main/java/edu/hsh/dbs2/imdb/logic/PersonManager.java b/src/main/java/edu/hsh/dbs2/imdb/logic/PersonManager.java
index c4eda31..bdb59ef 100644
--- a/src/main/java/edu/hsh/dbs2/imdb/logic/PersonManager.java
+++ b/src/main/java/edu/hsh/dbs2/imdb/logic/PersonManager.java
@@ -7,7 +7,7 @@ import java.util.Collection;
 import java.util.List;
 import java.util.stream.Collectors;
 
-public class PersonManager extends Manager {
+public class PersonManager extends Manager<Person> {
 
 	PersonManager(EntityManagerFactory sessionFactory) {
 		super(sessionFactory);
@@ -19,7 +19,7 @@ public class PersonManager extends Manager {
 	}
 
 	Collection<Person> getPeopleImpl(final String text) {
-		return query(Person.class, (cb, cq) -> {
+		return query((cb, cq) -> {
 			var root = cq.from(Person.class);
 			cq.select(root);
 			if (text != null && text.length() > 0)
diff --git a/src/test/java/edu/hsh/dbs2/imdb/TestDB.java b/src/test/java/edu/hsh/dbs2/imdb/TestDB.java
index a297315..b96fa61 100644
--- a/src/test/java/edu/hsh/dbs2/imdb/TestDB.java
+++ b/src/test/java/edu/hsh/dbs2/imdb/TestDB.java
@@ -7,7 +7,6 @@ import edu.hsh.dbs2.imdb.logic.ManagerFactory;
 import edu.hsh.dbs2.imdb.logic.MovieManager;
 import edu.hsh.dbs2.imdb.logic.dto.CharacterDTO;
 import edu.hsh.dbs2.imdb.logic.dto.MovieDTO;
-import edu.hsh.dbs2.imdb.util.Util;
 import jakarta.persistence.EntityManagerFactory;
 import jakarta.persistence.Persistence;
 import jakarta.persistence.PersistenceException;
@@ -24,7 +23,7 @@ public class TestDB {
 
     @BeforeClass
     public static void setUp() {
-        sessionFactory = Persistence.createEntityManagerFactory("edu.hsh.dbs2.imdb", Util.getTestDataProperty());
+        sessionFactory = Persistence.createEntityManagerFactory("edu.hsh.dbs2.imdb");
         ManagerFactory.instance.setSessionFactory(sessionFactory);
         movieManager = ManagerFactory.instance.getMovieManager();
     }
diff --git a/src/test/resources/META-INF/persistence.xml b/src/test/resources/META-INF/persistence.xml
new file mode 100644
index 0000000..fedb5f8
--- /dev/null
+++ b/src/test/resources/META-INF/persistence.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+<persistence xmlns="https://jakarta.ee/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="3.0"
+             xsi:schemaLocation="https://jakarta.ee/xml/ns/persistence  https://jakarta.ee/xml/ns/persistence/persistence_3_0.xsd">
+    <persistence-unit name="edu.hsh.dbs2.imdb" transaction-type="RESOURCE_LOCAL">
+        <provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
+        <class>edu.hsh.dbs2.imdb.entity.Movie</class>
+        <class>edu.hsh.dbs2.imdb.entity.Genre</class>
+        <class>edu.hsh.dbs2.imdb.entity.Person</class>
+        <class>edu.hsh.dbs2.imdb.entity.MovieCharacter</class>
+        <properties>
+            <property name="jakarta.persistence.jdbc.driver" value="org.h2.Driver"/>
+            <property name="jakarta.persistence.jdbc.url" value="jdbc:h2:mem:myDb;DB_CLOSE_DELAY=-1"/>
+            <property name="jakarta.persistence.jdbc.user" value="sa"/>
+            <property name="jakarta.persistence.jdbc.password" value=""/>
+            <property name="jakarta.persistence.schema-generation.database.action" value="create" />
+            <property name="jakarta.persistence.schema-generation.create-source" value="script"/>
+            <property name="jakarta.persistence.schema-generation.create-script-source" value="src/main/resources/Schema.sql"/>
+            <property name="jakarta.persistence.sql-load-script-source" value="src/main/resources/TestData.sql"/>
+            <property name="hibernate.check_nullability" value="true"/>
+            <property name="hibernate.hbm2ddl.auto" value="validate"/>
+            <property name="hibernate.dialect" value="org.hibernate.dialect.H2Dialect"/>
+            <property name="hibernate.show_sql" value="true"/>
+            <property name="hibernate.format_sql" value="true"/>
+        </properties>
+    </persistence-unit>
+</persistence>
\ No newline at end of file
-- 
GitLab