From c9bed6ffc7a989d1e2661a190fdb55c8793cff92 Mon Sep 17 00:00:00 2001
From: srosse <none@none>
Date: Mon, 29 Jan 2018 14:07:52 +0100
Subject: [PATCH] OO-3271	: start assessment mode within lead time if in
 manual mode

---
 .../assessment/manager/AssessmentModeDAO.java |   9 +-
 .../manager/AssessmentModeManagerTest.java    | 182 ++++++++++++++++++
 2 files changed, 188 insertions(+), 3 deletions(-)

diff --git a/src/main/java/org/olat/course/assessment/manager/AssessmentModeDAO.java b/src/main/java/org/olat/course/assessment/manager/AssessmentModeDAO.java
index a4d75c41709..65dc42f3ce2 100644
--- a/src/main/java/org/olat/course/assessment/manager/AssessmentModeDAO.java
+++ b/src/main/java/org/olat/course/assessment/manager/AssessmentModeDAO.java
@@ -163,7 +163,8 @@ public class AssessmentModeDAO {
 		
 		StringBuilder sb = new StringBuilder();
 		sb.append("select mode from courseassessmentmode mode where ")
-		  .append(" (mode.beginWithLeadTime<=:now and mode.endWithFollowupTime>=:now and mode.manualBeginEnd=false)")
+		  .append(" (mode.beginWithLeadTime<=:now and mode.endWithFollowupTime>=:now")
+		  .append("   and (mode.manualBeginEnd=false or (mode.manualBeginEnd=true and mode.leadTime>0)))")
 		  .append(" or mode.statusString in ('").append(Status.leadtime.name()).append("','")
 		  .append(Status.assessment.name()).append("','").append(Status.followup.name()).append("')");
 
@@ -182,7 +183,8 @@ public class AssessmentModeDAO {
 		StringBuilder sb = new StringBuilder();
 		sb.append("select count(mode) from courseassessmentmode mode where ")
 		  .append(" mode.repositoryEntry.key=:repoKey and (")
-		  .append(" (mode.beginWithLeadTime<=:now and mode.endWithFollowupTime>=:now and mode.manualBeginEnd=false)")
+		  .append(" (mode.beginWithLeadTime<=:now and mode.endWithFollowupTime>=:now ")
+		  .append("   and (mode.manualBeginEnd=false or (mode.manualBeginEnd=true and mode.leadTime>0)))")
 		  .append(" or mode.statusString in ('").append(Status.leadtime.name()).append("','")
 		  .append(Status.assessment.name()).append("','").append(Status.followup.name()).append("'))");
 
@@ -203,7 +205,8 @@ public class AssessmentModeDAO {
 		StringBuilder sb = new StringBuilder();
 		sb.append("select mode from courseassessmentmode mode where ")
 		  .append(" mode.repositoryEntry.key=:repoKey and (")
-		  .append(" (mode.beginWithLeadTime<=:now and mode.endWithFollowupTime>=:now and mode.manualBeginEnd=false)")
+		  .append(" (mode.beginWithLeadTime<=:now and mode.endWithFollowupTime>=:now")
+		  .append("   and (mode.manualBeginEnd=false or (mode.manualBeginEnd=true and mode.leadTime>0)))")
 		  .append(" or mode.statusString in ('").append(Status.leadtime.name()).append("','")
 		  .append(Status.assessment.name()).append("','").append(Status.followup.name()).append("'))");
 
diff --git a/src/test/java/org/olat/course/assessment/manager/AssessmentModeManagerTest.java b/src/test/java/org/olat/course/assessment/manager/AssessmentModeManagerTest.java
index 8edfd78ec94..c951bf63a46 100644
--- a/src/test/java/org/olat/course/assessment/manager/AssessmentModeManagerTest.java
+++ b/src/test/java/org/olat/course/assessment/manager/AssessmentModeManagerTest.java
@@ -270,6 +270,142 @@ public class AssessmentModeManagerTest extends OlatTestCase {
 		Assert.assertTrue(currentModes.contains(mode));
 	}
 	
+	/**
+	 * Manual without lead time -> not in the current list
+	 */
+	@Test
+	public void loadCurrentAssessmentModes_manualNow() {
+		RepositoryEntry entry = JunitTestHelper.createAndPersistRepositoryEntry();
+		
+		//manual now
+		AssessmentMode mode = assessmentModeMgr.createAssessmentMode(entry);
+		mode.setName("Assessment to load");
+		Calendar cal = Calendar.getInstance();
+		cal.set(Calendar.SECOND, 0);
+		cal.set(Calendar.MILLISECOND, 0);
+		cal.add(Calendar.HOUR_OF_DAY, -1);
+		mode.setBegin(cal.getTime());
+		cal.add(Calendar.HOUR_OF_DAY, 2);
+		mode.setEnd(cal.getTime());
+		mode.setTargetAudience(Target.course);
+		mode.setManualBeginEnd(true);
+		mode = assessmentModeMgr.persist(mode);
+		dbInstance.commitAndCloseSession();
+		
+		//check
+		Date now = new Date();
+		List<AssessmentMode> currentModes = assessmentModeMgr.getAssessmentModes(now);
+		Assert.assertNotNull(currentModes);
+		Assert.assertFalse(currentModes.contains(mode));
+	}
+	
+	/**
+	 * Manual with lead time -> in the current list
+	 */
+	@Test
+	public void loadCurrentAssessmentModes_manualNowLeadingTime() {
+		RepositoryEntry entry = JunitTestHelper.createAndPersistRepositoryEntry();
+		
+		//manual now
+		AssessmentMode mode = assessmentModeMgr.createAssessmentMode(entry);
+		mode.setName("Assessment to load");
+		Calendar cal = Calendar.getInstance();
+		cal.set(Calendar.SECOND, 0);
+		cal.set(Calendar.MILLISECOND, 0);
+		cal.add(Calendar.HOUR_OF_DAY, 1);
+		mode.setBegin(cal.getTime());
+		cal.add(Calendar.HOUR_OF_DAY, 2);
+		mode.setEnd(cal.getTime());
+		mode.setTargetAudience(Target.course);
+		mode.setManualBeginEnd(true);
+		mode.setLeadTime(120);
+		mode = assessmentModeMgr.persist(mode);
+		dbInstance.commitAndCloseSession();
+		
+		//check
+		Date now = new Date();
+		List<AssessmentMode> currentModes = assessmentModeMgr.getAssessmentModes(now);
+		Assert.assertNotNull(currentModes);
+		Assert.assertTrue(currentModes.contains(mode));
+	}
+	
+	@Test
+	public void getCurrentAssessmentMode() {
+		RepositoryEntry entry = JunitTestHelper.createAndPersistRepositoryEntry();
+		AssessmentMode mode = createMinimalAssessmentmode(entry);
+		mode = assessmentModeMgr.persist(mode);
+		dbInstance.commitAndCloseSession();
+		Assert.assertNotNull(mode);
+		
+		//check
+		Date now = new Date();
+		List<AssessmentMode> currentModes = assessmentModeMgr.getCurrentAssessmentMode(entry, now);
+		Assert.assertNotNull(currentModes);
+		Assert.assertEquals(1, currentModes.size());
+		Assert.assertTrue(currentModes.contains(mode));
+	}
+	
+	/**
+	 * Manual without lead time -> not in the current list
+	 */
+	@Test
+	public void getCurrentAssessmentMode_manualNow() {
+		RepositoryEntry entry = JunitTestHelper.createAndPersistRepositoryEntry();
+		
+		//manual now
+		AssessmentMode mode = assessmentModeMgr.createAssessmentMode(entry);
+		mode.setName("Assessment to load");
+		Calendar cal = Calendar.getInstance();
+		cal.set(Calendar.SECOND, 0);
+		cal.set(Calendar.MILLISECOND, 0);
+		cal.add(Calendar.HOUR_OF_DAY, -1);
+		mode.setBegin(cal.getTime());
+		cal.add(Calendar.HOUR_OF_DAY, 2);
+		mode.setEnd(cal.getTime());
+		mode.setTargetAudience(Target.course);
+		mode.setManualBeginEnd(true);
+		mode = assessmentModeMgr.persist(mode);
+		dbInstance.commitAndCloseSession();
+		
+		//check
+		Date now = new Date();
+		List<AssessmentMode> currentModes = assessmentModeMgr.getCurrentAssessmentMode(entry, now);
+		Assert.assertNotNull(currentModes);
+		Assert.assertTrue(currentModes.isEmpty());
+	}
+	
+	/**
+	 * Manual with lead time -> in the current list
+	 */
+	@Test
+	public void getCurrentAssessmentMode_manualNowLeadingTime() {
+		RepositoryEntry entry = JunitTestHelper.createAndPersistRepositoryEntry();
+		
+		//manual now
+		AssessmentMode mode = assessmentModeMgr.createAssessmentMode(entry);
+		mode.setName("Assessment to load");
+		Calendar cal = Calendar.getInstance();
+		cal.set(Calendar.SECOND, 0);
+		cal.set(Calendar.MILLISECOND, 0);
+		cal.add(Calendar.HOUR_OF_DAY, 1);
+		mode.setBegin(cal.getTime());
+		cal.add(Calendar.HOUR_OF_DAY, 2);
+		mode.setEnd(cal.getTime());
+		mode.setTargetAudience(Target.course);
+		mode.setManualBeginEnd(true);
+		mode.setLeadTime(120);
+		mode = assessmentModeMgr.persist(mode);
+		dbInstance.commitAndCloseSession();
+		
+		//check
+		Date now = new Date();
+		List<AssessmentMode> currentModes = assessmentModeMgr.getCurrentAssessmentMode(entry, now);
+		Assert.assertNotNull(currentModes);
+		Assert.assertEquals(1, currentModes.size());
+		Assert.assertTrue(currentModes.contains(mode));
+	}
+	
+	
 	@Test
 	public void isInAssessmentMode() {
 		RepositoryEntry entry = JunitTestHelper.createAndPersistRepositoryEntry();
@@ -297,6 +433,52 @@ public class AssessmentModeManagerTest extends OlatTestCase {
 		Assert.assertFalse(entryReferencePast);
 	}
 	
+	/**
+	 * Manual without leading time -> not in assessment mode
+	 */
+	@Test
+	public void isInAssessmentMode_manual() {
+		RepositoryEntry entry = JunitTestHelper.createAndPersistRepositoryEntry();
+		AssessmentMode mode = createMinimalAssessmentmode(entry);
+		mode.setManualBeginEnd(true);
+		mode = assessmentModeMgr.persist(mode);
+		dbInstance.commitAndCloseSession();
+		Assert.assertNotNull(mode);
+		
+		//check
+		Date now = new Date();
+		boolean entryNow = assessmentModeMgr.isInAssessmentMode(entry, now);
+		Assert.assertFalse(entryNow);
+	}
+
+	/**
+	 * Manual with leading time -> in assessment mode
+	 */
+	@Test
+	public void isInAssessmentMode_manualLeadingTime() {
+		RepositoryEntry entry = JunitTestHelper.createAndPersistRepositoryEntry();
+		AssessmentMode mode = assessmentModeMgr.createAssessmentMode(entry);
+		mode.setName("Assessment to load");
+		Calendar cal = Calendar.getInstance();
+		cal.set(Calendar.SECOND, 0);
+		cal.set(Calendar.MILLISECOND, 0);
+		cal.add(Calendar.HOUR_OF_DAY, 1);
+		mode.setBegin(cal.getTime());
+		cal.add(Calendar.HOUR_OF_DAY, 2);
+		mode.setEnd(cal.getTime());
+		mode.setTargetAudience(Target.course);
+		mode.setManualBeginEnd(true);
+		mode.setLeadTime(120);
+		mode = assessmentModeMgr.persist(mode);
+		dbInstance.commitAndCloseSession();
+		
+		//check
+		Date now = new Date();
+		boolean entryNow = assessmentModeMgr.isInAssessmentMode(entry, now);
+		Assert.assertTrue(entryNow);
+	}
+	
+	
 	/**
 	 * Check an assessment linked to a group with one participant
 	 * 
-- 
GitLab