diff --git a/core/src/test/java/se/su/dsv/scipro/project/split/SplitOrRestartProjectServiceIntegrationTest.java b/core/src/test/java/se/su/dsv/scipro/project/split/SplitOrRestartProjectServiceIntegrationTest.java index a7dec54c80..f9866d2efb 100644 --- a/core/src/test/java/se/su/dsv/scipro/project/split/SplitOrRestartProjectServiceIntegrationTest.java +++ b/core/src/test/java/se/su/dsv/scipro/project/split/SplitOrRestartProjectServiceIntegrationTest.java @@ -1,16 +1,28 @@ package se.su.dsv.scipro.project.split; import jakarta.inject.Inject; -import org.junit.jupiter.api.Test; import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import se.su.dsv.scipro.file.FileUpload; import se.su.dsv.scipro.project.Project; import se.su.dsv.scipro.project.ProjectStatus; +import se.su.dsv.scipro.reviewing.ReviewerAssignmentService; +import se.su.dsv.scipro.reviewing.RoughDraftApproval; +import se.su.dsv.scipro.reviewing.RoughDraftApprovalService; +import se.su.dsv.scipro.security.auth.roles.Roles; import se.su.dsv.scipro.system.DegreeType; import se.su.dsv.scipro.system.ProjectType; +import se.su.dsv.scipro.system.ResearchArea; import se.su.dsv.scipro.system.User; import se.su.dsv.scipro.test.IntegrationTest; +import java.io.InputStream; import java.time.LocalDate; +import java.util.HashSet; +import java.util.List; +import java.util.Optional; +import java.util.Set; +import java.util.function.Function; import static org.junit.Assert.assertTrue; import static se.su.dsv.scipro.project.split.SplitOrRestartProjectService.SplittableStatus; @@ -20,6 +32,13 @@ public class SplitOrRestartProjectServiceIntegrationTest extends IntegrationTest @Inject private SplitOrRestartProjectService sorpService; + @Inject + private RoughDraftApprovalService rdaService; + + @Inject + private ReviewerAssignmentService raService; + + private ResearchArea researchArea; private Project parentProject; private User supervisor; private User reviwer; @@ -28,15 +47,13 @@ public class SplitOrRestartProjectServiceIntegrationTest extends IntegrationTest @BeforeEach public void setUp() { - ProjectType bachelor = createProjectType(); - this.parentProject = createProject(bachelor, ProjectStatus.ACTIVE); - /* - user = createUser(); - Unit unit = new Unit(); - unit.setTitle("DSV IT"); - user.setUnit(save(unit)); + ProjectType bachelor = save (new ProjectType(DegreeType.BACHELOR, "Bachelor", "Bachelor")); - */ + researchArea = new ResearchArea(); + researchArea.setTitle("Computer Science"); + researchArea = save(researchArea); + + parentProject = createProject(bachelor, ProjectStatus.ACTIVE); } @Test @@ -58,31 +75,128 @@ public class SplitOrRestartProjectServiceIntegrationTest extends IntegrationTest assertTrue(status == SplittableStatus.NOT_ACTIVE); } + @Test + public void project_must_have_two_participants() { + SplittableStatusRecord record = sorpService.getSplittableStatus(parentProject.getId()); + SplittableStatus status = record.splittableStatus(); - - private ProjectType createProjectType() { - ProjectType projectType = new ProjectType(DegreeType.BACHELOR, "Bachelor", "Bachelor"); - save(projectType); - return projectType; + assertTrue(status == SplittableStatus.NOT_TWO_PARTICIPANTS); } + @Test + public void project_phase_two_started() { + setUpBeforePhaseTwo(); + + SplittableStatusRecord record = sorpService.getSplittableStatus(parentProject.getId()); + SplittableStatus status = record.splittableStatus(); + + assertTrue(status == SplittableStatus.PHASE_TWO_STARTED); + } + + @Test + public void split_on_failed_phase_two() { + setUpBeforePhaseTwo(); + + Optional<RoughDraftApproval> optional = this.rdaService.findBy(parentProject); + optional.ifPresent(rda -> rda.reject("Fail", Optional.empty())); + + SplittableStatusRecord record = sorpService.getSplittableStatus(parentProject.getId()); + SplittableStatus status = record.splittableStatus(); + + assertTrue(status == SplittableStatus.OK); + + sorpService.splitProject(parentProject.getId()); + List<Project> childProjects = sorpService.getChildProjects(parentProject.getId()); + + assertTrue(parentProject.getProjectStatus() == ProjectStatus.INACTIVE); + assertTrue(childProjects.size() == 2); + childProjects.forEach(project -> { + assertTrue(project.getProjectParticipants().size() == 1); + assertTrue(project.getHeadSupervisor().equals(supervisor)); + assertTrue(project.getProjectStatus() == ProjectStatus.ACTIVE); + }); + } + + /* + PHASE_TWO_STARTED, + FINAL_SEMINAR_PHASE_STARTED, + OK, + */ + private Project createProject(ProjectType projectType, ProjectStatus active) { - User headSupervisor = save( - User.builder().firstName("John").lastName("Doe").emailAddress("john@example.com").build() - ); + supervisor = createEmployee("Eric", "Employee", "eric@example.com", false); + Project project = new Project(); project.setTitle("Some title"); project.setProjectType(projectType); project.setProjectStatus(active); - project.setHeadSupervisor(headSupervisor); + project.setHeadSupervisor(supervisor); project.setStartDate(LocalDate.now()); + + author1 = createUser("Adam", "Student", "adam.student@example.com"); + project.addProjectParticipant(author1); + project = save(project); - System.out.println(project); return project; } - private User createUser() { - User user = User.builder().firstName("Bob").lastName("Sponge").emailAddress("bob@example.com").build(); + private User createEmployee(String firstName, String lastName, String email, boolean isReviewer) { + User employee = createUser(firstName, lastName, email); + + Set<ResearchArea> researchAreas = new HashSet<>(); + researchAreas.add(researchArea); + employee.setResearchAreas(researchAreas); + + if (isReviewer) { + employee.addRole(Roles.REVIEWER); + } + + save(employee); + return employee; + } + + private User createUser(String firstName, String lastName, String email) { + User user = User.builder().firstName(firstName).lastName(lastName).emailAddress(email).build(); return save(user); } + + private void setUpBeforePhaseTwo() { + author2 = createUser("Bertil", "Student", "bertil.student@example.com"); + parentProject.addProjectParticipant(author2); + save(parentProject); + + rdaService.requestApproval(parentProject, dummyFile(), "comment"); + + reviwer = createEmployee("Lisa", "Employee", "lisa.employee@example.com", true); + ReviewerAssignmentService.ReviewerAssignment reviewerAssignment = raService.assignReviewer(parentProject, reviwer); + } + + private FileUpload dummyFile() { + return new FileUpload() { + @Override + public String getFileName() { + return "dummy.tmp"; + } + + @Override + public String getContentType() { + return "text/plain"; + } + + @Override + public User getUploader() { + return null; + } + + @Override + public long getSize() { + return 0; + } + + @Override + public <T> T handleData(Function<InputStream, T> handler) { + return handler.apply(InputStream.nullInputStream()); + } + }; + } }