Skip to content
Snippets Groups Projects
Commit 76304b77 authored by Julian Dehne's avatar Julian Dehne
Browse files

feat: added functional tests for the backend components

parent 13e8164f
No related branches found
No related tags found
No related merge requests found
Showing
with 358 additions and 19 deletions
......@@ -171,7 +171,26 @@
<version>0.11.0</version>
</dependency>
<!-- state rules -->
<!-- https://mvnrepository.com/artifact/de.dev-eth0.dummycreator/dummy-creator -->
<!-- <dependency>
<groupId>de.dev-eth0.dummycreator</groupId>
<artifactId>dummy-creator</artifactId>
<version>1.2</version>
</dependency>-->
<!-- https://mvnrepository.com/artifact/org.mockito/mockito-all -->
<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-core</artifactId>
<version>2.19.0</version>
</dependency>
<dependency>
<groupId>uk.co.jemos.podam</groupId>
<artifactId>podam</artifactId>
<version>7.1.1.RELEASE</version>
</dependency>
</dependencies>
......
......@@ -12,8 +12,15 @@ import unipotsdam.gf.modules.journal.DummyJournalImpl;
import unipotsdam.gf.modules.journal.model.Journal;
import unipotsdam.gf.modules.journal.service.DummyJournalService;
import unipotsdam.gf.modules.peer2peerfeedback.DummyFeedback;
import unipotsdam.gf.modules.researchreport.DummyResearchReportManagement;
import unipotsdam.gf.modules.researchreport.ResearchReport;
import unipotsdam.gf.modules.researchreport.ResearchReportManagement;
public class GFApplicationBinder extends AbstractBinder {
/**
* TODO replace DummyImplementation
*/
@Override
protected void configure() {
bind(CommunicationDummyService.class).to(ICommunication.class);
......@@ -22,5 +29,7 @@ public class GFApplicationBinder extends AbstractBinder {
bind(DummyJournalImpl.class).to(IJournal.class);
bind(PeerAssessmentDummy.class).to(IPeerAssessment.class);
bind(PhasesImpl.class).to(IPhases.class);
bind(ManagementImpl.class).to(Management.class);
bind(DummyResearchReportManagement.class).to(ResearchReportManagement.class);
}
}
......@@ -2,6 +2,7 @@ package unipotsdam.gf.core.management;
import unipotsdam.gf.core.management.group.Group;
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.UserInterests;
import unipotsdam.gf.core.management.user.UserProfile;
......@@ -120,5 +121,9 @@ public interface Management {
void deleteGroupMember(User groupMember, int groupId);
List<Group> getGroupsByProjectId(String projectId);
void create(ProjectConfiguration projectConfiguration, Project project);
ProjectConfiguration getProjectConfiguration(Project project);
}
......@@ -4,6 +4,7 @@ import unipotsdam.gf.core.database.mysql.MysqlConnect;
import unipotsdam.gf.core.database.mysql.VereinfachtesResultSet;
import unipotsdam.gf.core.management.group.Group;
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.UserInterests;
import unipotsdam.gf.core.management.user.UserProfile;
......@@ -326,4 +327,9 @@ public class ManagementImpl implements Management {
return groups;
}
}
@Override
public void create(ProjectConfiguration projectConfiguration, Project project) {
// TODO implement
}
}
package unipotsdam.gf.core.management.project;
import unipotsdam.gf.core.states.ProjectPhase;
import unipotsdam.gf.modules.assessment.AssessmentMechanism;
import unipotsdam.gf.modules.groupfinding.GroupFormationMechanism;
import unipotsdam.gf.modules.peer2peerfeedback.Category;
import java.util.HashMap;
// TODO implement
public class ProjectConfiguration {
private HashMap<ProjectPhase, Boolean> phasesSelected;
private HashMap<Category, Boolean> criteriaSelected;
private HashMap<AssessmentMechanism, Boolean> assessmentMechanismSelected;
private HashMap<GroupFormationMechanism, Boolean> groupMechanismSelected;
public ProjectConfiguration(
HashMap<ProjectPhase, Boolean> phasesSelected, HashMap<Category, Boolean> criteriaSelected,
HashMap<AssessmentMechanism, Boolean> assessmentMechanismSelected,
HashMap<GroupFormationMechanism, Boolean> groupMechanismSelected) {
this.phasesSelected = phasesSelected;
this.criteriaSelected = criteriaSelected;
this.assessmentMechanismSelected = assessmentMechanismSelected;
this.groupMechanismSelected = groupMechanismSelected;
}
public HashMap<ProjectPhase, Boolean> getPhasesSelected() {
return phasesSelected;
}
public void setPhasesSelected(HashMap<ProjectPhase, Boolean> phasesSelected) {
this.phasesSelected = phasesSelected;
}
public HashMap<Category, Boolean> getCriteriaSelected() {
return criteriaSelected;
}
public void setCriteriaSelected(
HashMap<Category, Boolean> criteriaSelected) {
this.criteriaSelected = criteriaSelected;
}
public HashMap<AssessmentMechanism, Boolean> getAssessmentMechanismSelected() {
return assessmentMechanismSelected;
}
public void setAssessmentMechanismSelected(
HashMap<AssessmentMechanism, Boolean> assessmentMechanismSelected) {
this.assessmentMechanismSelected = assessmentMechanismSelected;
}
public HashMap<GroupFormationMechanism, Boolean> getGroupMechanismSelected() {
return groupMechanismSelected;
}
public void setGroupMechanismSelected(
HashMap<GroupFormationMechanism, Boolean> groupMechanismSelected) {
this.groupMechanismSelected = groupMechanismSelected;
}
}
......@@ -2,7 +2,8 @@ package unipotsdam.gf.interfaces;
import unipotsdam.gf.core.management.project.Project;
import unipotsdam.gf.core.management.user.User;
import unipotsdam.gf.modules.peer2peerfeedback.Peer2PeerFeedback;
import java.*;
import unipotsdam.gf.modules.researchreport.ResearchReport;
import java.io.File;
import java.util.ArrayList;
......@@ -27,12 +28,12 @@ public interface Feedback {
/**
* give Peer2PeerFeedback
*
* @param feedback: The Peer2PeerFeedback as an Object
* @param document: The selected document
* @param feedback : The Peer2PeerFeedback as an Object
* @param document : The selected document
* @return Send feedback with doc and return true, if the feedback is successfully sended
*/
Boolean giveFeedback(Peer2PeerFeedback feedback, File document);
Boolean giveFeedback(Peer2PeerFeedback feedback, ResearchReport document);
/**
* show Feedbackhistory
......@@ -59,5 +60,21 @@ public interface Feedback {
*/
Boolean checkFeedbackConstraints(Project project);
/**
* TODO implement a routine that assigns missing feedback tasks if someone drops out of a course
* @param project
*/
void assigningMissingFeedbackTasks(Project project);
/**
* TODO implement: Assigns each student in a project a feedback target
*/
void assignFeedbackTasks();
/**
* TODO implement: Get the research report you have to give feedback to
* @param student
* @return
*/
ResearchReport getFeedbackTask(User student);
}
package unipotsdam.gf.interfaces;
public interface ICourseCreation {
}
package unipotsdam.gf.modules.assessment;
public enum AssessmentMechanism {
AXEL_MECHANISM,
CHRISTIAN_MECHANISM,
COMBINATIONXY
}
package unipotsdam.gf.modules.groupfinding;
public enum GroupFormationMechanism {
Manual,
LearningGoalStrategy,
UserProfilStrategy
}
package unipotsdam.gf.modules.groupCreation.service;
package unipotsdam.gf.modules.groupfinding.service;
import unipotsdam.gf.core.management.Management;
import unipotsdam.gf.core.management.group.Group;
......
......@@ -3,6 +3,7 @@ package unipotsdam.gf.modules.peer2peerfeedback;
import unipotsdam.gf.core.management.project.Project;
import unipotsdam.gf.core.management.user.User;
import unipotsdam.gf.interfaces.Feedback;
import unipotsdam.gf.modules.researchreport.ResearchReport;
import java.io.File;
import java.util.ArrayList;
......@@ -15,7 +16,7 @@ public class DummyFeedback implements Feedback {
}
@Override
public Boolean giveFeedback(Peer2PeerFeedback feedback, File document) {
public Boolean giveFeedback(Peer2PeerFeedback feedback, ResearchReport document) {
return null;
}
......@@ -40,4 +41,9 @@ public class DummyFeedback implements Feedback {
public void assigningMissingFeedbackTasks(Project project) {
System.out.println("assigning fake tasks");
}
@Override
public void assignFeedbackTasks() {
}
}
package unipotsdam.gf.modules.researchreport;
import sun.reflect.generics.reflectiveObjects.NotImplementedException;
import unipotsdam.gf.core.management.user.User;
import java.io.File;
public class DummyResearchReportManagement implements ResearchReportManagement {
@Override
public String createResearchReport(ResearchReport researchReport, User student) {
throw new NotImplementedException();
}
@Override
public boolean updateResearchReport(ResearchReport researchReport) {
return false;
}
@Override
public boolean deleteReport(ResearchReport researchReport) {
return false;
}
@Override
public File getResearchReport(ResearchReport researchReport) {
return null;
}
}
......@@ -6,6 +6,7 @@ public class ResearchReport {
// TODO add properties
private String title;
private ResearchQuestion researchQuestion;
private List<String> learningGoals;
private String method;
private String research;
......
package unipotsdam.gf.modules.researchreport;
import unipotsdam.gf.modules.researchreport.ResearchReport;
import unipotsdam.gf.core.management.user.User;
import java.io.File;
......@@ -15,9 +15,10 @@ public interface ResearchReportManagement {
* Create a File
*
* @param researchReport Name of the Report
* @param student
* @return Returns the reportId
*/
String createResearchReport(ResearchReport researchReport);
String createResearchReport(ResearchReport researchReport, User student);
/**
......
......@@ -6,7 +6,7 @@
</Console>
</Appenders>
<Loggers>
<Root level="debug">
<Root level="INFO">
<AppenderRef ref="Console"/>
</Root>
</Loggers>
......
package unipotsdam.gf.interfaces;
import org.glassfish.hk2.api.ServiceLocator;
import org.glassfish.hk2.utilities.ServiceLocatorUtilities;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.junit.MockitoJUnit;
import org.mockito.junit.MockitoJUnitRunner;
import org.mockito.junit.MockitoRule;
import uk.co.jemos.podam.api.PodamFactory;
import uk.co.jemos.podam.api.PodamFactoryImpl;
import unipotsdam.gf.config.GFApplicationBinder;
import unipotsdam.gf.core.management.Management;
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.states.ProjectPhase;
import unipotsdam.gf.modules.assessment.AssessmentMechanism;
import unipotsdam.gf.modules.groupfinding.GroupFormationMechanism;
import unipotsdam.gf.modules.peer2peerfeedback.Category;
import unipotsdam.gf.modules.peer2peerfeedback.Peer2PeerFeedback;
import unipotsdam.gf.modules.researchreport.ResearchReport;
import unipotsdam.gf.modules.researchreport.ResearchReportManagement;
import javax.inject.Inject;
import java.util.ArrayList;
import java.util.HashMap;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
@RunWith(MockitoJUnitRunner.class)
public class ActivityFlowTest {
/**
* Utility to creaty dummy data for students
*/
PodamFactory factory = new PodamFactoryImpl();
@Inject
Management management;
@Inject
ResearchReportManagement researchReportManagement;
@Inject
Feedback feedback;
@Inject
IPhases phases;
private final Project project = factory.manufacturePojo(Project.class);
private final ArrayList<User> students = new ArrayList<>();
private final User teacher = factory.manufacturePojo(User.class);
@Rule
public MockitoRule mockitoRule = MockitoJUnit.rule();
@Before
public void setUp() {
final ServiceLocator locator = ServiceLocatorUtilities.bind(new GFApplicationBinder());
locator.inject(this);
}
@Test
public void activityPlayer() {
// register teacher
loginTeacher();
// create course
createCourse();
// register students
loginStudents();
// end first phase
phases.endPhase(ProjectPhase.CourseCreation, project);
// upload dossiers
uploadDossiers();
// end first phase
phases.endPhase(ProjectPhase.DossierFeedback, project);
// update reflections
uploadReflections();
// end execution phase
phases.endPhase(ProjectPhase.Execution, project);
}
public void loginTeacher() {
teacher.setStudent(false);
management.create(teacher, null);
}
public void loginStudents() {
for (int i=0;i<100;i++) {
User student = factory.manufacturePojo(User.class);
student.setStudent(true);
students.add(student);
management.create(student, null);
}
}
public void uploadReflections() {
// update single reflection
// answer quiz
//
}
public void uploadDossiers() {
for (User student : students) {
// persist dossiers
ResearchReport researchReport = factory.manufacturePojo(ResearchReport.class);
researchReportManagement.createResearchReport(researchReport, student);
}
// assert that after the last report has been submitted, the feedback tasks were assigned automatically
verify(feedback, times(1)).assignFeedbackTasks();
// students give feedback
for (User student : students) {
ResearchReport feedbackTask = feedback.getFeedbackTask(student);
ProjectConfiguration projectConfiguration = management.getProjectConfiguration(project);
HashMap<Category, Boolean> criteriaSelected = projectConfiguration.getCriteriaSelected();
for (Category category : criteriaSelected.keySet()) {
if (criteriaSelected.get(category)) {
Peer2PeerFeedback peer2PeerFeedback = factory.manufacturePojo(Peer2PeerFeedback.class);
peer2PeerFeedback.setFeedbackcategory(category);
feedback.giveFeedback(peer2PeerFeedback, feedbackTask);
}
}
}
// students upload updated dossier
// docent finishes phase
// student misses feedback -> reassignment
// feedback restarted
}
public void createCourse() {
// add Titel
Project project = new Project();
project.setId("testprojekt");
management.create(project);
// select criteria, topics, phases, assessment criteria
HashMap<ProjectPhase, Boolean> phasesSelected = new HashMap<>();
HashMap<Category, Boolean> criteriaSelected = new HashMap<>();
HashMap<AssessmentMechanism, Boolean> assessemtsSelected = new HashMap<>();
HashMap<GroupFormationMechanism, Boolean> groupFormationSelected = new HashMap<>();
ProjectConfiguration projectConfiguration = new ProjectConfiguration(phasesSelected, criteriaSelected,
assessemtsSelected, groupFormationSelected);
management.create(projectConfiguration, project);
//
}
}
package unipotsdam.gf.interfaces;
import org.glassfish.hk2.api.ServiceLocator;
import org.glassfish.hk2.utilities.Binder;
import org.glassfish.hk2.utilities.ServiceLocatorUtilities;
import org.glassfish.hk2.utilities.binding.AbstractBinder;
import org.glassfish.jersey.server.ResourceConfig;
import org.glassfish.jersey.test.JerseyTest;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;
import unipotsdam.gf.config.GFApplicationBinder;
import unipotsdam.gf.config.GFResourceConfig;
import unipotsdam.gf.core.management.ManagementImpl;
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.PhasesImpl;
import unipotsdam.gf.core.states.ProjectPhase;
import javax.inject.Inject;
import javax.ws.rs.core.Application;
public class PhaseTest {
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment