diff --git a/src/main/java/ch/ethz/seb/sebserver/webservice/servicelayer/session/impl/indicator/DistributedIndicatorValueService.java b/src/main/java/ch/ethz/seb/sebserver/webservice/servicelayer/session/impl/indicator/DistributedIndicatorValueService.java index 48519627..8e564645 100644 --- a/src/main/java/ch/ethz/seb/sebserver/webservice/servicelayer/session/impl/indicator/DistributedIndicatorValueService.java +++ b/src/main/java/ch/ethz/seb/sebserver/webservice/servicelayer/session/impl/indicator/DistributedIndicatorValueService.java @@ -154,11 +154,18 @@ public class DistributedIndicatorValueService implements DisposableBean { final Long recId = this.clientIndicatorValueMapper.indicatorRecordIdByConnectionId( connectionId, type); + if (recId != null) { - log.debug("Distributed indicator value cache already exists for: {}, {}", connectionId, type); + if (log.isTraceEnabled()) { + log.trace("Distributed indicator value cache already exists for: {}, {}", connectionId, type); + } return recId; } + if (log.isDebugEnabled()) { + log.info("Missing distributed indicator value cache. Create for: {}, {}", connectionId, type); + } + // if not, create new one and return PK final ClientIndicatorRecord clientEventRecord = new ClientIndicatorRecord( null, connectionId, type.id, initValue); diff --git a/src/main/java/ch/ethz/seb/sebserver/webservice/servicelayer/session/impl/proctoring/JitsiProctoringService.java b/src/main/java/ch/ethz/seb/sebserver/webservice/servicelayer/session/impl/proctoring/JitsiProctoringService.java index ab27ce25..34ca5f18 100644 --- a/src/main/java/ch/ethz/seb/sebserver/webservice/servicelayer/session/impl/proctoring/JitsiProctoringService.java +++ b/src/main/java/ch/ethz/seb/sebserver/webservice/servicelayer/session/impl/proctoring/JitsiProctoringService.java @@ -60,6 +60,7 @@ import ch.ethz.seb.sebserver.gbl.util.Cryptor; import ch.ethz.seb.sebserver.gbl.util.Result; import ch.ethz.seb.sebserver.gbl.util.Tuple; import ch.ethz.seb.sebserver.gbl.util.Utils; +import ch.ethz.seb.sebserver.webservice.WebserviceInfo; import ch.ethz.seb.sebserver.webservice.servicelayer.authorization.AuthorizationService; import ch.ethz.seb.sebserver.webservice.servicelayer.session.ExamProctoringService; import ch.ethz.seb.sebserver.webservice.servicelayer.session.ExamSessionService; @@ -107,19 +108,22 @@ public class JitsiProctoringService implements ExamProctoringService { private final Cryptor cryptor; private final ClientHttpRequestFactoryService clientHttpRequestFactoryService; private final JSONMapper jsonMapper; + private final WebserviceInfo webserviceInfo; protected JitsiProctoringService( final AuthorizationService authorizationService, final ExamSessionService examSessionService, final Cryptor cryptor, final ClientHttpRequestFactoryService clientHttpRequestFactoryService, - final JSONMapper jsonMapper) { + final JSONMapper jsonMapper, + final WebserviceInfo webserviceInfo) { this.authorizationService = authorizationService; this.examSessionService = examSessionService; this.cryptor = cryptor; this.clientHttpRequestFactoryService = clientHttpRequestFactoryService; this.jsonMapper = jsonMapper; + this.webserviceInfo = webserviceInfo; } @Override @@ -141,6 +145,11 @@ public class JitsiProctoringService implements ExamProctoringService { "proctoringSettings:serverURL:invalidURL"); } + // In testing we do not check the JITSI service on URL to be able to test without service + if (this.webserviceInfo != null && this.webserviceInfo.hasProfile("test")) { + return true; + } + final ClientHttpRequestFactory clientHttpRequestFactory = this.clientHttpRequestFactoryService .getClientHttpRequestFactory() .getOrThrow(); diff --git a/src/test/java/ch/ethz/seb/sebserver/gui/integration/UseCasesIntegrationTest.java b/src/test/java/ch/ethz/seb/sebserver/gui/integration/UseCasesIntegrationTest.java index 9188427f..59aee267 100644 --- a/src/test/java/ch/ethz/seb/sebserver/gui/integration/UseCasesIntegrationTest.java +++ b/src/test/java/ch/ethz/seb/sebserver/gui/integration/UseCasesIntegrationTest.java @@ -62,6 +62,7 @@ import ch.ethz.seb.sebserver.gbl.model.EntityProcessingReport.ErrorEntry; import ch.ethz.seb.sebserver.gbl.model.Page; import ch.ethz.seb.sebserver.gbl.model.exam.Chapters; import ch.ethz.seb.sebserver.gbl.model.exam.Exam; +import ch.ethz.seb.sebserver.gbl.model.exam.Exam.ExamStatus; import ch.ethz.seb.sebserver.gbl.model.exam.Exam.ExamType; import ch.ethz.seb.sebserver.gbl.model.exam.ExamConfigurationMap; import ch.ethz.seb.sebserver.gbl.model.exam.ExamTemplate; @@ -3457,4 +3458,81 @@ public class UseCasesIntegrationTest extends GuiIntegrationTest { .getOrThrow(); } + @Test + @Order(27) + // ************************************* + // Use Case 27: Login as admin and set exam proctoring settings for Jtisi + // - Get Exam (running) + // - Set Proctoring settings for exam + // - Check settings for exam + public void testUsecase27_SetProctoringSettingsJitsiForExam() throws IOException { + final RestServiceImpl restService = createRestServiceForUser( + "admin", + "admin", + new GetExamPage(), + new GetExamProctoringSettings(), + new SaveExamProctoringSettings()); + + // get exam + final Result> exams = restService + .getBuilder(GetExamPage.class) + .call(); + + assertNotNull(exams); + assertFalse(exams.hasError()); + final Page examPage = exams.get(); + assertFalse(examPage.isEmpty()); + + final Exam runningExam = examPage.content + .stream() + .filter(exam -> exam.status == ExamStatus.RUNNING) + .findFirst() + .orElse(null); + + assertNotNull(runningExam); + assertTrue(runningExam.status == ExamStatus.RUNNING); + + final Result pSettings = restService + .getBuilder(GetExamProctoringSettings.class) + .withURIVariable(API.PARAM_MODEL_ID, runningExam.getModelId()) + .call(); + + assertNotNull(pSettings); + assertFalse(pSettings.hasError()); + ProctoringServiceSettings proctoringServiceSettings = pSettings.get(); + assertFalse(proctoringServiceSettings.enableProctoring); + assertNull(proctoringServiceSettings.serverURL); + + // set proctoring settings + final ProctoringServiceSettings newProctoringServiceSettings = new ProctoringServiceSettings( + runningExam.id, + true, + ProctoringServerType.JITSI_MEET, + "https://test.proc/service", + 2, + EnumSet.allOf(ProctoringFeature.class), + true, + "appKey", "appSecret", + "sdkKey", "sdkSecret", + false); + + final Result newProcSettings = restService + .getBuilder(SaveExamProctoringSettings.class) + .withURIVariable(API.PARAM_MODEL_ID, runningExam.getModelId()) + .withBody(newProctoringServiceSettings) + .call(); + + assertNotNull(newProcSettings); + assertFalse(newProcSettings.hasError()); + + proctoringServiceSettings = restService + .getBuilder(GetExamProctoringSettings.class) + .withURIVariable(API.PARAM_MODEL_ID, runningExam.getModelId()) + .call() + .get(); + + assertTrue(proctoringServiceSettings.enableProctoring); + assertEquals("https://test.proc/service", proctoringServiceSettings.serverURL); + } + } diff --git a/src/test/java/ch/ethz/seb/sebserver/webservice/servicelayer/session/impl/proctoring/ExamJITSIProctoringServiceTest.java b/src/test/java/ch/ethz/seb/sebserver/webservice/servicelayer/session/impl/proctoring/ExamJITSIProctoringServiceTest.java index d5741993..6e1db631 100644 --- a/src/test/java/ch/ethz/seb/sebserver/webservice/servicelayer/session/impl/proctoring/ExamJITSIProctoringServiceTest.java +++ b/src/test/java/ch/ethz/seb/sebserver/webservice/servicelayer/session/impl/proctoring/ExamJITSIProctoringServiceTest.java @@ -81,7 +81,7 @@ public class ExamJITSIProctoringServiceTest { final Cryptor cryptorMock = Mockito.mock(Cryptor.class); Mockito.when(cryptorMock.decrypt(Mockito.any())).thenReturn(Result.of("fbvgeghergrgrthrehreg123")); final JitsiProctoringService examJITSIProctoringService = - new JitsiProctoringService(null, null, cryptorMock, null, new JSONMapper()); + new JitsiProctoringService(null, null, cryptorMock, null, new JSONMapper(), null); String accessToken = examJITSIProctoringService.createPayload( "test-app", @@ -115,7 +115,7 @@ public class ExamJITSIProctoringServiceTest { final Cryptor cryptorMock = Mockito.mock(Cryptor.class); Mockito.when(cryptorMock.decrypt(Mockito.any())).thenReturn(Result.of("fbvgeghergrgrthrehreg123")); final JitsiProctoringService examJITSIProctoringService = - new JitsiProctoringService(null, null, cryptorMock, null, new JSONMapper()); + new JitsiProctoringService(null, null, cryptorMock, null, new JSONMapper(), null); final ProctoringRoomConnection data = examJITSIProctoringService.createProctoringConnection( "connectionToken", "https://seb-jitsi.example.ch", @@ -160,7 +160,7 @@ public class ExamJITSIProctoringServiceTest { examSessionService, cryptor, clientHttpRequestFactoryService, - jsonMapper); + jsonMapper, null); } }