diff --git a/src/main/java/fr/insee/genesis/controller/rest/responses/RawResponseController.java b/src/main/java/fr/insee/genesis/controller/rest/responses/RawResponseController.java index f809e1ec..6010b4b9 100644 --- a/src/main/java/fr/insee/genesis/controller/rest/responses/RawResponseController.java +++ b/src/main/java/fr/insee/genesis/controller/rest/responses/RawResponseController.java @@ -1,6 +1,5 @@ package fr.insee.genesis.controller.rest.responses; -import fr.insee.genesis.controller.dto.rawdata.LunaticJsonRawDataUnprocessedDto; import fr.insee.genesis.domain.model.surveyunit.Mode; import fr.insee.genesis.domain.model.surveyunit.rawdata.DataProcessResult; import fr.insee.genesis.domain.model.surveyunit.rawdata.LunaticJsonRawDataModel; @@ -11,6 +10,7 @@ import fr.insee.genesis.exceptions.GenesisException; import fr.insee.genesis.infrastructure.repository.RawResponseInputRepository; import fr.insee.modelefiliere.RawResponseDto; +import io.swagger.v3.oas.annotations.Hidden; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Parameter; import jakarta.validation.Valid; @@ -139,14 +139,6 @@ public ResponseEntity> getUnprocessedCollectionInstrument(){ } //GET unprocessed - @Operation(summary = "Get campaign id and interrogationId from all unprocessed raw json data") - @GetMapping(path = "/responses/raw/lunatic-json/get/unprocessed") - @PreAuthorize("hasRole('SCHEDULER')") - public ResponseEntity> getUnprocessedJsonRawData() { - log.info("Try to get unprocessed raw JSON datas..."); - return ResponseEntity.ok(lunaticJsonRawDataApiPort.getUnprocessedDataIds()); - } - @Operation(summary = "Get campaign id and interrogationId from all unprocessed raw json data") @GetMapping(path = "/responses/raw/lunatic-json/get/unprocessed/questionnaireIds") @PreAuthorize("hasRole('SCHEDULER')") @@ -266,4 +258,37 @@ public ResponseEntity exists(@PathVariable String interrogationId) { } return ResponseEntity.notFound().build(); } + + //Debug admin endpoints + @Hidden + @Operation(summary = "Get lunatic json raw data") + @GetMapping(path = "/responses/raw/lunatic-json/{collectionInstrumentId}/{mode}/{interrogationId}") + @PreAuthorize("hasRole('ADMIN')") + public ResponseEntity> getJsonRawData( + @PathVariable("collectionInstrumentId") String collectionInstrumentId, + @PathVariable("mode") Mode mode, + @PathVariable(INTERROGATION_ID) String interrogationId + ) { + return ResponseEntity.ok(lunaticJsonRawDataApiPort.getRawDataByQuestionnaireId( + collectionInstrumentId, + mode, + List.of(interrogationId) + )); + } + + @Hidden + @Operation(summary = "Get raw response") + @GetMapping(path = "/raw-responses/{collectionInstrumentId}/{mode}/{interrogationId}") + @PreAuthorize("hasRole('ADMIN')") + public ResponseEntity> getRawResponses( + @PathVariable("collectionInstrumentId") String collectionInstrumentId, + @PathVariable("mode") Mode mode, + @PathVariable(INTERROGATION_ID) String interrogationId + ) { + return ResponseEntity.ok(rawResponseApiPort.getRawResponses( + collectionInstrumentId, + mode, + List.of(interrogationId) + )); + } } diff --git a/src/main/java/fr/insee/genesis/domain/ports/api/LunaticJsonRawDataApiPort.java b/src/main/java/fr/insee/genesis/domain/ports/api/LunaticJsonRawDataApiPort.java index df3e73f1..a2eb2423 100644 --- a/src/main/java/fr/insee/genesis/domain/ports/api/LunaticJsonRawDataApiPort.java +++ b/src/main/java/fr/insee/genesis/domain/ports/api/LunaticJsonRawDataApiPort.java @@ -23,7 +23,6 @@ public interface LunaticJsonRawDataApiPort { List getRawDataByQuestionnaireId(String questionnaireId, Mode mode, List interrogationIdList); List convertRawData(List rawData, VariablesMap variablesMap); - List getUnprocessedDataIds(); Set getUnprocessedDataQuestionnaireIds(); void updateProcessDates(List surveyUnitModels); Set findDistinctQuestionnaireIds(); diff --git a/src/main/java/fr/insee/genesis/domain/ports/spi/LunaticJsonRawDataPersistencePort.java b/src/main/java/fr/insee/genesis/domain/ports/spi/LunaticJsonRawDataPersistencePort.java index 0dca5173..a91bbfa6 100644 --- a/src/main/java/fr/insee/genesis/domain/ports/spi/LunaticJsonRawDataPersistencePort.java +++ b/src/main/java/fr/insee/genesis/domain/ports/spi/LunaticJsonRawDataPersistencePort.java @@ -17,7 +17,6 @@ public interface LunaticJsonRawDataPersistencePort { List findRawDataByQuestionnaireId(String questionnaireId, Mode mode, List interrogationIdList); Page findRawDataByQuestionnaireId(String questionnaireId, Pageable pageable); List findRawDataByInterrogationId(String interrogationId); - List getAllUnprocessedData(); void updateProcessDates(String campaignId, Set interrogationIds); Set findDistinctQuestionnaireIds(); diff --git a/src/main/java/fr/insee/genesis/domain/service/rawdata/LunaticJsonRawDataService.java b/src/main/java/fr/insee/genesis/domain/service/rawdata/LunaticJsonRawDataService.java index 7cf627cf..68e64574 100644 --- a/src/main/java/fr/insee/genesis/domain/service/rawdata/LunaticJsonRawDataService.java +++ b/src/main/java/fr/insee/genesis/domain/service/rawdata/LunaticJsonRawDataService.java @@ -357,22 +357,6 @@ private static Boolean getIsCapturedIndirectly(LunaticJsonRawDataModel rawData) } - @Override - public List getUnprocessedDataIds() { - List dtos = new ArrayList<>(); - - for (GroupedInterrogation groupedInterrogation : lunaticJsonRawDataPersistencePort.findUnprocessedIds()) { - for (String interrogationId : groupedInterrogation.interrogationIds()){ - dtos.add(LunaticJsonRawDataUnprocessedDto.builder() - .questionnaireId(groupedInterrogation.questionnaireId()) - .interrogationId(interrogationId) - .build() - ); - } - } - return dtos; - } - @Override public Set getUnprocessedDataQuestionnaireIds() { Set unprocessedQuestionnaireIds = lunaticJsonRawDataPersistencePort.findDistinctQuestionnaireIdsByNullProcessDate(); diff --git a/src/main/java/fr/insee/genesis/infrastructure/adapter/LunaticJsonRawDataMongoAdapter.java b/src/main/java/fr/insee/genesis/infrastructure/adapter/LunaticJsonRawDataMongoAdapter.java index 0db9a466..ffef70a8 100644 --- a/src/main/java/fr/insee/genesis/infrastructure/adapter/LunaticJsonRawDataMongoAdapter.java +++ b/src/main/java/fr/insee/genesis/infrastructure/adapter/LunaticJsonRawDataMongoAdapter.java @@ -45,11 +45,6 @@ public void save(LunaticJsonRawDataModel rawData) { repository.insert(doc); } - @Override - public List getAllUnprocessedData() { - return LunaticJsonRawDataDocumentMapper.INSTANCE.listDocumentToListModel(repository.findByNullProcessDate()); - } - @Override public Set findDistinctQuestionnaireIdsByNullProcessDate(){ return new HashSet<>(repository.findDistinctQuestionnaireIdByProcessDateIsNull()); diff --git a/src/test/java/fr/insee/genesis/controller/rest/ControllerAccessIT.java b/src/test/java/fr/insee/genesis/controller/rest/ControllerAccessIT.java index 5448867a..48341709 100644 --- a/src/test/java/fr/insee/genesis/controller/rest/ControllerAccessIT.java +++ b/src/test/java/fr/insee/genesis/controller/rest/ControllerAccessIT.java @@ -72,7 +72,6 @@ private static Stream endpointsReader() { private static Stream responseEndpoint() { return Stream.of( - Arguments.of(GET,"/responses/raw/lunatic-json/get/unprocessed"), Arguments.of(GET,"/responses/raw/lunatic-json/TOTO"), Arguments.of(GET,"/raw-responses/TOTO"), Arguments.of(POST,"/responses/raw/lunatic-json/test/process") diff --git a/src/test/java/fr/insee/genesis/controller/rest/responses/RawResponseControllerIT.java b/src/test/java/fr/insee/genesis/controller/rest/responses/RawResponseControllerIT.java index 450eaeba..df51c3d3 100644 --- a/src/test/java/fr/insee/genesis/controller/rest/responses/RawResponseControllerIT.java +++ b/src/test/java/fr/insee/genesis/controller/rest/responses/RawResponseControllerIT.java @@ -44,6 +44,7 @@ import java.util.Set; import static fr.insee.genesis.domain.utils.JsonUtils.jsonToMap; +import static org.hamcrest.Matchers.containsString; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyList; import static org.mockito.ArgumentMatchers.argThat; @@ -53,8 +54,10 @@ import static org.mockito.Mockito.verifyNoInteractions; import static org.mockito.Mockito.when; import static org.springframework.security.test.web.servlet.request.SecurityMockMvcRequestPostProcessors.csrf; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.put; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; @Slf4j @@ -880,6 +883,60 @@ private void setOldModelTestMockBehaviour(String questionnaireId, } } + @Nested + @DisplayName("GET raw responses and lunatic json admin endpoints tests") + class GetRawTests{ + @Test + @DisplayName("GET lunatic json Should return 200 with lunaticJsonRawData model") + @WithMockUser(roles = "ADMIN") + @SneakyThrows + void getLunaticJsonRawData_test(){ + //GIVEN + String questionnaireId = "quest"; + Mode mode = Mode.WEB; + String interrogationId = "interro"; + LunaticJsonRawDataDocument lunaticJsonRawDataDocument = LunaticJsonRawDataDocument.builder() + .interrogationId(interrogationId).build(); + when(lunaticJsonMongoDBRepository.findByQuestionnaireModeAndInterrogations( + eq(questionnaireId), + eq(mode), + anyList() + )).thenReturn(List.of(lunaticJsonRawDataDocument)); + + //WHEN + THEN + mockMvc.perform(get("/responses/raw/lunatic-json/%s/%s/%s".formatted( + questionnaireId, mode.getModeName(), interrogationId + ))) + .andExpect(status().isOk()) + .andExpect(content().string(containsString(interrogationId))); + } + + @Test + @DisplayName("GET Raw Response should return 200 with raw response model") + @WithMockUser(roles = "ADMIN") + @SneakyThrows + void getRawResponse_test(){ + //GIVEN + String collectionInstrumentId = "collectionInstrumentId"; + Mode mode = Mode.WEB; + String interrogationId = "interro"; + RawResponseDocument rawResponseDocument = RawResponseDocument.builder().interrogationId(interrogationId) + .build(); + when(rawResponseRepository.findByCollectionInstrumentIdAndModeAndInterrogationIdList( + eq(collectionInstrumentId), + eq(mode.getJsonName()), + anyList() + )).thenReturn(List.of(rawResponseDocument)); + + //WHEN + THEN + mockMvc.perform(get("/raw-responses/%s/%s/%s".formatted( + collectionInstrumentId, mode.toString(), interrogationId + ))) + .andExpect(status().isOk()) + .andExpect(content().string(containsString(interrogationId))); + } + } + //UTILS private Map getNewDataMap() { Map dataMap = new HashMap<>(); diff --git a/src/test/java/fr/insee/genesis/controller/rest/responses/RawResponseControllerTest.java b/src/test/java/fr/insee/genesis/controller/rest/responses/RawResponseControllerTest.java index 662f7267..b37048c6 100644 --- a/src/test/java/fr/insee/genesis/controller/rest/responses/RawResponseControllerTest.java +++ b/src/test/java/fr/insee/genesis/controller/rest/responses/RawResponseControllerTest.java @@ -3,6 +3,7 @@ import fr.insee.genesis.configuration.auth.security.DefaultSecurityConfig; import fr.insee.genesis.domain.model.surveyunit.Mode; import fr.insee.genesis.domain.model.surveyunit.rawdata.DataProcessResult; +import fr.insee.genesis.domain.model.surveyunit.rawdata.LunaticJsonRawDataModel; import fr.insee.genesis.domain.model.surveyunit.rawdata.RawResponseModel; import fr.insee.genesis.domain.ports.api.LunaticJsonRawDataApiPort; import fr.insee.genesis.domain.ports.api.RawResponseApiPort; @@ -10,6 +11,7 @@ import fr.insee.genesis.exceptions.GenesisException; import fr.insee.genesis.infrastructure.repository.RawResponseInputRepository; import jakarta.servlet.ServletException; +import lombok.SneakyThrows; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Nested; @@ -131,8 +133,307 @@ void save_portThrows_shouldThrowException() throws GenesisException { .param("mode", Mode.WEB.name()) .contentType(MediaType.APPLICATION_JSON) .content("{}")) - ); + .andExpect(status().isInternalServerError()) + .andExpect(content().string(containsString("Unexpected error")))); } + } + + @Nested + @DisplayName("POST /raw-responses tests") + class SaveRawResponsesFromDtoTests { + + @Test + @DisplayName("Should return 201 and call repository") + void saveDto_shouldReturn201AndCallRepository() throws Exception { + // GIVEN + String body = getFiliereModelRawResponseBody(); + + // WHEN / THEN + mockMvc.perform(post("/raw-responses") + .with(csrf()) + .contentType(MediaType.APPLICATION_JSON) + .content(body)) + .andExpect(status().isCreated()) + .andExpect(content().string(containsString("INTERRO01"))); + + verify(rawRepository).saveAsRawJson(any()); + } + + private String getFiliereModelRawResponseBody() { + return """ + { + "partitionId": "RAWDATATESTCAMPAIGN", + "collectionInstrumentId": "TESTQUEST", + "usualSurveyUnitId": "TESTUE00001", + "interrogationId": "INTERRO01", + "mode": "CAWI", + "isCapturedIndirectly": true, + "questionnaireState": "FINISHED", + "data": {} + } + """; + } + } + + @Nested + @DisplayName("POST /raw-responses/process tests") + class ProcessRawResponsesTests { + + @Test + @DisplayName("Should return 200 with count message when no formatted data") + void process_noFormatted_shouldReturnCountMessage() throws Exception { + // GIVEN + when(rawResponseApiPort.processRawResponsesByInterrogationIds(eq("QUEST01"), anyList(), anyList())) + .thenReturn(new DataProcessResult(10, 0, new ArrayList<>())); + + // WHEN / THEN + mockMvc.perform(post("/raw-responses/process") + .with(csrf()) + .param("collectionInstrumentId", "QUEST01") + .contentType(MediaType.APPLICATION_JSON) + .content("[\"i1\",\"i2\"]")) + .andExpect(status().isOk()) + .andExpect(content().string(containsString("10"))) + .andExpect(content().string(containsString("QUEST01"))); + } + + @Test + @DisplayName("Should return 200 with formatted count message when formatted data present") + void process_withFormatted_shouldReturnFormattedCountMessage() throws Exception { + // GIVEN + when(rawResponseApiPort.processRawResponsesByInterrogationIds(eq("QUEST01"), anyList(), anyList())) + .thenReturn(new DataProcessResult(10, 3, new ArrayList<>())); + + // WHEN / THEN + mockMvc.perform(post("/raw-responses/process") + .with(csrf()) + .param("collectionInstrumentId", "QUEST01") + .contentType(MediaType.APPLICATION_JSON) + .content("[\"i1\"]")) + .andExpect(status().isOk()) + .andExpect(content().string(containsString("10"))) + .andExpect(content().string(containsString("3"))) + .andExpect(content().string(containsString("FORMATTED"))); + } + + @Test + @DisplayName("Should return GenesisException status when port throws") + void process_genesisException_shouldReturnExceptionStatus() throws Exception { + // GIVEN + when(rawResponseApiPort.processRawResponsesByInterrogationIds(anyString(), anyList(), anyList())) + .thenThrow(new GenesisException(HttpStatus.NOT_FOUND, "Not found")); + + // WHEN / THEN + mockMvc.perform(post("/raw-responses/process") + .with(csrf()) + .param("collectionInstrumentId", "QUEST01") + .contentType(MediaType.APPLICATION_JSON) + .content("[\"i1\"]")) + .andExpect(status().isNotFound()) + .andExpect(content().string(containsString("Not found"))); + } + } + + @Nested + @DisplayName("POST /raw-responses/{collectionInstrumentId}/process tests") + class ProcessRawResponsesByCollectionInstrumentIdTests { + + @Test + @DisplayName("Should return 200 with count message") + void processByCollectionInstrumentId_shouldReturn200() throws Exception { + // GIVEN + when(rawResponseApiPort.processRawResponsesByInterrogationIds("QUEST01")) + .thenReturn(new DataProcessResult(5, 0, new ArrayList<>())); + + // WHEN / THEN + mockMvc.perform(post("/raw-responses/QUEST01/process") + .with(csrf())) + .andExpect(status().isOk()) + .andExpect(content().string(containsString("5"))); + } + + @Test + @DisplayName("Should return GenesisException status when port throws") + void processByCollectionInstrumentId_genesisException_shouldReturnExceptionStatus() throws Exception { + // GIVEN + when(rawResponseApiPort.processRawResponsesByInterrogationIds(anyString())) + .thenThrow(new GenesisException(HttpStatus.valueOf(422), "Unprocessable")); + + // WHEN / THEN + mockMvc.perform(post("/raw-responses/QUEST01/process") + .with(csrf())) + .andExpect(status().isUnprocessableEntity()) + .andExpect(content().string(containsString("Unprocessable"))); + } + } + + @Nested + @DisplayName("GET /raw-responses/unprocessed/collection-instrument-ids tests") + class GetUnprocessedCollectionInstrumentTests { + + @Test + @DisplayName("Should return 200 with list of collection instrument ids") + void getUnprocessed_shouldReturn200WithIds() throws Exception { + // GIVEN + when(rawResponseApiPort.getUnprocessedCollectionInstrumentIds()) + .thenReturn(List.of("QUEST01", "QUEST02")); + + // WHEN / THEN + mockMvc.perform(get("/raw-responses/unprocessed/collection-instrument-ids")) + .andExpect(status().isOk()) + .andExpect(content().string(containsString("QUEST01"))); + } + } + + @Nested + @DisplayName("GET /responses/raw/lunatic-json/get/unprocessed/questionnaireIds tests") + class GetUnprocessedJsonRawDataQuestionnairesIdsTests { + + @Test + @DisplayName("Should return 200 with questionnaire ids set") + void getUnprocessedQuestionnaireIds_shouldReturn200() throws Exception { + // GIVEN + when(lunaticJsonRawDataApiPort.getUnprocessedDataQuestionnaireIds()) + .thenReturn(Set.of("QUEST01", "QUEST02")); + + // WHEN / THEN + mockMvc.perform(get("/responses/raw/lunatic-json/get/unprocessed/questionnaireIds")) + .andExpect(status().isOk()) + .andExpect(content().string(containsString("QUEST01"))); + } + } + + @Nested + @DisplayName("POST /responses/raw/lunatic-json/{questionnaireId}/process tests") + class ProcessJsonRawDataByQuestionnaireIdTests { + + @Test + @DisplayName("Should return 200 with count message") + void processByQuestionnaireId_shouldReturn200() throws Exception { + // GIVEN + when(lunaticJsonRawDataApiPort.processRawData("QUEST01")) + .thenReturn(new DataProcessResult(8, 0, new ArrayList<>())); + + // WHEN / THEN + mockMvc.perform(post("/responses/raw/lunatic-json/QUEST01/process") + .with(csrf())) + .andExpect(status().isOk()) + .andExpect(content().string(containsString("8"))); + } + + @Test + @DisplayName("Should return GenesisException status when port throws") + void processByQuestionnaireId_genesisException_shouldReturnExceptionStatus() throws Exception { + // GIVEN + when(lunaticJsonRawDataApiPort.processRawData(anyString())) + .thenThrow(new GenesisException(HttpStatus.NOT_FOUND, "Questionnaire not found")); + + // WHEN / THEN + mockMvc.perform(post("/responses/raw/lunatic-json/QUEST01/process") + .with(csrf())) + .andExpect(status().isNotFound()) + .andExpect(content().string(containsString("Questionnaire not found"))); + } + } + + @Nested + @DisplayName("GET /responses/raw/lunatic-json/{campaignId} tests") + class GetLunaticJsonRawDataTests { + + @Test + @DisplayName("Should return 200 with paged model") + void getLunaticJson_shouldReturn200() throws Exception { + // GIVEN + when(lunaticJsonRawDataApiPort.findRawDataByCampaignIdAndDate( + eq("CAMPAIGN"), any(), any(), any())) + .thenReturn(new PageImpl<>(List.of(), PageRequest.of(0, 1000), 0)); + + // WHEN / THEN + mockMvc.perform(get("/responses/raw/lunatic-json/CAMPAIGN")) + .andExpect(status().isOk()); + } + + @Test + @DisplayName("Should accept optional startDate and endDate query params") + void getLunaticJson_withDates_shouldReturn200() throws Exception { + // GIVEN + when(lunaticJsonRawDataApiPort.findRawDataByCampaignIdAndDate( + anyString(), any(Instant.class), any(Instant.class), any())) + .thenReturn(new PageImpl<>(List.of())); + + // WHEN / THEN + mockMvc.perform(get("/responses/raw/lunatic-json/CAMPAIGN") + .param("startDate", "2024-01-01T00:00:00Z") + .param("endDate", "2024-12-31T23:59:59Z")) + .andExpect(status().isOk()); + } + } + + @Nested + @DisplayName("GET /responses/raw/lunatic-json/by-questionnaire/{questionnaireId} tests") + class GetLunaticJsonByQuestionnaireTests { + + @Test + @DisplayName("Should return 200 with paged model") + void getByQuestionnaire_shouldReturn200() throws Exception { + // GIVEN + when(lunaticJsonRawDataApiPort.findRawDataByQuestionnaireId(eq("QUEST01"), any())) + .thenReturn(new PageImpl<>(List.of())); + + // WHEN / THEN + mockMvc.perform(get("/responses/raw/lunatic-json/by-questionnaire/QUEST01")) + .andExpect(status().isOk()); + } + } + + @Nested + @DisplayName("HEAD /responses/raw/lunatic-json/{interrogationId} tests") + class ExistsLunaticJsonByInterrogationIdTests { + + @Test + @DisplayName("Should return 200 when interrogation exists") + void existsLunaticJson_exists_shouldReturn200() throws Exception { + // GIVEN + when(lunaticJsonRawDataApiPort.existsByInterrogationId("INTERRO01")).thenReturn(true); + + // WHEN / THEN + mockMvc.perform(request(HEAD, "/responses/raw/lunatic-json/INTERRO01")) + .andExpect(status().isOk()); + } + + @Test + @DisplayName("Should return 404 when interrogation does not exist") + void existsLunaticJson_notFound_shouldReturn404() throws Exception { + // GIVEN + when(lunaticJsonRawDataApiPort.existsByInterrogationId("INTERRO01")).thenReturn(false); + + // WHEN / THEN + mockMvc.perform(request(HEAD, "/responses/raw/lunatic-json/INTERRO01")) + .andExpect(status().isNotFound()); + } + } + + @Nested + @DisplayName("GET /raw-responses/{campaignId} tests") + class GetRawResponsesByCampaignTests { + + @Test + @DisplayName("Should return 200 with paged model") + void getRawResponses_shouldReturn200() throws Exception { + // GIVEN + when(rawResponseApiPort.findRawResponseDataByCampaignIdAndDate( + eq("CAMPAIGN"), any(), any(), any())) + .thenReturn(new PageImpl<>(List.of(), PageRequest.of(0, 1000), 0)); + + // WHEN / THEN + mockMvc.perform(get("/raw-responses/CAMPAIGN")) + .andExpect(status().isOk()); + } + } + + @Nested + @DisplayName("GET /raw-responses/by-collection-instrument/{collectionInstrumentId} tests") + class GetRawResponsesByCollectionInstrumentTests { @Nested @DisplayName("POST /raw-responses tests") @@ -281,22 +582,6 @@ void getUnprocessed_shouldReturn200WithIds() throws Exception { } } - @Nested - @DisplayName("GET /responses/raw/lunatic-json/get/unprocessed tests") - class GetUnprocessedJsonRawDataTests { - - @Test - @DisplayName("Should return 200 with unprocessed data ids") - void getUnprocessedJson_shouldReturn200() throws Exception { - // GIVEN - when(lunaticJsonRawDataApiPort.getUnprocessedDataIds()).thenReturn(List.of()); - - // WHEN / THEN - mockMvc.perform(get("/responses/raw/lunatic-json/get/unprocessed")) - .andExpect(status().isOk()); - } - } - @Nested @DisplayName("GET /responses/raw/lunatic-json/get/unprocessed/questionnaireIds tests") class GetUnprocessedJsonRawDataQuestionnairesIdsTests { @@ -441,11 +726,6 @@ void getRawResponses_shouldReturn200() throws Exception { mockMvc.perform(get("/raw-responses/CAMPAIGN")) .andExpect(status().isOk()); } - } - - @Nested - @DisplayName("GET /raw-responses/by-collection-instrument/{collectionInstrumentId} tests") - class GetRawResponsesByCollectionInstrumentTests { @Test @DisplayName("Should return 200 with paged model") @@ -524,4 +804,49 @@ void getProcessedIds_defaultHours_shouldReturn200() throws Exception { } } } + + @Nested + @DisplayName("GET raw responses and lunatic json admin endpoints tests") + class GetRawTests{ + @Test + @DisplayName("Should call lunaticjsondata api port and return 200 with lunaticJsonRawData model") + @SneakyThrows + void getLunaticJsonRawData_call_port(){ + //GIVEN + String questionnaireId = "quest"; + Mode mode = Mode.WEB; + String interrogationId = "interro"; + LunaticJsonRawDataModel lunaticJsonRawDataModel = + LunaticJsonRawDataModel.builder().interrogationId(interrogationId).build(); + when(lunaticJsonRawDataApiPort.getRawDataByQuestionnaireId(eq(questionnaireId), eq(mode), anyList())) + .thenReturn(List.of(lunaticJsonRawDataModel)); + + //WHEN + THEN + mockMvc.perform(get("/responses/raw/lunatic-json/%s/%s/%s".formatted( + questionnaireId, mode.getModeName(), interrogationId + ))) + .andExpect(status().isOk()) + .andExpect(content().string(containsString(interrogationId))); + } + + @Test + @DisplayName("Should call raw response api port and return 200 with raw response model") + @SneakyThrows + void getRawResponse_call_port(){ + //GIVEN + String collectionInstrumentId = "collectionInstrumentId"; + Mode mode = Mode.WEB; + String interrogationId = "interro"; + RawResponseModel rawResponseModel = RawResponseModel.builder().interrogationId(interrogationId).build(); + when(rawResponseApiPort.getRawResponses(eq(collectionInstrumentId), eq(mode), anyList())) + .thenReturn(List.of(rawResponseModel)); + + //WHEN + THEN + mockMvc.perform(get("/raw-responses/%s/%s/%s".formatted( + collectionInstrumentId, mode.getModeName(), interrogationId + ))) + .andExpect(status().isOk()) + .andExpect(content().string(containsString(interrogationId))); + } + } } \ No newline at end of file diff --git a/src/test/java/fr/insee/genesis/domain/service/rawdata/LunaticJsonRawDataServiceTest.java b/src/test/java/fr/insee/genesis/domain/service/rawdata/LunaticJsonRawDataServiceTest.java index 36b405a5..8839c9d0 100644 --- a/src/test/java/fr/insee/genesis/domain/service/rawdata/LunaticJsonRawDataServiceTest.java +++ b/src/test/java/fr/insee/genesis/domain/service/rawdata/LunaticJsonRawDataServiceTest.java @@ -447,38 +447,6 @@ void arrayValues_convertedToMultipleIterations() { } } - @Nested - @DisplayName("getUnprocessedDataIds()") - class GetUnprocessedDataIdsTests { - - @Test - @DisplayName("Returns DTOs for each interrogation id") - void returnsDtos() { - //GIVEN - GroupedInterrogation grouped = new GroupedInterrogation( - QUESTIONNAIRE_ID, List.of("id1", "id2")); - when(lunaticJsonRawDataPersistencePort.findUnprocessedIds()).thenReturn(List.of(grouped)); - - //WHEN - List result = service.getUnprocessedDataIds(); - - //THEN - assertThat(result).hasSize(2); - assertThat(result.get(0).interrogationId()).isEqualTo("id1"); - assertThat(result.get(1).interrogationId()).isEqualTo("id2"); - } - - @Test - @DisplayName("Returns empty list when no unprocessed ids") - void noUnprocessed_returnsEmpty() { - //GIVEN - when(lunaticJsonRawDataPersistencePort.findUnprocessedIds()).thenReturn(List.of()); - - //WHEN + THEN - assertThat(service.getUnprocessedDataIds()).isEmpty(); - } - } - @Nested @DisplayName("getUnprocessedDataQuestionnaireIds()") class GetUnprocessedDataQuestionnaireIdsTests { diff --git a/src/test/java/fr/insee/genesis/infrastructure/adapter/LunaticJsonRawDataMongoAdapterTest.java b/src/test/java/fr/insee/genesis/infrastructure/adapter/LunaticJsonRawDataMongoAdapterTest.java index 180ac1e9..cc6b24ca 100644 --- a/src/test/java/fr/insee/genesis/infrastructure/adapter/LunaticJsonRawDataMongoAdapterTest.java +++ b/src/test/java/fr/insee/genesis/infrastructure/adapter/LunaticJsonRawDataMongoAdapterTest.java @@ -91,35 +91,6 @@ void save_shouldUseInsertNotSave() { } } - @Nested - @DisplayName("getAllUnprocessedData() tests") - class GetAllUnprocessedDataTests { - - @Test - @DisplayName("Should return mapped models from repository") - void getAllUnprocessedData_shouldReturnMappedModels() { - //GIVEN - when(repository.findByNullProcessDate()).thenReturn(List.of(getDocument())); - - //WHEN - List result = adapter.getAllUnprocessedData(); - - //THEN - assertThat(result).isNotNull().hasSize(1); - verify(repository).findByNullProcessDate(); - } - - @Test - @DisplayName("Should return empty list when repository returns no documents") - void getAllUnprocessedData_noDocuments_shouldReturnEmptyList() { - //GIVEN - when(repository.findByNullProcessDate()).thenReturn(List.of()); - - //WHEN + THEN - assertThat(adapter.getAllUnprocessedData()).isEmpty(); - } - } - @Nested @DisplayName("findDistinctQuestionnaireIdsByNullProcessDate() tests") class FindDistinctQuestionnaireIdsByNullProcessDateTests {