diff --git a/src/main/java/org/olat/ims/qti21/manager/AssessmentTestSessionDAO.java b/src/main/java/org/olat/ims/qti21/manager/AssessmentTestSessionDAO.java index 27a6c41049c74c536771ef47b46c62503303d7e5..4e1a9654dc226b5923136045a14c5176037c77dd 100644 --- a/src/main/java/org/olat/ims/qti21/manager/AssessmentTestSessionDAO.java +++ b/src/main/java/org/olat/ims/qti21/manager/AssessmentTestSessionDAO.java @@ -30,6 +30,7 @@ import java.util.stream.Collectors; import javax.persistence.TypedQuery; +import org.olat.basesecurity.Group; import org.olat.basesecurity.GroupRoles; import org.olat.basesecurity.IdentityRef; import org.olat.core.commons.persistence.DB; @@ -650,6 +651,9 @@ public class AssessmentTestSessionDAO { } /** + * The query only returns session with a valid finish time and which are not in + * author mode. + * * @param searchParams * @return The returned list is order by user name and test session key */ @@ -676,7 +680,7 @@ public class AssessmentTestSessionDAO { * @param sb * @param searchParams */ - protected static final void decorateTestSessionPermission(StringBuilder sb, QTI21StatisticSearchParams searchParams) { + private static final void decorateTestSessionPermission(StringBuilder sb, QTI21StatisticSearchParams searchParams) { sb.append(" where testSession.testEntry.key=:testEntryKey") .append(" and testSession.finishTime is not null and testSession.authorMode=false"); if(searchParams.getCourseEntry() != null || searchParams.getTestEntry() != null) { @@ -719,7 +723,7 @@ public class AssessmentTestSessionDAO { * @param sb * @param searchParams */ - protected static final void decorateTestSessionPermission(TypedQuery<?> query, QTI21StatisticSearchParams searchParams) { + private static final void decorateTestSessionPermission(TypedQuery<?> query, QTI21StatisticSearchParams searchParams) { query.setParameter("testEntryKey", searchParams.getTestEntry().getKey()); if(searchParams.getCourseEntry() != null) { query.setParameter("repoEntryKey", searchParams.getCourseEntry().getKey()); @@ -729,14 +733,13 @@ public class AssessmentTestSessionDAO { if(StringHelper.containsNonWhitespace(searchParams.getNodeIdent())) { query.setParameter("subIdent", searchParams.getNodeIdent()); } - if(searchParams.getLimitToGroups() != null && searchParams.getLimitToGroups().size() > 0) { + if(searchParams.getLimitToGroups() != null && !searchParams.getLimitToGroups().isEmpty()) { List<Long> keys = searchParams.getLimitToGroups().stream() - .map(group -> group.getKey()).collect(Collectors.toList()); + .map(Group::getKey).collect(Collectors.toList()); query.setParameter("limitGroupKeys", keys); - } - if(searchParams.getLimitToIdentities() != null && searchParams.getLimitToIdentities().size() > 0) { + } else if(searchParams.getLimitToIdentities() != null && !searchParams.getLimitToIdentities().isEmpty()) { List<Long> keys = searchParams.getLimitToIdentities().stream() - .map(group -> group.getKey()).collect(Collectors.toList()); + .map(Identity::getKey).collect(Collectors.toList()); query.setParameter("limitIdentityKeys", keys); } } diff --git a/src/test/java/org/olat/ims/qti21/manager/AssessmentTestSessionDAOTest.java b/src/test/java/org/olat/ims/qti21/manager/AssessmentTestSessionDAOTest.java index 934aa18938189498a7443c8b108083f2689f2f09..355fd9d45e407845db4676c63843c82ab8c94382 100644 --- a/src/test/java/org/olat/ims/qti21/manager/AssessmentTestSessionDAOTest.java +++ b/src/test/java/org/olat/ims/qti21/manager/AssessmentTestSessionDAOTest.java @@ -20,24 +20,35 @@ package org.olat.ims.qti21.manager; import java.math.BigDecimal; +import java.util.Collections; +import java.util.Date; import java.util.List; import java.util.UUID; import org.junit.Assert; import org.junit.Test; +import org.olat.basesecurity.Group; +import org.olat.basesecurity.GroupRoles; import org.olat.core.commons.persistence.DB; import org.olat.core.id.Identity; +import org.olat.course.nodes.ArchiveOptions; import org.olat.ims.qti21.AssessmentItemSession; +import org.olat.ims.qti21.AssessmentResponse; import org.olat.ims.qti21.AssessmentTestSession; import org.olat.ims.qti21.model.ParentPartItemRefs; +import org.olat.ims.qti21.model.QTI21StatisticSearchParams; +import org.olat.ims.qti21.model.ResponseLegality; import org.olat.ims.qti21.model.jpa.AssessmentTestSessionStatistics; import org.olat.modules.assessment.AssessmentEntry; import org.olat.modules.assessment.AssessmentService; import org.olat.repository.RepositoryEntry; +import org.olat.repository.manager.RepositoryEntryRelationDAO; import org.olat.test.JunitTestHelper; import org.olat.test.OlatTestCase; import org.springframework.beans.factory.annotation.Autowired; +import uk.ac.ed.ph.jqtiplus.types.ResponseData.ResponseDataType; + /** * * Initial date: 02.02.2016<br> @@ -49,11 +60,15 @@ public class AssessmentTestSessionDAOTest extends OlatTestCase { @Autowired private DB dbInstance; @Autowired + private AssessmentResponseDAO responseDao; + @Autowired private AssessmentItemSessionDAO itemSessionDao; @Autowired private AssessmentTestSessionDAO testSessionDao; @Autowired private AssessmentService assessmentService; + @Autowired + private RepositoryEntryRelationDAO repositoryEntryRelationDao; @Test public void createTestSession_repo() { @@ -230,4 +245,45 @@ public class AssessmentTestSessionDAOTest extends OlatTestCase { Assert.assertTrue(authorSessions.contains(testSession2)); Assert.assertFalse(authorSessions.contains(testSession3)); } + + + @Test + public void getTestSessionsOfResponse_groupsAndIdentities() { + // prepare a test and 2 users + RepositoryEntry testEntry = JunitTestHelper.createAndPersistRepositoryEntry(); + Identity assessedIdentity = JunitTestHelper.createAndPersistIdentityAsRndUser("session-9"); + AssessmentEntry assessmentEntry = assessmentService.getOrCreateAssessmentEntry(assessedIdentity, null, testEntry, null, testEntry); + dbInstance.commit(); + repositoryEntryRelationDao.addRole(assessedIdentity, testEntry, GroupRoles.participant.name()); + Group testDefaultGroup = repositoryEntryRelationDao.getDefaultGroup(testEntry); + + //create an assessment test session with a response + AssessmentTestSession testSession = testSessionDao.createAndPersistTestSession(testEntry, testEntry, null, assessmentEntry, assessedIdentity, null, false); + Assert.assertNotNull(testSession); + AssessmentItemSession itemSession = itemSessionDao.createAndPersistAssessmentItemSession(testSession, null, UUID.randomUUID().toString()); + Assert.assertNotNull(itemSession); + AssessmentResponse response = responseDao.createAssessmentResponse(testSession, itemSession, UUID.randomUUID().toString(), ResponseLegality.VALID, ResponseDataType.FILE); + Assert.assertNotNull(response); + + dbInstance.commitAndCloseSession(); + + // only finished count + testSession.setDuration(100l); + testSession.setFinishTime(new Date()); + testSession = testSessionDao.update(testSession); + + dbInstance.commitAndCloseSession(); + + //check that there isn't any active test session (only author mode) + ArchiveOptions options = new ArchiveOptions(); + options.setIdentities(Collections.singletonList(assessedIdentity)); + QTI21StatisticSearchParams searchParams = new QTI21StatisticSearchParams(options, testEntry, null, null); + searchParams.setLimitToGroups(Collections.singletonList(testDefaultGroup)); + searchParams.setLimitToIdentities(Collections.singletonList(assessedIdentity)); + + List<AssessmentTestSession> authorSessions = testSessionDao.getTestSessionsOfResponse(searchParams); + Assert.assertNotNull(authorSessions); + Assert.assertEquals(1, authorSessions.size()); + Assert.assertEquals(testSession, authorSessions.get(0)); + } }