/** * OLAT - Online Learning and Training<br> * http://www.olat.org * <p> * Licensed under the Apache License, Version 2.0 (the "License"); <br> * you may not use this file except in compliance with the License.<br> * You may obtain a copy of the License at * <p> * http://www.apache.org/licenses/LICENSE-2.0 * <p> * Unless required by applicable law or agreed to in writing,<br> * software distributed under the License is distributed on an "AS IS" BASIS, <br> * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. <br> * See the License for the specific language governing permissions and <br> * limitations under the License. * <p> * Copyright (c) since 2004 at Multimedia- & E-Learning Services (MELS),<br> * University of Zurich, Switzerland. * <hr> * <a href="http://www.openolat.org"> * OpenOLAT - Online Learning and Training</a><br> * This file has been modified by the OpenOLAT community. Changes are licensed * under the Apache 2.0 license as the original file. * <p> */ package org.olat.course.nodes.projectbroker; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNull; import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; import java.util.ArrayList; import java.util.Calendar; import java.util.Date; import java.util.List; import java.util.Locale; import java.util.UUID; import org.junit.Assert; import org.junit.Before; import org.junit.Test; import org.olat.basesecurity.SecurityGroupImpl; import org.olat.core.CoreSpringFactory; import org.olat.core.commons.persistence.DBFactory; import org.olat.core.gui.translator.Translator; import org.olat.core.id.Identity; import org.olat.core.util.Util; import org.olat.course.nodes.projectbroker.datamodel.Project; import org.olat.course.nodes.projectbroker.datamodel.ProjectBroker; import org.olat.course.nodes.projectbroker.datamodel.ProjectEvent; import org.olat.course.nodes.projectbroker.service.ProjectBrokerManager; import org.olat.course.nodes.projectbroker.service.ProjectBrokerModuleConfiguration; import org.olat.course.nodes.projectbroker.service.ProjectGroupManager; import org.olat.group.BusinessGroup; import org.olat.group.BusinessGroupImpl; import org.olat.group.BusinessGroupService; import org.olat.modules.ModuleConfiguration; import org.olat.repository.RepositoryEntry; import org.olat.test.JunitTestHelper; import org.olat.test.OlatTestCase; import org.springframework.beans.factory.annotation.Autowired; /** * * @author Christian Guretzki */ public class ProjectBrokerManagerTest extends OlatTestCase { private static Identity id1 = null; private static Identity id2 = null; private static Long resourceableId = null; @Autowired private ProjectGroupManager projectGroupManager; @Autowired private ProjectBrokerManager projectBrokerManager; /** * @see junit.framework.TestCase#setUp() */ @Before public void setup() throws Exception { System.out.println("ProjectBrokerManagerTest.setUp start..."); try { id1 = JunitTestHelper.createAndPersistIdentityAsUser("project-id1-" + UUID.randomUUID().toString()); id2 = JunitTestHelper.createAndPersistIdentityAsUser("project-id2-" + UUID.randomUUID().toString()); if (resourceableId == null) { Identity author = JunitTestHelper.createAndPersistIdentityAsUser("project-auth-" + UUID.randomUUID().toString()); RepositoryEntry repositoryEntry = JunitTestHelper.deployDemoCourse(author); resourceableId = repositoryEntry.getOlatResource().getResourceableId(); System.out.println("Demo course imported - resourceableId: " + resourceableId); } DBFactory.getInstance().closeSession(); System.out.println("ProjectBrokerManagerTest.setUp finished"); } catch (Exception e) { System.out.println("ProjectBrokerManagerTest.setUp Exception=" + e.getMessage()); e.printStackTrace(); fail(e.getMessage()); } } /** * */ @Test public void testCreateListDeleteProjects() throws Exception { System.out.println("testCreateListDeleteProjects: start..."); // create ProjectBroker A + B ProjectBroker projectBrokerA = projectBrokerManager.createAndSaveProjectBroker(); Long idProjectBrokerA = projectBrokerA.getKey(); ProjectBroker projectBrokerB = projectBrokerManager.createAndSaveProjectBroker(); Long idProjectBrokerB = projectBrokerB.getKey(); // add project to ProjectBroker A createProject("thema A1", id1, idProjectBrokerA, resourceableId ); createProject("thema A2", id1, idProjectBrokerA, resourceableId ); // add project to ProjectBroker B createProject("thema B1", id1, idProjectBrokerB, resourceableId ); createProject("thema B2", id1, idProjectBrokerB, resourceableId ); DBFactory.getInstance().closeSession(); // get project list and check content List<Project> projectListA = projectBrokerManager.getProjectListBy(idProjectBrokerA); assertEquals("Wrong projectList.size for project-broker A",2, projectListA.size()); assertTrue("Wrong thema in project list A, title must start with 'thema A'", projectListA.get(0).getTitle().startsWith("thema A")); assertTrue("Wrong thema in project list A, title must start with 'thema A'", projectListA.get(1).getTitle().startsWith("thema A")); List<Project> projectListB = projectBrokerManager.getProjectListBy(idProjectBrokerB); assertEquals("Wrong projectList.size for project-broker B",2, projectListB.size()); assertTrue("Wrong thema in project list B, title must start with 'thema B'", projectListB.get(0).getTitle().startsWith("thema B")); assertTrue("Wrong thema in project list B, title must start with 'thema B'", projectListB.get(1).getTitle().startsWith("thema B")); if (projectListA.get(0).getTitle().equals("thema A1")) { assertTrue("Wrong thema in project list A, title must be 'thema A2'", projectListA.get(1).getTitle().equals("thema A2")); } else if (projectListA.get(0).getTitle().equals("thema A2")) { assertTrue("Wrong thema in project list A, title must be 'thema A1'", projectListA.get(1).getTitle().equals("thema A1")); } if (projectListB.get(0).getTitle().equals("thema B1")) { assertTrue("Wrong thema in project list B, title must be 'thema B2'", projectListB.get(1).getTitle().equals("thema B2")); } else if (projectListB.get(0).getTitle().equals("thema B2")) { assertTrue("Wrong thema in project list B, title must be 'thema B1'", projectListB.get(1).getTitle().equals("thema B1")); } // delete project long candiadteGroupKey = projectListA.get(0).getCandidateGroup().getKey(); long projectGroupKey = projectListA.get(0).getProjectGroup().getKey(); assertNotNull("CandidateGroup does not exist before delete project", DBFactory.getInstance().findObject(SecurityGroupImpl.class, candiadteGroupKey)); assertNotNull("ProjectGroup does not exist before delete project", DBFactory.getInstance().findObject(BusinessGroupImpl.class, projectGroupKey)); projectBrokerManager.deleteProject(projectListA.get(0), true, null, null); assertNull("CandidateGroup still exists after delete project", DBFactory.getInstance().findObject(SecurityGroupImpl.class, candiadteGroupKey)); assertNull("ProjectGroup still exists after delete project", DBFactory.getInstance().findObject(BusinessGroupImpl.class, projectGroupKey)); // get project list and check content projectListA = projectBrokerManager.getProjectListBy(idProjectBrokerA); projectListB = projectBrokerManager.getProjectListBy(idProjectBrokerB); assertEquals("Wrong projectList.size for project-broker A after delete 'thema A1'",1, projectListA.size()); assertEquals("Wrong projectList.size for project-broker B after delete 'thema A1'",2, projectListB.size()); // delete project projectBrokerManager.deleteProject(projectListB.get(1), true, null, null); // get project list and check content projectListA = projectBrokerManager.getProjectListBy(idProjectBrokerA); projectListB = projectBrokerManager.getProjectListBy(idProjectBrokerB); assertEquals("Wrong projectList.size for project-broker A after delete 'thema B2'",1, projectListA.size()); assertEquals("Wrong projectList.size for project-broker B after delete 'thema B2'",1, projectListB.size()); // delete project projectBrokerManager.deleteProject(projectListA.get(0), true, null, null); projectListA = projectBrokerManager.getProjectListBy(idProjectBrokerA); projectListB = projectBrokerManager.getProjectListBy(idProjectBrokerB); System.out.println("testCreateListDeleteProjects: projectListA=" + projectListA); assertEquals("Wrong projectList.size for project-broker A after delete all thema",0, projectListA.size()); assertEquals("Wrong projectList.size for project-broker B after delete all thema",1, projectListB.size()); // cleanup System.out.println("testCreateListDeleteProjects: done"); } @Test public void testPerformanceGetProjectList() throws Exception { System.out.println("testPerformanceGetProjectList: start..."); int FIRST_ITERATION = 10; int SECOND_ITERATION = 90; int THIRD_ITERATION = 400; // create ProjectBroker C ProjectBroker projectBrokerC = projectBrokerManager.createAndSaveProjectBroker(); Long idProjectBrokerC = projectBrokerC.getKey(); DBFactory.getInstance().closeSession(); for (int i = 0; i < FIRST_ITERATION; i++) { createProject("thema C1_" + i, id1, idProjectBrokerC, resourceableId ); } DBFactory.getInstance().closeSession(); long startTime = System.currentTimeMillis(); List<Project> projectListC = projectBrokerManager.getProjectListBy(idProjectBrokerC); long endTime = System.currentTimeMillis(); assertEquals("Wrong projectList.size for project-broker C after first iteration",FIRST_ITERATION, projectListC.size()); long duration = endTime - startTime; System.out.println("getProjectListBy takes " + duration + "ms with " + FIRST_ITERATION + " projects"); for (int i = 0; i < SECOND_ITERATION; i++) { createProject("thema C1_" + i, id1, idProjectBrokerC, resourceableId ); } DBFactory.getInstance().closeSession(); startTime = System.currentTimeMillis(); projectListC = projectBrokerManager.getProjectListBy(idProjectBrokerC); endTime = System.currentTimeMillis(); int numberOfProjects = FIRST_ITERATION + SECOND_ITERATION; assertEquals("Wrong projectList.size for project-broker C", numberOfProjects, projectListC.size()); duration = endTime - startTime; System.out.println("getProjectListBy takes " + duration + "ms with " + numberOfProjects + " projects"); for (int i = 0; i < THIRD_ITERATION; i++) { createProject("thema C1_" + i, id1, idProjectBrokerC, resourceableId ); } DBFactory.getInstance().closeSession(); startTime = System.currentTimeMillis(); projectListC = projectBrokerManager.getProjectListBy(idProjectBrokerC); endTime = System.currentTimeMillis(); numberOfProjects = FIRST_ITERATION + SECOND_ITERATION + THIRD_ITERATION; assertEquals("Wrong projectList.size for project-broker C", numberOfProjects, projectListC.size()); duration = endTime - startTime; System.out.println("getProjectListBy takes " + duration + "ms with " + numberOfProjects + " projects"); // cleanup System.out.println("testPerformance: done"); } @Test public void testPerformanceTableModel() throws Exception { int ITERATION = 300; int START_PAGE_INDEX = 100; int PAGE_SIZE = 20; Translator translator = Util.createPackageTranslator(this.getClass(), Locale.GERMAN); ProjectBroker projectBrokerD = projectBrokerManager.createAndSaveProjectBroker(); Long idProjectBrokerD = projectBrokerD.getKey(); ProjectBrokerModuleConfiguration moduleConfig = new ProjectBrokerModuleConfiguration( new ModuleConfiguration() ); for (int i = 0; i < ITERATION; i++) { createProject("thema D1_" + i, id1, idProjectBrokerD, resourceableId ); } List<Project> projectListD = projectBrokerManager.getProjectListBy(idProjectBrokerD); ProjectListTableModel tableModel = new ProjectListTableModel(projectListD, id1, translator, moduleConfig, 0, 0, 0, false); // loop over table like rendering loop long startTime = System.currentTimeMillis(); for (int row = START_PAGE_INDEX; row < START_PAGE_INDEX+PAGE_SIZE; row++) { for (int col = 0; col < tableModel.getColumnCount(); col++) { Object element = tableModel.getValueAt(row, col); Assert.assertNotNull(element); } } long endTime = System.currentTimeMillis(); long duration = endTime - startTime; System.out.println("tableModel.getValueAt(row, col) for " + PAGE_SIZE + "elements (of " + ITERATION + ") takes " + duration + "ms with " + ITERATION + " projects"); // cleanup } @Test public void testIsProjectManager() throws Exception { ProjectBroker projectBrokerD = projectBrokerManager.createAndSaveProjectBroker(); Long idProjectBrokerD = projectBrokerD.getKey(); Project testProjectA = createProject("thema A", id1, idProjectBrokerD, resourceableId ); List<Identity> projectManagerList = new ArrayList<Identity>(); projectManagerList.add(id1); Project testProjectB = createProject("thema B", id2, idProjectBrokerD, resourceableId ); // check project leader in ProjectA assertTrue("Must be project-leader of project A", projectGroupManager.isProjectManager(id1, testProjectA)); assertFalse("Can not be project leader of project B",projectGroupManager.isProjectManager(id1, testProjectB)); assertTrue("Must be project-leader of project A", projectGroupManager.isProjectManager(id2, testProjectB)); CoreSpringFactory.getImpl(BusinessGroupService.class).removeOwners(id1, projectManagerList, testProjectA.getProjectGroup()); // check no project leader anymore assertFalse("Can not be project leader of project A",projectGroupManager.isProjectManager(id1, testProjectA)); assertFalse("Can not be project leader of project B",projectGroupManager.isProjectManager(id1, testProjectB)); // cleanup } @Test public void testExistsProject() throws Exception { // 1. test project does not exists assertFalse("Wrong return value true, project does not exist", projectBrokerManager.existsProject(39927492743L)); // 2. test project exists ProjectBroker projectBrokerD = projectBrokerManager.createAndSaveProjectBroker(); Long idProjectBrokerD = projectBrokerD.getKey(); Project testProjectA = createProject("thema existsProject-Test", id1, idProjectBrokerD, resourceableId ); DBFactory.getInstance().closeSession(); assertTrue("Wrong return value false, project exists", projectBrokerManager.existsProject(testProjectA.getKey())); } @Test public void testUpdateProject() throws Exception { ProjectBroker projectBroker = projectBrokerManager.createAndSaveProjectBroker(); Long idProjectBroker = projectBroker.getKey(); Project testProjectA = createProject("updateTest", id1, idProjectBroker, resourceableId ); DBFactory.getInstance().closeSession(); // testProjectA is now a detached-object // Update 1 String updateTitle = "thema updateProject-Test update1"; testProjectA.setTitle(updateTitle); String updateDescription = "description update1"; testProjectA.setDescription(updateDescription); String updateState = "state update1"; testProjectA.setState(updateState); projectBrokerManager.updateProject(testProjectA); DBFactory.getInstance().closeSession(); // testProjectA is now a detached-object again Project reloadedProject = (Project) DBFactory.getInstance().loadObject(testProjectA, true); assertEquals("Wrong updated title 1",updateTitle,reloadedProject.getTitle()); // Update 2 String updateTitle2 = "thema updateProject-Test update2"; testProjectA.setTitle(updateTitle2); int updateMaxMembers = 3; testProjectA.setMaxMembers(updateMaxMembers); String updateAttachmentFileName = "attachmentFile.txt"; testProjectA.setAttachedFileName(updateAttachmentFileName); boolean updateMailNotification = Boolean.TRUE; testProjectA.setMailNotificationEnabled(updateMailNotification); String updateCustomField0 = "CustomField0"; testProjectA.setCustomFieldValue(0, updateCustomField0); String updateCustomField1 = "CustomField1"; testProjectA.setCustomFieldValue(1, updateCustomField1); projectBrokerManager.updateProject(testProjectA); DBFactory.getInstance().closeSession(); // Update 3 Calendar cal = Calendar.getInstance(); cal.clear(); cal.set(2010, 11, 15, 15, 30, 45); Date startDate = cal.getTime(); cal.clear(); cal.set(2010, 11, 20, 15, 30, 45); Date endDate = cal.getTime(); ProjectEvent projectEventEnroll = new ProjectEvent(Project.EventType.ENROLLMENT_EVENT, startDate, endDate); testProjectA.setProjectEvent(projectEventEnroll); ProjectEvent projectEventHandout = new ProjectEvent(Project.EventType.HANDOUT_EVENT, startDate, endDate); testProjectA.setProjectEvent(projectEventHandout); DBFactory.getInstance().closeSession(); reloadedProject = (Project) DBFactory.getInstance().loadObject(testProjectA, true); assertEquals("Wrong updated title 2",updateTitle2,reloadedProject.getTitle()); assertEquals("Wrong description",updateDescription,reloadedProject.getDescription()); assertEquals("Wrong state",updateState,reloadedProject.getState()); assertEquals("Wrong maxMembers",updateMaxMembers,reloadedProject.getMaxMembers()); assertEquals("Wrong AttachmentFileName",updateAttachmentFileName,reloadedProject.getAttachmentFileName()); assertEquals("Wrong MailNotification",updateMailNotification,reloadedProject.isMailNotificationEnabled()); assertEquals("Wrong CustomField 0",updateCustomField0,reloadedProject.getCustomFieldValue(0)); assertEquals("Wrong CustomField 1",updateCustomField1,reloadedProject.getCustomFieldValue(1)); assertEquals("Wrong customField Size",2,reloadedProject.getCustomFieldSize()); assertEquals("Wrong event Type (Handout)",Project.EventType.HANDOUT_EVENT,reloadedProject.getProjectEvent(Project.EventType.HANDOUT_EVENT).getEventType()); assertEquals("Wrong event start-date (Handout)",startDate.getTime(),reloadedProject.getProjectEvent(Project.EventType.HANDOUT_EVENT).getStartDate().getTime()); assertEquals("Wrong event end-date (Handout)",endDate.getTime(),reloadedProject.getProjectEvent(Project.EventType.HANDOUT_EVENT).getEndDate().getTime()); assertEquals("Wrong event Type (Enroll)",Project.EventType.ENROLLMENT_EVENT,reloadedProject.getProjectEvent(Project.EventType.ENROLLMENT_EVENT).getEventType()); assertEquals("Wrong event start-date (Enroll)",startDate.getTime(),reloadedProject.getProjectEvent(Project.EventType.ENROLLMENT_EVENT).getStartDate().getTime()); assertEquals("Wrong event end-date (Enroll)",endDate.getTime(),reloadedProject.getProjectEvent(Project.EventType.ENROLLMENT_EVENT).getEndDate().getTime()); } private Project createProject(String projectName, Identity creator, Long projectBrokerId, Long courseId) { BusinessGroup projectGroup = projectGroupManager.createProjectGroupFor(projectBrokerId, creator, projectName + "_Group", projectName + "GroupDescription", courseId); Project project = projectBrokerManager.createAndSaveProjectFor(projectName + "title", projectName + "description1", projectBrokerId, projectGroup); return project; } }