From 71ed339c198b5688d2770603df8546880bd265e0 Mon Sep 17 00:00:00 2001
From: Martin Staehr <software@mstaehr.net>
Date: Wed, 12 Sep 2018 10:53:09 +0200
Subject: [PATCH] #40 feat: adding mysql connect as injection, feat:
 implementing in memory database for tests, move fltrail.sql to
 test/resources/database, so it can be used in test for building the inmemory
 database

---
 gemeinsamforschen/pom.xml                     | 13 ++-
 .../gf/config/GFApplicationBinder.java        |  1 +
 .../gf/core/database/mysql/MysqlConnect.java  |  1 +
 .../gf/core/management/Management.java        |  3 +
 .../gf/core/management/ManagementImpl.java    | 16 +++-
 .../gf/core/management/group/GroupDAO.java    |  3 +-
 .../core/management/project/ProjectDAO.java   |  4 +-
 .../gf/core/management/user/UserDAO.java      | 14 +--
 .../gf/core/management/user/UserService.java  | 24 +++--
 .../controller/service/PeerAssessment.java    | 19 +++-
 .../gf/modules/communication/ChatWindow.java  |  6 +-
 .../core/database/InMemoryMySqlConnect.java   | 51 ++++++++++
 .../management/project/ProjectDAOTest.java    | 25 +++++
 .../gf/core/management/user/UserDAOTest.java  | 95 +++++++++++++++++++
 .../gf/interfaces/ManagementTest.java         | 91 ++----------------
 .../unipotsdam/gf/interfaces/PhaseTest.java   |  4 +-
 .../java/unipotsdam/gf/util/TestHelper.java   | 23 +++++
 .../src/test/resources/database/fltrail.sql   |  1 -
 18 files changed, 269 insertions(+), 125 deletions(-)
 create mode 100644 gemeinsamforschen/src/test/java/unipotsdam/gf/core/database/InMemoryMySqlConnect.java
 create mode 100644 gemeinsamforschen/src/test/java/unipotsdam/gf/core/management/project/ProjectDAOTest.java
 create mode 100644 gemeinsamforschen/src/test/java/unipotsdam/gf/core/management/user/UserDAOTest.java
 create mode 100644 gemeinsamforschen/src/test/java/unipotsdam/gf/util/TestHelper.java

diff --git a/gemeinsamforschen/pom.xml b/gemeinsamforschen/pom.xml
index e4fb1798..cda31359 100644
--- a/gemeinsamforschen/pom.xml
+++ b/gemeinsamforschen/pom.xml
@@ -52,7 +52,7 @@
         <dependency>
             <groupId>org.slf4j</groupId>
             <artifactId>slf4j-api</artifactId>
-            <version>1.6.2</version>
+            <version>1.7.25</version>
         </dependency>
 
         <dependency>
@@ -211,10 +211,17 @@
         <dependency>
             <groupId>ch.vorburger.mariaDB4j</groupId>
             <artifactId>mariaDB4j</artifactId>
-            <version>2.2.3</version>
-            <scope>test</scope>
+            <version>2.3.0</version>
         </dependency>
 
+
+        <dependency>
+            <groupId>commons-dbutils</groupId>
+            <artifactId>commons-dbutils</artifactId>
+            <version>1.7</version>
+        </dependency>
+
+
     </dependencies>
 
 </project>
\ No newline at end of file
diff --git a/gemeinsamforschen/src/main/java/unipotsdam/gf/config/GFApplicationBinder.java b/gemeinsamforschen/src/main/java/unipotsdam/gf/config/GFApplicationBinder.java
index b6721808..ce37ee4f 100644
--- a/gemeinsamforschen/src/main/java/unipotsdam/gf/config/GFApplicationBinder.java
+++ b/gemeinsamforschen/src/main/java/unipotsdam/gf/config/GFApplicationBinder.java
@@ -48,5 +48,6 @@ public class GFApplicationBinder extends AbstractBinder {
         bind(GroupDAO.class).to(GroupDAO.class);
         bind(MysqlConnect.class).to(MysqlConnect.class);
 
+
     }
 }
diff --git a/gemeinsamforschen/src/main/java/unipotsdam/gf/core/database/mysql/MysqlConnect.java b/gemeinsamforschen/src/main/java/unipotsdam/gf/core/database/mysql/MysqlConnect.java
index c0330b7c..09a12822 100644
--- a/gemeinsamforschen/src/main/java/unipotsdam/gf/core/database/mysql/MysqlConnect.java
+++ b/gemeinsamforschen/src/main/java/unipotsdam/gf/core/database/mysql/MysqlConnect.java
@@ -39,6 +39,7 @@ public class MysqlConnect {
                 System.out.println(ex); //logger?
             }
             conn = DriverManager.getConnection(createConnectionString());
+
         } catch (SQLException ex) {
             System.out.println("SQLException: " + ex.getMessage());
             System.out.println("SQLState: " + ex.getSQLState());
diff --git a/gemeinsamforschen/src/main/java/unipotsdam/gf/core/management/Management.java b/gemeinsamforschen/src/main/java/unipotsdam/gf/core/management/Management.java
index c919c527..3492e7ce 100644
--- a/gemeinsamforschen/src/main/java/unipotsdam/gf/core/management/Management.java
+++ b/gemeinsamforschen/src/main/java/unipotsdam/gf/core/management/Management.java
@@ -6,6 +6,7 @@ import unipotsdam.gf.core.management.project.ProjectConfiguration;
 import unipotsdam.gf.core.management.user.User;
 import unipotsdam.gf.core.management.user.UserInterests;
 import unipotsdam.gf.core.management.user.UserProfile;
+import unipotsdam.gf.modules.assessment.controller.model.Quiz;
 
 /**
  * Created by dehne on 31.05.2018.
@@ -85,5 +86,7 @@ public interface Management {
     void create(ProjectConfiguration projectConfiguration, Project project);
 
     ProjectConfiguration getProjectConfiguration(Project project);
+
+    Quiz getQuizByProjectGroupId(String projectId, String quizId);
 }
 
diff --git a/gemeinsamforschen/src/main/java/unipotsdam/gf/core/management/ManagementImpl.java b/gemeinsamforschen/src/main/java/unipotsdam/gf/core/management/ManagementImpl.java
index 0a6eb7ab..efdbc691 100644
--- a/gemeinsamforschen/src/main/java/unipotsdam/gf/core/management/ManagementImpl.java
+++ b/gemeinsamforschen/src/main/java/unipotsdam/gf/core/management/ManagementImpl.java
@@ -28,16 +28,22 @@ import java.util.ArrayList;
 @Singleton
 public class ManagementImpl implements Management {
 
-    @Inject
     private UserDAO userDAO;
-    @Inject
     private GroupDAO groupDAO;
-    @Inject
     private ProjectDAO projectDAO;
 
+    private MysqlConnect connect;
+
+    @Inject
+    public ManagementImpl(UserDAO userDAO, GroupDAO groupDAO, ProjectDAO projectDAO, MysqlConnect connect) {
+        this.userDAO = userDAO;
+        this.groupDAO = groupDAO;
+        this.projectDAO = projectDAO;
+        this.connect = connect;
+    }
+
     @Override
     public void register(User user, Project project, UserInterests interests) {
-        MysqlConnect connect = new MysqlConnect();
         connect.connect();
         String mysqlRequest = "INSERT INTO projectuser (`projectId`, `userId`) values (?,?)";
         connect.issueInsertOrDeleteStatement(mysqlRequest, project.getId(), user.getId());
@@ -51,8 +57,8 @@ public class ManagementImpl implements Management {
      * @param quizId
      * @return
      */
+    @Override
     public Quiz getQuizByProjectGroupId(String projectId, String quizId) {
-        MysqlConnect connect = new MysqlConnect();
         connect.connect();
         String mysqlRequest = "SELECT * FROM quiz where projectId=" + projectId + " , question=" + quizId;
         VereinfachtesResultSet vereinfachtesResultSet =
diff --git a/gemeinsamforschen/src/main/java/unipotsdam/gf/core/management/group/GroupDAO.java b/gemeinsamforschen/src/main/java/unipotsdam/gf/core/management/group/GroupDAO.java
index 6467339a..2d887c0e 100644
--- a/gemeinsamforschen/src/main/java/unipotsdam/gf/core/management/group/GroupDAO.java
+++ b/gemeinsamforschen/src/main/java/unipotsdam/gf/core/management/group/GroupDAO.java
@@ -28,7 +28,6 @@ public class GroupDAO {
 
     public void persist(Group group) {
         connect.connect();
-
         String mysqlRequestGroup = "INSERT INTO groups (`projectId`,`chatRoomId`) values (?,?)";
         connect.issueInsertOrDeleteStatement(mysqlRequestGroup, group.getProjectId(), group.getChatRoomId());
 
@@ -37,6 +36,7 @@ public class GroupDAO {
             connect.issueInsertOrDeleteStatement(mysqlRequest2, groupMember.getEmail(), group.getProjectId());
         }
         connect.close();
+
     }
 
     public void update(Group group) {
@@ -74,7 +74,6 @@ public class GroupDAO {
         }
         ArrayList<Group> groups = new ArrayList<>();
         groupHashMap.forEach((key, group) -> groups.add(group));
-
         connect.close();
         if (groups.isEmpty()) {
             return null;
diff --git a/gemeinsamforschen/src/main/java/unipotsdam/gf/core/management/project/ProjectDAO.java b/gemeinsamforschen/src/main/java/unipotsdam/gf/core/management/project/ProjectDAO.java
index d987951d..5a9df4d0 100644
--- a/gemeinsamforschen/src/main/java/unipotsdam/gf/core/management/project/ProjectDAO.java
+++ b/gemeinsamforschen/src/main/java/unipotsdam/gf/core/management/project/ProjectDAO.java
@@ -41,10 +41,10 @@ public class ProjectDAO {
         connect.connect();
         String mysqlRequest = "DELETE FROM projects where id = (?)";
         connect.issueInsertOrDeleteStatement(mysqlRequest, project.getId());
-
+        connect.close();
         // TODO: delete all groups of project?
 
-        connect.close();
+
     }
 
     public Boolean exists(Project project) {
diff --git a/gemeinsamforschen/src/main/java/unipotsdam/gf/core/management/user/UserDAO.java b/gemeinsamforschen/src/main/java/unipotsdam/gf/core/management/user/UserDAO.java
index 693964a1..01ed0681 100644
--- a/gemeinsamforschen/src/main/java/unipotsdam/gf/core/management/user/UserDAO.java
+++ b/gemeinsamforschen/src/main/java/unipotsdam/gf/core/management/user/UserDAO.java
@@ -2,7 +2,6 @@ package unipotsdam.gf.core.management.user;
 
 import unipotsdam.gf.core.database.mysql.MysqlConnect;
 import unipotsdam.gf.core.database.mysql.VereinfachtesResultSet;
-import unipotsdam.gf.core.management.project.Project;
 import unipotsdam.gf.core.management.util.ResultSetUtil;
 
 import javax.annotation.ManagedBean;
@@ -29,31 +28,28 @@ public class UserDAO {
     public void persist(User user, UserProfile profile) {
         UUID uuid = UUID.randomUUID();
         String token = uuid.toString();
-
         connect.connect();
         String mysqlRequest = "INSERT INTO users (`name`, `password`, `email`, `token`,`isStudent`," +
                 "`rocketChatId`,`rocketChatAuthToken`) values (?,?,?,?,?,?,?)";
         connect.issueInsertOrDeleteStatement(mysqlRequest, user.getName(), user.getPassword(), user.getEmail(),
                 token, user.getStudent(), user.getRocketChatId(), user.getRocketChatAuthToken());
         connect.close();
-
         // TODO implmement UserProfile @Mar
     }
 
     public void delete(User user) {
-        connect.connect();
         String mysqlRequest = "DELETE FROM users where email = (?)";
+        connect.connect();
         connect.issueInsertOrDeleteStatement(mysqlRequest, user.getEmail());
         connect.close();
     }
 
     public void update(User user) {
-        connect.connect();
         String mysqlRequest = "UPDATE `users` SET `name`=?,`password`=?,`email`=?,`token`=?,`isStudent`=?," +
                 "`rocketChatId`=?,`rocketChatAuthToken`=? WHERE email=? LIMIT 1";
         //TODO: maybe add handling if a line is actually updated
         //TODO: if user is updated, it also must update all other tables which includes some information about the user, for example project user
-
+        connect.connect();
         connect.issueUpdateStatement(mysqlRequest, user.getName(), user.getPassword(), user.getEmail(),
                 user.getToken(), user.getStudent(), user.getRocketChatId(), user.getRocketChatAuthToken(), user.getEmail());
         connect.close();
@@ -70,7 +66,8 @@ public class UserDAO {
         return result;
     }
 
-    public List<User> getUsers(Project project) {
+    public List<User> getUsersByProjectId(String projectId) {
+        connect.connect();
         String query =
                 "SELECT * FROM users u "
                         + " JOIN projectuser pu ON u.email=pu.userId"
@@ -78,8 +75,7 @@ public class UserDAO {
                         + " WHERE pu.projectId = ?";
 
         ArrayList<User> result = new ArrayList<>();
-        connect.connect();
-        VereinfachtesResultSet vereinfachtesResultSet = connect.issueSelectStatement(query, project.getId());
+        VereinfachtesResultSet vereinfachtesResultSet = connect.issueSelectStatement(query, projectId);
         while (!vereinfachtesResultSet.isLast()) {
             boolean next = vereinfachtesResultSet.next();
             if (next) {
diff --git a/gemeinsamforschen/src/main/java/unipotsdam/gf/core/management/user/UserService.java b/gemeinsamforschen/src/main/java/unipotsdam/gf/core/management/user/UserService.java
index 9684fa6b..000b4394 100644
--- a/gemeinsamforschen/src/main/java/unipotsdam/gf/core/management/user/UserService.java
+++ b/gemeinsamforschen/src/main/java/unipotsdam/gf/core/management/user/UserService.java
@@ -1,6 +1,6 @@
 package unipotsdam.gf.core.management.user;
 
-import unipotsdam.gf.core.management.ManagementImpl;
+import unipotsdam.gf.core.management.Management;
 import unipotsdam.gf.interfaces.ICommunication;
 import unipotsdam.gf.modules.communication.service.CommunicationDummyService;
 
@@ -19,12 +19,19 @@ import java.net.URISyntaxException;
 @ManagedBean
 public class UserService {
 
-    @Inject
     private ICommunication communicationService;
 
-    @Inject
     private UserDAO userDAO;
 
+    private Management management;
+
+    @Inject
+    public UserService(ICommunication communicationService, UserDAO userDAO, Management management) {
+        this.communicationService = communicationService;
+        this.userDAO = userDAO;
+        this.management = management;
+    }
+
     /**
      * creates a user with given credentials
      *
@@ -43,7 +50,6 @@ public class UserService {
                                @FormParam("email") String email, @FormParam("isStudent") String isStudent)
             throws URISyntaxException {
 
-        ManagementImpl management = new ManagementImpl();
         User user = new User(name, password, email, isStudent == null);
         return login(true, user);
 
@@ -66,7 +72,6 @@ public class UserService {
                                @FormParam("email") String email)
             throws URISyntaxException {
 
-        ManagementImpl management = new ManagementImpl();
         User user = new User(name, password, email, null);
         ICommunication iCommunication = new CommunicationDummyService();
         boolean isLoggedIn = iCommunication.loginUser(user);
@@ -88,11 +93,11 @@ public class UserService {
      * @throws URISyntaxException
      */
     protected Response login(boolean createUser, User user) throws URISyntaxException {
-        ManagementImpl management = new ManagementImpl();
+
         if (management.exists(user)) {
             if (!createUser) {
                 user = fillUserFields(user);
-                return redirectToProjectPage(user, management);
+                return redirectToProjectPage(user);
             }
             String existsUrl = "../register.jsp?userExists=true";
             return forwardToLocation(existsUrl);
@@ -104,7 +109,7 @@ public class UserService {
                 }
                 management.create(user, null);
                 user = fillUserFields(user);
-                return redirectToProjectPage(user, management);
+                return redirectToProjectPage(user);
             } else {
                 String existsUrl = "../index.jsp?userExists=false";
                 return forwardToLocation(existsUrl);
@@ -133,11 +138,10 @@ public class UserService {
      * helper function for redirecting to the right project page
      *
      * @param user
-     * @param management
      * @return
      * @throws URISyntaxException
      */
-    private Response redirectToProjectPage(User user, ManagementImpl management) throws URISyntaxException {
+    private Response redirectToProjectPage(User user) throws URISyntaxException {
         String successUrl;
         if (user.getStudent() != null && user.getStudent()) {
             successUrl = "../pages/overview-student.jsp?token=";
diff --git a/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/assessment/controller/service/PeerAssessment.java b/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/assessment/controller/service/PeerAssessment.java
index a4ff7b02..b221d397 100644
--- a/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/assessment/controller/service/PeerAssessment.java
+++ b/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/assessment/controller/service/PeerAssessment.java
@@ -1,14 +1,25 @@
 package unipotsdam.gf.modules.assessment.controller.service;
 
-import unipotsdam.gf.core.management.ManagementImpl;
+import unipotsdam.gf.core.management.Management;
 import unipotsdam.gf.interfaces.IPeerAssessment;
 import unipotsdam.gf.modules.assessment.QuizAnswer;
-import unipotsdam.gf.modules.assessment.controller.model.*;
-
+import unipotsdam.gf.modules.assessment.controller.model.Assessment;
+import unipotsdam.gf.modules.assessment.controller.model.Grading;
+import unipotsdam.gf.modules.assessment.controller.model.PeerRating;
+import unipotsdam.gf.modules.assessment.controller.model.Performance;
+import unipotsdam.gf.modules.assessment.controller.model.Quiz;
+import unipotsdam.gf.modules.assessment.controller.model.StudentAndQuiz;
+import unipotsdam.gf.modules.assessment.controller.model.StudentIdentifier;
+
+import javax.inject.Inject;
 import java.util.ArrayList;
 import java.util.List;
 
 public class PeerAssessment implements IPeerAssessment {
+
+    @Inject
+    private Management management;
+
     @Override
     public void addAssessmentDataToDB(Assessment assessment) {
 
@@ -16,7 +27,7 @@ public class PeerAssessment implements IPeerAssessment {
 
     @Override//returns one quiz
     public Quiz getQuiz(String projectId, String quizId) {
-        return new ManagementImpl().getQuizByProjectGroupId(projectId,quizId);
+        return management.getQuizByProjectGroupId(projectId, quizId);
     }
 
     @Override //returns all quizzes in the course
diff --git a/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/communication/ChatWindow.java b/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/communication/ChatWindow.java
index 9fa51312..366395ce 100644
--- a/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/communication/ChatWindow.java
+++ b/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/communication/ChatWindow.java
@@ -1,6 +1,5 @@
 package unipotsdam.gf.modules.communication;
 
-import unipotsdam.gf.core.management.ManagementImpl;
 import unipotsdam.gf.interfaces.ICommunication;
 import unipotsdam.gf.modules.communication.service.CommunicationDummyService;
 
@@ -18,16 +17,15 @@ public class ChatWindow extends SimpleTagSupport {
         PageContext pageContext = (PageContext) getJspContext();
         HttpServletRequest request = (HttpServletRequest) pageContext.getRequest();
         String token = request.getParameter("token");
-        ManagementImpl management = new ManagementImpl();
         //User user = management.getUserByToken(token);
         String groupToken = request.getParameter("groupToken");
         String projectToken = request.getParameter("projectToken");
         //get ProjetbyToken
         ICommunication communicationService = new CommunicationDummyService();
-        String chatRoomLink = communicationService.getChatRoomLink(token,projectToken,groupToken);
+        String chatRoomLink = communicationService.getChatRoomLink(token, projectToken, groupToken);
 
         JspWriter out = getJspContext().getOut();
-        out.println("<iframe width=\"30%\" height=\"100%\" src=\""+chatRoomLink+"\"/>");
+        out.println("<iframe width=\"30%\" height=\"100%\" src=\"" + chatRoomLink + "\"/>");
     }
 
     public void setOrientation(String orientation) {
diff --git a/gemeinsamforschen/src/test/java/unipotsdam/gf/core/database/InMemoryMySqlConnect.java b/gemeinsamforschen/src/test/java/unipotsdam/gf/core/database/InMemoryMySqlConnect.java
new file mode 100644
index 00000000..9fb25b23
--- /dev/null
+++ b/gemeinsamforschen/src/test/java/unipotsdam/gf/core/database/InMemoryMySqlConnect.java
@@ -0,0 +1,51 @@
+package unipotsdam.gf.core.database;
+
+import ch.vorburger.exec.ManagedProcessException;
+import ch.vorburger.mariadb4j.DB;
+import ch.vorburger.mariadb4j.DBConfigurationBuilder;
+import org.apache.commons.dbutils.DbUtils;
+import unipotsdam.gf.core.database.mysql.MysqlConnect;
+
+import java.sql.Connection;
+import java.sql.DriverManager;
+import java.sql.SQLException;
+import java.util.Objects;
+
+public class InMemoryMySqlConnect extends MysqlConnect {
+
+    public InMemoryMySqlConnect() {
+        connect();
+    }
+
+    private Connection getDatabaseConnection() throws ManagedProcessException, SQLException {
+        DBConfigurationBuilder config = DBConfigurationBuilder.newBuilder();
+        config.setPort(0);
+        DB db = DB.newEmbeddedDB(config.build());
+
+        db.start();
+        db.source("database/fltrail.sql");
+
+        return DriverManager.getConnection(config.getURL("fltrail"));
+
+    }
+
+    @Override
+    public void connect() {
+        try {
+            if (Objects.isNull(conn)) {
+                conn = getDatabaseConnection();
+            }
+        } catch (SQLException | ManagedProcessException e) {
+            DbUtils.closeQuietly(conn);
+        }
+    }
+
+    @Override
+    public void close() {
+        // do nothing, because close shouldn't close inMemoryDatabase while tests are running, tearDown() replaces close in tests
+    }
+
+    public void tearDown() {
+        super.close();
+    }
+}
diff --git a/gemeinsamforschen/src/test/java/unipotsdam/gf/core/management/project/ProjectDAOTest.java b/gemeinsamforschen/src/test/java/unipotsdam/gf/core/management/project/ProjectDAOTest.java
new file mode 100644
index 00000000..17c2aaa4
--- /dev/null
+++ b/gemeinsamforschen/src/test/java/unipotsdam/gf/core/management/project/ProjectDAOTest.java
@@ -0,0 +1,25 @@
+package unipotsdam.gf.core.management.project;
+
+import org.junit.Before;
+import org.junit.Test;
+import unipotsdam.gf.core.database.InMemoryMySqlConnect;
+
+public class ProjectDAOTest {
+
+    private InMemoryMySqlConnect inMemoryMySqlConnect;
+
+    @Before
+    public void setUp() {
+        inMemoryMySqlConnect = new InMemoryMySqlConnect();
+    }
+
+    /**
+     * Test creating a user in the DB
+     */
+    @Test
+    public void testPersist() {
+        ProjectDAO projectDAO = new ProjectDAO(inMemoryMySqlConnect);
+        projectDAO.persist(new Project("Gemeinsam Forschen", "1235", true, "me", "keins"));
+
+    }
+}
diff --git a/gemeinsamforschen/src/test/java/unipotsdam/gf/core/management/user/UserDAOTest.java b/gemeinsamforschen/src/test/java/unipotsdam/gf/core/management/user/UserDAOTest.java
new file mode 100644
index 00000000..6ba930a9
--- /dev/null
+++ b/gemeinsamforschen/src/test/java/unipotsdam/gf/core/management/user/UserDAOTest.java
@@ -0,0 +1,95 @@
+package unipotsdam.gf.core.management.user;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import unipotsdam.gf.core.database.InMemoryMySqlConnect;
+import unipotsdam.gf.core.management.ManagementImpl;
+import unipotsdam.gf.core.management.project.Project;
+import unipotsdam.gf.util.TestHelper;
+
+import java.util.List;
+
+import static org.hamcrest.Matchers.hasSize;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertThat;
+import static org.junit.Assert.assertTrue;
+
+public class UserDAOTest {
+
+    private InMemoryMySqlConnect inMemoryMySqlConnect;
+
+    @Before
+    public void setUp() throws Exception {
+        inMemoryMySqlConnect = new InMemoryMySqlConnect();
+    }
+
+    @After
+    public void tearDown() throws Exception {
+        inMemoryMySqlConnect.tearDown();
+    }
+
+    @Test
+    public void testGetUsersByProjectId() {
+        ManagementImpl management = TestHelper.getManagementImpl(inMemoryMySqlConnect);
+
+        User user = new User("julian", "1234", "from@stuff.com", false);
+        management.create(user, new UserProfile());
+        assert management.exists(user);
+
+
+        Project project = new Project("Gemeinsam Forschen", "1235", true, "me", "keins");
+        management.create(project);
+        management.register(user, project, null);
+
+        assertTrue(management.exists(project));
+
+        User user2 = new User("julian2", "12345", "from2@stuff.com", true);
+        management.create(user2, new UserProfile());
+        management.register(user2, project, null);
+        assert management.exists(user2);
+
+        UserDAO userDAO = new UserDAO(inMemoryMySqlConnect);
+        List<User> users = userDAO.getUsersByProjectId(project.getId());
+        assert users != null;
+        assert !users.isEmpty();
+        assertThat(users, hasSize(2));
+    }
+
+    @Test
+    public void testExists() {
+        UserDAO userDAO = new UserDAO(inMemoryMySqlConnect);
+        User user = new User("julian", "1234", "from1123123123@stuff.com", true);
+        assert !userDAO.exists(user);
+    }
+
+    @Test
+    public void testPersist() {
+        UserDAO userDAO = new UserDAO(inMemoryMySqlConnect);
+        User user = new User("julian", "1234", "from@stuff.com", false);
+        userDAO.persist(user, new UserProfile());
+        assert userDAO.exists(user);
+    }
+
+    @Test
+    public void testUpdateUser() {
+        UserDAO userDAO = new UserDAO(inMemoryMySqlConnect);
+        User user = new User("julian", "1234", "testUpdateUser@stuff.com", true);
+        user.setToken("abc");
+        userDAO.persist(user, new UserProfile());
+        assertTrue(userDAO.exists(user));
+
+        user.setStudent(false);
+        userDAO.update(user);
+        assertTrue(userDAO.exists(user));
+        User managementUser = userDAO.getUserByToken(user.getToken());
+        assertEquals(user.getStudent(), managementUser.getStudent());
+    }
+
+    @Test
+    public void testDelete() {
+
+    }
+
+
+}
diff --git a/gemeinsamforschen/src/test/java/unipotsdam/gf/interfaces/ManagementTest.java b/gemeinsamforschen/src/test/java/unipotsdam/gf/interfaces/ManagementTest.java
index e087e61c..ff18fe4c 100644
--- a/gemeinsamforschen/src/test/java/unipotsdam/gf/interfaces/ManagementTest.java
+++ b/gemeinsamforschen/src/test/java/unipotsdam/gf/interfaces/ManagementTest.java
@@ -1,5 +1,6 @@
 package unipotsdam.gf.interfaces;
 
+import org.junit.Before;
 import org.junit.Test;
 import uk.co.jemos.podam.api.PodamFactory;
 import uk.co.jemos.podam.api.PodamFactoryImpl;
@@ -7,14 +8,10 @@ import unipotsdam.gf.core.management.ManagementImpl;
 import unipotsdam.gf.core.management.project.Project;
 import unipotsdam.gf.core.management.project.ProjectConfiguration;
 import unipotsdam.gf.core.management.user.User;
-import unipotsdam.gf.core.management.user.UserDAO;
 import unipotsdam.gf.core.management.user.UserProfile;
+import unipotsdam.gf.util.TestHelper;
 
-import java.util.List;
-
-import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertTrue;
 
 /**
  * Created by dehne on 01.06.2018.
@@ -23,52 +20,19 @@ import static org.junit.Assert.assertTrue;
 
 public class ManagementTest  {
 
-
     /**
      * Utility to creaty dummy data for students
      */
-    PodamFactory factory = new PodamFactoryImpl();
-
-
-    @Test
-    public void testDelete() {
-
-    }
-
-    /**
-     *  CREATE a user in the DB using the
-     */
-    @Test
-    public void testExists() {
-        ManagementImpl management = new ManagementImpl();
-        User user = new User("julian", "1234", "from1123123123@stuff.com", true);
-        assert !management.exists(user);
-    }
-
-    /**
-     *  CREATE a user in the DB using the
-     */
-    @Test
-    public void testCreate() {
-        ManagementImpl management = new ManagementImpl();
-        User user = new User("julian", "1234", "from@stuff.com", false);
-        management.create(user, new UserProfile());
-        assert management.exists(user);
-    }
-
-    /**
-     * Test creating a user in the DB
-     */
-    @Test
-    public void testCreate1() {
-        ManagementImpl management = new ManagementImpl();
-        management.create(new Project("Gemainsam Forschen", "1235", true, "me", "keins"));
+    private PodamFactory factory = new PodamFactoryImpl();
+    private ManagementImpl management;
 
+    @Before
+    public void setUp() throws Exception {
+        management = TestHelper.getManagementImpl();
     }
 
     @Test
     public void testRegister() {
-        ManagementImpl management = new ManagementImpl();
         User user = new User("julian", "1234", "from@stuff.com", true);
         management.create(user, new UserProfile());
         assert management.exists(user);
@@ -78,52 +42,11 @@ public class ManagementTest  {
         management.register(user, project, null);
     }
 
-    @Test
-    public void testUpdateUser() {
-        ManagementImpl management = new ManagementImpl();
-        UserDAO userDAO = new UserDAO();
-        User user = new User("julian", "1234", "testUpdateUser@stuff.com", true);
-        user.setToken("abc");
-        management.create(user, new UserProfile());
-        assertTrue(management.exists(user));
-
-        user.setStudent(false);
-        management.update(user);
-        assertTrue(management.exists(user));
-        User managementUser = userDAO.getUserByToken(user.getToken());
-        assertEquals(user.getStudent(), managementUser.getStudent());
-    }
-
-    @Test
-    public void testGetUsers() {
-        ManagementImpl management = new ManagementImpl();
-        User user = new User("julian", "1234", "from@stuff.com", false);
-        management.create(user, new UserProfile());
-        assert management.exists(user);
-
-        Project project = new Project("Gemainsam Forschen", "1235", true, "me", "keins");
-        management.create(project);
-        management.register(user, project, null);
-
-        assertTrue(management.exists(project));
-
-        User user2 = new User("julian2", "12345", "from2@stuff.com", true);
-        management.create(user2, new UserProfile());
-        assert management.exists(user2);
-
-        UserDAO userDAO = new UserDAO();
-        List<User> users = userDAO.getUsers(project);
-        assert users != null;
-        assert !users.isEmpty();
-
-    }
-
     @Test
     public void testProjectConfiguration() {
         ProjectConfiguration projectConfiguration = factory.manufacturePojo(ProjectConfiguration.class);
         Project project = factory.manufacturePojo(Project.class);
 
-        ManagementImpl management = new ManagementImpl();
         management.create(projectConfiguration, project);
 
         ProjectConfiguration projectConfiguration1 = management.getProjectConfiguration(project);
diff --git a/gemeinsamforschen/src/test/java/unipotsdam/gf/interfaces/PhaseTest.java b/gemeinsamforschen/src/test/java/unipotsdam/gf/interfaces/PhaseTest.java
index 9d59d39a..af263fb6 100644
--- a/gemeinsamforschen/src/test/java/unipotsdam/gf/interfaces/PhaseTest.java
+++ b/gemeinsamforschen/src/test/java/unipotsdam/gf/interfaces/PhaseTest.java
@@ -11,6 +11,8 @@ import unipotsdam.gf.core.management.project.Project;
 import unipotsdam.gf.core.management.user.User;
 import unipotsdam.gf.core.management.user.UserProfile;
 import unipotsdam.gf.core.states.ProjectPhase;
+import unipotsdam.gf.util.TestHelper;
+
 import javax.inject.Inject;
 
 public class PhaseTest {
@@ -27,7 +29,7 @@ public class PhaseTest {
 
     @BeforeClass
     public static void prepareProject() {
-        ManagementImpl management = new ManagementImpl();
+        ManagementImpl management = TestHelper.getManagementImpl();
         User user = new User("julian", "1234", "from@stuff.com", false);
         management.create(user, new UserProfile());
         assert management.exists(user);
diff --git a/gemeinsamforschen/src/test/java/unipotsdam/gf/util/TestHelper.java b/gemeinsamforschen/src/test/java/unipotsdam/gf/util/TestHelper.java
new file mode 100644
index 00000000..86683104
--- /dev/null
+++ b/gemeinsamforschen/src/test/java/unipotsdam/gf/util/TestHelper.java
@@ -0,0 +1,23 @@
+package unipotsdam.gf.util;
+
+import unipotsdam.gf.core.database.InMemoryMySqlConnect;
+import unipotsdam.gf.core.management.ManagementImpl;
+import unipotsdam.gf.core.management.group.GroupDAO;
+import unipotsdam.gf.core.management.project.ProjectDAO;
+import unipotsdam.gf.core.management.user.UserDAO;
+
+public class TestHelper {
+
+    public static ManagementImpl getManagementImpl() {
+        InMemoryMySqlConnect connect = new InMemoryMySqlConnect();
+        return getManagementImpl(connect);
+    }
+
+    public static ManagementImpl getManagementImpl(InMemoryMySqlConnect connect) {
+        UserDAO userDAO = new UserDAO(connect);
+        GroupDAO groupDAO = new GroupDAO(connect);
+        ProjectDAO projectDAO = new ProjectDAO(connect);
+
+        return new ManagementImpl(userDAO, groupDAO, projectDAO, connect);
+    }
+}
diff --git a/gemeinsamforschen/src/test/resources/database/fltrail.sql b/gemeinsamforschen/src/test/resources/database/fltrail.sql
index 22a07cbc..c11a8a42 100644
--- a/gemeinsamforschen/src/test/resources/database/fltrail.sql
+++ b/gemeinsamforschen/src/test/resources/database/fltrail.sql
@@ -44,7 +44,6 @@ CREATE TABLE if not exists `users` (
   `token`               varchar(800) NOT NULL,
   `rocketChatId`        varchar(400) NOT NULL,
   `rocketChatAuthToken` varchar(800) NOT NULL,
-  `isStudent`           TINYINT(1),
   UNIQUE (email)
 
 )
-- 
GitLab