diff --git a/CHANGELOG.md b/CHANGELOG.md
index d51ba7928..b832fcd7b 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -9,6 +9,11 @@
- Prevent missing contextual external or previous files from clearing existing contextual data.
- Endpoint to get data by dates
+### Added
+- Endpoint to retrieve raw response by collectionInstrumentId and interrogationId
+- Endpoint to retrieve lunatic JSON data by questionnaireId and interrogationId
+- Endpoint to retrieve raw/lunatic data identifiers by collectionInstrumentId
+
### Changed
- Refactor all tests
- Begin to handle exceptions
diff --git a/pom.xml b/pom.xml
index 3fa352a7e..881d30420 100644
--- a/pom.xml
+++ b/pom.xml
@@ -24,7 +24,7 @@
2.21.1
- 1.1.3
+ 1.1.4
2.8.17
1.6.3
1.23.1
diff --git a/src/main/java/fr/insee/genesis/configuration/LogRequestFilter.java b/src/main/java/fr/insee/genesis/configuration/LogRequestFilter.java
new file mode 100644
index 000000000..e69de29bb
diff --git a/src/main/java/fr/insee/genesis/controller/dto/rawdata/RawDataIdentifierDto.java b/src/main/java/fr/insee/genesis/controller/dto/rawdata/RawDataIdentifierDto.java
new file mode 100644
index 000000000..7fb8a8020
--- /dev/null
+++ b/src/main/java/fr/insee/genesis/controller/dto/rawdata/RawDataIdentifierDto.java
@@ -0,0 +1,10 @@
+package fr.insee.genesis.controller.dto.rawdata;
+
+import java.time.LocalDateTime;
+
+public record RawDataIdentifierDto(
+ String interrogationId,
+ String usualSurveyUnitId,
+ LocalDateTime recordDate,
+ LocalDateTime processDate
+) {}
diff --git a/src/main/java/fr/insee/genesis/controller/dto/rawdata/RawDataIdentifiersDto.java b/src/main/java/fr/insee/genesis/controller/dto/rawdata/RawDataIdentifiersDto.java
new file mode 100644
index 000000000..54b689e56
--- /dev/null
+++ b/src/main/java/fr/insee/genesis/controller/dto/rawdata/RawDataIdentifiersDto.java
@@ -0,0 +1,8 @@
+package fr.insee.genesis.controller.dto.rawdata;
+
+import java.util.List;
+
+public record RawDataIdentifiersDto(
+ String campaignId,
+ List interrogations
+) {}
diff --git a/src/main/java/fr/insee/genesis/controller/rest/CombinedRawDataController.java b/src/main/java/fr/insee/genesis/controller/rest/CombinedRawDataController.java
index afa7389f4..866bb4f24 100644
--- a/src/main/java/fr/insee/genesis/controller/rest/CombinedRawDataController.java
+++ b/src/main/java/fr/insee/genesis/controller/rest/CombinedRawDataController.java
@@ -1,7 +1,9 @@
package fr.insee.genesis.controller.rest;
import fr.insee.genesis.controller.dto.rawdata.CombinedRawDataDto;
+import fr.insee.genesis.controller.dto.rawdata.RawDataIdentifiersDto;
import fr.insee.genesis.domain.service.rawdata.CombinedRawDataService;
+import fr.insee.genesis.exceptions.NoDataException;
import io.swagger.v3.oas.annotations.Operation;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
@@ -9,6 +11,7 @@
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
@@ -36,5 +39,14 @@ public ResponseEntity getCombinedRawData(
return ResponseEntity.ok(data);
}
-
+ @Operation(summary = "Get raw data identifiers by collection instrument ID")
+ @GetMapping("/collection-instruments/{collectionInstrumentId}/ids")
+ @PreAuthorize("hasRole('ADMIN')")
+ public ResponseEntity getRawDataIdentifiers(
+ @PathVariable String collectionInstrumentId
+ ) throws NoDataException {
+ return ResponseEntity.ok(
+ combinedRawDataService.getRawDataIdentifiersByCollectionInstrumentId(collectionInstrumentId)
+ );
+ }
}
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 f809e1ecc..6d3b1cbb3 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
@@ -9,6 +9,7 @@
import fr.insee.genesis.domain.ports.api.RawResponseApiPort;
import fr.insee.genesis.exceptions.GenesisError;
import fr.insee.genesis.exceptions.GenesisException;
+import fr.insee.genesis.exceptions.NoDataException;
import fr.insee.genesis.infrastructure.repository.RawResponseInputRepository;
import fr.insee.modelefiliere.RawResponseDto;
import io.swagger.v3.oas.annotations.Operation;
@@ -93,6 +94,16 @@ public ResponseEntity saveRawResponsesFromRawResponseDto(
return ResponseEntity.status(201).body(String.format(SUCCESS_MESSAGE, dto.getInterrogationId()));
}
+ @Operation(summary = "Get a raw response by collection instrument ID and interrogation ID")
+ @GetMapping("/raw-responses/collection-instruments/{collectionInstrumentId}/interrogations/{interrogationId}")
+ @PreAuthorize("hasRole('ADMIN')")
+ public ResponseEntity> getRawResponse(
+ @PathVariable String collectionInstrumentId,
+ @PathVariable String interrogationId
+ ) throws NoDataException {
+ return ResponseEntity.ok(rawResponseApiPort.getRawResponseByCollectionInstrumentIdAndInterrogationId(collectionInstrumentId, interrogationId));
+ }
+
//PROCESS
@Operation(summary = "Process raw data for a list of interrogations")
@PostMapping(path = "/raw-responses/process")
@@ -215,6 +226,21 @@ public ResponseEntity> getLunaticJsonRawData
return ResponseEntity.status(HttpStatus.OK).body(new PagedModel<>(rawResponses));
}
+ @Operation(summary = "Get lunatic json data by questionnaire ID and interrogation ID")
+ @GetMapping("/responses/raw/lunatic-json/questionnaireIds/{questionnaireId}/interrogations/{interrogationId}")
+ @PreAuthorize("hasRole('ADMIN')")
+ public ResponseEntity> getLunaticJsonData(
+ @PathVariable String questionnaireId,
+ @PathVariable String interrogationId
+ ) throws NoDataException{
+ return ResponseEntity.ok(
+ lunaticJsonRawDataApiPort.getLunaticJsonDataByQuestionnaireIdAndInterrogationId(
+ questionnaireId,
+ interrogationId
+ )
+ );
+ }
+
@Operation(summary = "Check existence of an interrogation")
@RequestMapping(value = "/responses/raw/lunatic-json/{interrogationId}", method = RequestMethod.HEAD)
@PreAuthorize("hasRole('ADMIN')")
@@ -266,4 +292,7 @@ public ResponseEntity exists(@PathVariable String interrogationId) {
}
return ResponseEntity.notFound().build();
}
+
+
+
}
diff --git a/src/main/java/fr/insee/genesis/domain/model/surveyunit/rawdata/combinedRawDataModel.java b/src/main/java/fr/insee/genesis/domain/model/surveyunit/rawdata/combinedRawDataModel.java
deleted file mode 100644
index c66040a00..000000000
--- a/src/main/java/fr/insee/genesis/domain/model/surveyunit/rawdata/combinedRawDataModel.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package fr.insee.genesis.domain.model.surveyunit.rawdata;
-
-import java.util.List;
-
-public record combinedRawDataModel(List rawResponseModels,
- List lunaticRawDataModels) {
-}
diff --git a/src/main/java/fr/insee/genesis/domain/ports/api/CombinedRawDataApiPort.java b/src/main/java/fr/insee/genesis/domain/ports/api/CombinedRawDataApiPort.java
new file mode 100644
index 000000000..2422078d9
--- /dev/null
+++ b/src/main/java/fr/insee/genesis/domain/ports/api/CombinedRawDataApiPort.java
@@ -0,0 +1,13 @@
+package fr.insee.genesis.domain.ports.api;
+
+import fr.insee.genesis.controller.dto.rawdata.CombinedRawDataDto;
+import fr.insee.genesis.controller.dto.rawdata.RawDataIdentifiersDto;
+import fr.insee.genesis.exceptions.NoDataException;
+
+public interface CombinedRawDataApiPort {
+
+ CombinedRawDataDto getCombinedRawDataByInterrogationId(String interrogationId);
+ RawDataIdentifiersDto getRawDataIdentifiersByCollectionInstrumentId(
+ String collectionInstrumentId
+ ) throws NoDataException;
+}
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 df3e73f12..a6e7d593b 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
@@ -8,6 +8,7 @@
import fr.insee.genesis.domain.model.surveyunit.rawdata.LunaticJsonRawDataModel;
import fr.insee.genesis.exceptions.GenesisError;
import fr.insee.genesis.exceptions.GenesisException;
+import fr.insee.genesis.exceptions.NoDataException;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
@@ -22,7 +23,7 @@ public interface LunaticJsonRawDataApiPort {
void save(LunaticJsonRawDataModel rawData) throws GenesisException;
List getRawDataByQuestionnaireId(String questionnaireId, Mode mode, List interrogationIdList);
List convertRawData(List rawData, VariablesMap variablesMap);
-
+ List getLunaticJsonDataByQuestionnaireIdAndInterrogationId(String questionnaireId, String interrogationId) throws NoDataException;
List getUnprocessedDataIds();
Set getUnprocessedDataQuestionnaireIds();
void updateProcessDates(List surveyUnitModels);
diff --git a/src/main/java/fr/insee/genesis/domain/ports/api/RawResponseApiPort.java b/src/main/java/fr/insee/genesis/domain/ports/api/RawResponseApiPort.java
index 7771031d0..608e224ee 100644
--- a/src/main/java/fr/insee/genesis/domain/ports/api/RawResponseApiPort.java
+++ b/src/main/java/fr/insee/genesis/domain/ports/api/RawResponseApiPort.java
@@ -7,6 +7,7 @@
import fr.insee.genesis.domain.model.surveyunit.rawdata.RawResponseModel;
import fr.insee.genesis.exceptions.GenesisError;
import fr.insee.genesis.exceptions.GenesisException;
+import fr.insee.genesis.exceptions.NoDataException;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
@@ -18,6 +19,7 @@ public interface RawResponseApiPort {
List getRawResponses(String collectionInstrumentId, Mode mode, List interrogationIdList);
List getRawResponsesByInterrogationID(String interrogationId);
+ List getRawResponseByCollectionInstrumentIdAndInterrogationId(String collectionInstrumentId, String interrogationId) throws NoDataException;
DataProcessResult processRawResponsesByInterrogationIds(String collectionInstrumentId, List interrogationIdList, List errors) throws GenesisException;
DataProcessResult processRawResponsesByInterrogationIds(String collectionInstrumentId) throws GenesisException;
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 0dca5173d..655369ec1 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
@@ -1,5 +1,6 @@
package fr.insee.genesis.domain.ports.spi;
+import fr.insee.genesis.controller.dto.rawdata.RawDataIdentifiersDto;
import fr.insee.genesis.domain.model.surveyunit.GroupedInterrogation;
import fr.insee.genesis.domain.model.surveyunit.Mode;
import fr.insee.genesis.domain.model.surveyunit.rawdata.LunaticJsonRawDataModel;
@@ -16,9 +17,15 @@ public interface LunaticJsonRawDataPersistencePort {
void save(LunaticJsonRawDataModel rawData);
List findRawDataByQuestionnaireId(String questionnaireId, Mode mode, List interrogationIdList);
Page findRawDataByQuestionnaireId(String questionnaireId, Pageable pageable);
+
+ RawDataIdentifiersDto findLunaticJsonRawDataIdentifiersByQuestionnaireId(
+ String questionnaireId
+ );
+
List findRawDataByInterrogationId(String interrogationId);
List getAllUnprocessedData();
void updateProcessDates(String campaignId, Set interrogationIds);
+ List findLunaticJsonDataByQuestionnaireIdAndInterrogationId(String questionnaireId, String interrogationId);
Set findDistinctQuestionnaireIds();
Set findDistinctQuestionnaireIdsByNullProcessDate();
diff --git a/src/main/java/fr/insee/genesis/domain/ports/spi/RawResponsePersistencePort.java b/src/main/java/fr/insee/genesis/domain/ports/spi/RawResponsePersistencePort.java
index 02a80860d..2be73d342 100644
--- a/src/main/java/fr/insee/genesis/domain/ports/spi/RawResponsePersistencePort.java
+++ b/src/main/java/fr/insee/genesis/domain/ports/spi/RawResponsePersistencePort.java
@@ -1,5 +1,6 @@
package fr.insee.genesis.domain.ports.spi;
+import fr.insee.genesis.controller.dto.rawdata.RawDataIdentifiersDto;
import fr.insee.genesis.domain.model.surveyunit.Mode;
import fr.insee.genesis.domain.model.surveyunit.rawdata.RawResponseModel;
import fr.insee.modelefiliere.ModeDto;
@@ -14,6 +15,12 @@ public interface RawResponsePersistencePort {
List findRawResponses(String collectionInstrumentId, Mode mode, List interrogationIdList);
List findRawResponsesByInterrogationID(String interrogationId);
+ List findRawResponseByCollectionInstrumentIdAndInterrogationId(String collectionInstrumentId, String interrogationId);
+
+ RawDataIdentifiersDto findRawResponseIdentifiersByCollectionInstrumentId(
+ String collectionInstrumentId
+ );
+
void updateProcessDates(String collectionInstrumentId, Set interrogationIds);
List getUnprocessedCollectionIds();
Set findUnprocessedInterrogationIdsByCollectionInstrumentId(String collectionInstrumentId);
diff --git a/src/main/java/fr/insee/genesis/domain/service/context/DataProcessingContextService.java b/src/main/java/fr/insee/genesis/domain/service/context/DataProcessingContextService.java
index 8f57440be..001bbc925 100644
--- a/src/main/java/fr/insee/genesis/domain/service/context/DataProcessingContextService.java
+++ b/src/main/java/fr/insee/genesis/domain/service/context/DataProcessingContextService.java
@@ -302,7 +302,6 @@ public long countContexts() {
return dataProcessingContextPersistancePort.count();
}
- //TODO get context by collectionInstrumentId
@Override
public DataProcessingContextModel getContext(String interrogationId) throws GenesisException {
List surveyUnitModels = surveyUnitPersistencePort.findByInterrogationId(interrogationId);
@@ -326,7 +325,6 @@ public DataProcessingContextModel getContext(String interrogationId) throws Gene
}
return dataProcessingContextPersistancePort.findByCollectionInstrumentId(collectionInstrumentIds.stream().toList().getFirst());
- //TODO if multiple contexts, priorize withReview false
}
@Override
diff --git a/src/main/java/fr/insee/genesis/domain/service/rawdata/CombinedRawDataService.java b/src/main/java/fr/insee/genesis/domain/service/rawdata/CombinedRawDataService.java
index 782ca7410..351f4571e 100644
--- a/src/main/java/fr/insee/genesis/domain/service/rawdata/CombinedRawDataService.java
+++ b/src/main/java/fr/insee/genesis/domain/service/rawdata/CombinedRawDataService.java
@@ -1,10 +1,13 @@
package fr.insee.genesis.domain.service.rawdata;
import fr.insee.genesis.controller.dto.rawdata.CombinedRawDataDto;
+import fr.insee.genesis.controller.dto.rawdata.RawDataIdentifiersDto;
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.CombinedRawDataApiPort;
import fr.insee.genesis.domain.ports.spi.LunaticJsonRawDataPersistencePort;
import fr.insee.genesis.domain.ports.spi.RawResponsePersistencePort;
+import fr.insee.genesis.exceptions.NoDataException;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Qualifier;
@@ -15,8 +18,7 @@
@Service
@Slf4j
@RequiredArgsConstructor
-//TODO create API port interface
-public class CombinedRawDataService {
+public class CombinedRawDataService implements CombinedRawDataApiPort {
@Qualifier("lunaticJsonMongoAdapter")
private final LunaticJsonRawDataPersistencePort lunaticJsonRawDataPersistencePort;
@@ -37,5 +39,31 @@ public CombinedRawDataDto getCombinedRawDataByInterrogationId(String interrogati
);
}
+ public RawDataIdentifiersDto getRawDataIdentifiersByCollectionInstrumentId(
+ String collectionInstrumentId
+ ) throws NoDataException {
+
+ RawDataIdentifiersDto rawResult =
+ rawResponsePersistencePort.findRawResponseIdentifiersByCollectionInstrumentId(
+ collectionInstrumentId
+ );
+
+ if (rawResult != null) {
+ return rawResult;
+ }
+
+ RawDataIdentifiersDto lunaticResult =
+ lunaticJsonRawDataPersistencePort.findLunaticJsonRawDataIdentifiersByQuestionnaireId(
+ collectionInstrumentId
+ );
+
+ if (lunaticResult != null) {
+ return lunaticResult;
+ }
+
+ throw new NoDataException(
+ "No raw data found for collectionInstrumentId=%s".formatted(collectionInstrumentId)
+ );
+ }
}
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 7cf627cfe..191b98a53 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
@@ -27,6 +27,7 @@
import fr.insee.genesis.domain.utils.JsonUtils;
import fr.insee.genesis.exceptions.GenesisError;
import fr.insee.genesis.exceptions.GenesisException;
+import fr.insee.genesis.exceptions.NoDataException;
import fr.insee.genesis.infrastructure.utils.FileUtils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
@@ -577,6 +578,19 @@ public Page findRawDataByQuestionnaireId(String questio
return lunaticJsonRawDataPersistencePort.findRawDataByQuestionnaireId(questionnaireId, pageable);
}
+ @Override
+ public List getLunaticJsonDataByQuestionnaireIdAndInterrogationId(String questionnaireId, String interrogationId) throws NoDataException {
+
+ List lunaticJsonRawDataModels = lunaticJsonRawDataPersistencePort.findLunaticJsonDataByQuestionnaireIdAndInterrogationId(questionnaireId, interrogationId);
+ if(lunaticJsonRawDataModels.isEmpty()){
+ throw new NoDataException(
+ "No lunatic JSON data found for questionnaireId=%s and interrogationId=%s"
+ .formatted(questionnaireId, interrogationId)
+ );
+ }
+ return lunaticJsonRawDataModels;
+ }
+
@Override
public boolean existsByInterrogationId(String interrogationId) {
return lunaticJsonRawDataPersistencePort.existsByInterrogationId(interrogationId);
diff --git a/src/main/java/fr/insee/genesis/domain/service/rawdata/RawResponseService.java b/src/main/java/fr/insee/genesis/domain/service/rawdata/RawResponseService.java
index 48d9ec965..9cbdf12ab 100644
--- a/src/main/java/fr/insee/genesis/domain/service/rawdata/RawResponseService.java
+++ b/src/main/java/fr/insee/genesis/domain/service/rawdata/RawResponseService.java
@@ -23,6 +23,7 @@
import fr.insee.genesis.domain.utils.JsonUtils;
import fr.insee.genesis.exceptions.GenesisError;
import fr.insee.genesis.exceptions.GenesisException;
+import fr.insee.genesis.exceptions.NoDataException;
import fr.insee.genesis.infrastructure.utils.FileUtils;
import fr.insee.modelefiliere.ModeDto;
import fr.insee.modelefiliere.RawResponseDto;
@@ -81,6 +82,27 @@ public List getRawResponsesByInterrogationID(String interrogat
return rawResponsePersistencePort.findRawResponsesByInterrogationID(interrogationId);
}
+ @Override
+ public List getRawResponseByCollectionInstrumentIdAndInterrogationId(
+ String collectionInstrumentId,
+ String interrogationId
+ ) throws NoDataException {
+ List rawResponses = rawResponsePersistencePort
+ .findRawResponseByCollectionInstrumentIdAndInterrogationId(
+ collectionInstrumentId,
+ interrogationId
+ );
+
+ if (rawResponses.isEmpty()) {
+ throw new NoDataException(
+ "No raw responses found for collectionInstrumentId=%s and interrogationId=%s"
+ .formatted(collectionInstrumentId, interrogationId)
+ );
+ }
+
+ return rawResponses;
+ }
+
@Override
public DataProcessResult processRawResponsesByInterrogationIds(String collectionInstrumentId, List interrogationIdList, List errors) throws GenesisException {
int dataCount=0;
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 0db9a4669..2be5c87fb 100644
--- a/src/main/java/fr/insee/genesis/infrastructure/adapter/LunaticJsonRawDataMongoAdapter.java
+++ b/src/main/java/fr/insee/genesis/infrastructure/adapter/LunaticJsonRawDataMongoAdapter.java
@@ -1,6 +1,8 @@
package fr.insee.genesis.infrastructure.adapter;
import fr.insee.genesis.Constants;
+import fr.insee.genesis.controller.dto.rawdata.RawDataIdentifierDto;
+import fr.insee.genesis.controller.dto.rawdata.RawDataIdentifiersDto;
import fr.insee.genesis.domain.model.surveyunit.GroupedInterrogation;
import fr.insee.genesis.domain.model.surveyunit.Mode;
import fr.insee.genesis.domain.model.surveyunit.rawdata.LunaticJsonRawDataModel;
@@ -73,6 +75,27 @@ public Page findRawDataByQuestionnaireId(String questio
return new PageImpl<>(modelList, rawDataDocsPage.getPageable(), rawDataDocsPage.getTotalElements());
}
+ @Override
+ public RawDataIdentifiersDto findLunaticJsonRawDataIdentifiersByQuestionnaireId(
+ String questionnaireId
+ ) {
+ List lunaticJsonRawDataDocumentList =
+ repository.findByQuestionnaireId(questionnaireId);
+
+ if (lunaticJsonRawDataDocumentList.isEmpty()) {
+ return null;
+ }
+
+ String campaignId = lunaticJsonRawDataDocumentList.getFirst().campaignId();
+
+ List identifiers = lunaticJsonRawDataDocumentList
+ .stream()
+ .map(LunaticJsonRawDataDocumentMapper.INSTANCE::documentToRawDataIdentifierDto)
+ .toList();
+
+ return new RawDataIdentifiersDto(campaignId, identifiers);
+ }
+
@Override
public List findRawDataByInterrogationId(String interrogationId) {
List rawDataDocs = repository.findByInterrogationId(interrogationId);
@@ -88,6 +111,12 @@ public void updateProcessDates(String questionnaireId, Set interrogation
);
}
+ @Override
+ public List findLunaticJsonDataByQuestionnaireIdAndInterrogationId(String questionnaireId, String interrogationId) {
+ List lunaticJsonRawDataDocuments = repository.findByQuestionnaireIdAndInterrogationId(questionnaireId, interrogationId);
+ return LunaticJsonRawDataDocumentMapper.INSTANCE.listDocumentToListModel(lunaticJsonRawDataDocuments);
+ }
+
@Override
public Set findDistinctQuestionnaireIds() {
List ids = mongoTemplate.query(LunaticJsonRawDataDocument.class)
diff --git a/src/main/java/fr/insee/genesis/infrastructure/adapter/RawResponseMongoAdapter.java b/src/main/java/fr/insee/genesis/infrastructure/adapter/RawResponseMongoAdapter.java
index 6460d8557..6f76b51eb 100644
--- a/src/main/java/fr/insee/genesis/infrastructure/adapter/RawResponseMongoAdapter.java
+++ b/src/main/java/fr/insee/genesis/infrastructure/adapter/RawResponseMongoAdapter.java
@@ -1,6 +1,8 @@
package fr.insee.genesis.infrastructure.adapter;
import fr.insee.genesis.Constants;
+import fr.insee.genesis.controller.dto.rawdata.RawDataIdentifierDto;
+import fr.insee.genesis.controller.dto.rawdata.RawDataIdentifiersDto;
import fr.insee.genesis.domain.model.surveyunit.Mode;
import fr.insee.genesis.domain.model.surveyunit.rawdata.RawResponseModel;
import fr.insee.genesis.domain.ports.spi.RawResponsePersistencePort;
@@ -50,6 +52,29 @@ public List findRawResponsesByInterrogationID(String interroga
return RawResponseDocumentMapper.INSTANCE.listDocumentToListModel(rawResponseDocumentList);
}
+ @Override
+ public List findRawResponseByCollectionInstrumentIdAndInterrogationId(String collectionInstrumentId, String interrogationId) {
+ List rawResponseDocuments = repository.findByCollectionInstrumentIdAndInterrogationId(collectionInstrumentId, interrogationId);
+ return RawResponseDocumentMapper.INSTANCE.listDocumentToListModel(rawResponseDocuments);
+ }
+
+ @Override
+ public RawDataIdentifiersDto findRawResponseIdentifiersByCollectionInstrumentId(
+ String collectionInstrumentId
+ ) {
+ List rawResponseDocumentList =
+ repository.findByCollectionInstrumentId(collectionInstrumentId);
+
+ if (rawResponseDocumentList.isEmpty()){
+ return null;
+ }
+
+ List rawDataIdentifierDtoList = rawResponseDocumentList.stream().
+ map(RawResponseDocumentMapper.INSTANCE::documentToRawDataIdentifierDto)
+ .toList();
+ return new RawDataIdentifiersDto(null,rawDataIdentifierDtoList);
+ }
+
@Override
public void updateProcessDates(String collectionInstrumentId, Set interrogationIds) {
mongoTemplate.updateMulti(
diff --git a/src/main/java/fr/insee/genesis/infrastructure/mappers/LunaticJsonRawDataDocumentMapper.java b/src/main/java/fr/insee/genesis/infrastructure/mappers/LunaticJsonRawDataDocumentMapper.java
index 348833f54..e27aac981 100644
--- a/src/main/java/fr/insee/genesis/infrastructure/mappers/LunaticJsonRawDataDocumentMapper.java
+++ b/src/main/java/fr/insee/genesis/infrastructure/mappers/LunaticJsonRawDataDocumentMapper.java
@@ -1,8 +1,10 @@
package fr.insee.genesis.infrastructure.mappers;
+import fr.insee.genesis.controller.dto.rawdata.RawDataIdentifierDto;
import fr.insee.genesis.domain.model.surveyunit.rawdata.LunaticJsonRawDataModel;
import fr.insee.genesis.infrastructure.document.rawdata.LunaticJsonRawDataDocument;
import org.mapstruct.Mapper;
+import org.mapstruct.Mapping;
import org.mapstruct.factory.Mappers;
import java.util.List;
@@ -19,4 +21,8 @@ public interface LunaticJsonRawDataDocumentMapper {
List listDocumentToListModel(List rawDataDocumentList);
List listModelToListDocument(List rawDataModelList);
+
+ @Mapping(target = "usualSurveyUnitId", source = "idUE")
+ RawDataIdentifierDto documentToRawDataIdentifierDto(LunaticJsonRawDataDocument document);
+
}
diff --git a/src/main/java/fr/insee/genesis/infrastructure/mappers/RawResponseDocumentMapper.java b/src/main/java/fr/insee/genesis/infrastructure/mappers/RawResponseDocumentMapper.java
index b2103a663..ae127177a 100644
--- a/src/main/java/fr/insee/genesis/infrastructure/mappers/RawResponseDocumentMapper.java
+++ b/src/main/java/fr/insee/genesis/infrastructure/mappers/RawResponseDocumentMapper.java
@@ -1,12 +1,15 @@
package fr.insee.genesis.infrastructure.mappers;
+import fr.insee.genesis.controller.dto.rawdata.RawDataIdentifierDto;
import fr.insee.genesis.domain.model.surveyunit.Mode;
import fr.insee.genesis.domain.model.surveyunit.rawdata.RawResponseModel;
import fr.insee.genesis.infrastructure.document.rawdata.RawResponseDocument;
import org.mapstruct.Mapper;
+import org.mapstruct.Mapping;
import org.mapstruct.factory.Mappers;
import java.util.List;
+import java.util.Map;
@Mapper
public interface RawResponseDocumentMapper {
@@ -18,6 +21,22 @@ public interface RawResponseDocumentMapper {
List listDocumentToListModel(List documentList);
List listModelToListDocument(List modelList);
+ @Mapping(
+ target = "usualSurveyUnitId",
+ expression = "java(extractUsualSurveyUnitId(document.payload()))"
+ )
+ RawDataIdentifierDto documentToRawDataIdentifierDto(RawResponseDocument document);
+
+ // --- Custom mapping
+ default String extractUsualSurveyUnitId(Map payload) {
+ if (payload == null) {
+ return null;
+ }
+
+ Object value = payload.get("usualSurveyUnitId");
+ return value != null ? value.toString() : null;
+ }
+
// --- Custom mapping: String -> Mode
default Mode stringToMode(String value) {
return Mode.fromString(value); // réutilise ton JsonCreator (parfait)
diff --git a/src/main/java/fr/insee/genesis/infrastructure/repository/LunaticJsonMongoDBRepository.java b/src/main/java/fr/insee/genesis/infrastructure/repository/LunaticJsonMongoDBRepository.java
index a0e1121dd..e945c1f4c 100644
--- a/src/main/java/fr/insee/genesis/infrastructure/repository/LunaticJsonMongoDBRepository.java
+++ b/src/main/java/fr/insee/genesis/infrastructure/repository/LunaticJsonMongoDBRepository.java
@@ -52,7 +52,7 @@ public interface LunaticJsonMongoDBRepository extends MongoRepository findByCampaignIdAndRecordDateBetween(String campagneId, Instant start, Instant end, Pageable pageable);
+ Page findByCampaignIdAndRecordDateBetween(String campaignId, Instant start, Instant end, Pageable pageable);
long countByQuestionnaireId(String questionnaireId);
@Aggregation(pipeline = {
"{ '$match': { 'processDate': { '$gte': ?0 } } }",
@@ -110,8 +110,11 @@ public interface LunaticJsonMongoDBRepository extends MongoRepository findByQuestionnaireId(String questionnaireId, Pageable pageable);
+ List findByQuestionnaireId(String questionnaireId);
+
boolean existsByInterrogationId(String interrogationId);
+ List findByQuestionnaireIdAndInterrogationId(String questionnaireId, String interrogationId);
@Aggregation(pipeline = {
"{ $match: { questionnaireId: ?0, processDate: { $ne: null }, recordDate: { $gte: ?1, $lte: ?2 } } }",
diff --git a/src/main/java/fr/insee/genesis/infrastructure/repository/RawResponseRepository.java b/src/main/java/fr/insee/genesis/infrastructure/repository/RawResponseRepository.java
index f5e91d306..85030b296 100644
--- a/src/main/java/fr/insee/genesis/infrastructure/repository/RawResponseRepository.java
+++ b/src/main/java/fr/insee/genesis/infrastructure/repository/RawResponseRepository.java
@@ -17,6 +17,12 @@ public interface RawResponseRepository extends MongoRepository findByCollectionInstrumentIdAndModeAndInterrogationIdList(String questionnaireId, String mode, List interrogationIdList);
+
+ List findByCollectionInstrumentIdAndInterrogationId(
+ String collectionInstrumentId,
+ String interrogationId
+ );
+
@Aggregation(pipeline = {
"{ $match: { processDate: null, collectionInstrumentId: { $ne: null } } }",
"{ $group: { _id: '$collectionInstrumentId' } }",
@@ -70,6 +76,8 @@ List findProcessedInterrogationIdsByCollectionInstrumentIdAndRecordDateB
List findDistinctCollectionInstrumentId();
Page findByCollectionInstrumentId(String collectionInstrumentId, Pageable pageable);
+ List findByCollectionInstrumentId(String collectionInstrumentId);
+
boolean existsByInterrogationId(String interrogationId);
@Aggregation(pipeline = {
diff --git a/src/test/java/fr/insee/genesis/domain/service/contextualvariable/external/ContextualExternalVariableJsonServiceTest.java b/src/test/java/fr/insee/genesis/domain/service/contextualvariable/external/ContextualExternalVariableJsonServiceTest.java
index 9051cc92e..801ccf432 100644
--- a/src/test/java/fr/insee/genesis/domain/service/contextualvariable/external/ContextualExternalVariableJsonServiceTest.java
+++ b/src/test/java/fr/insee/genesis/domain/service/contextualvariable/external/ContextualExternalVariableJsonServiceTest.java
@@ -76,8 +76,8 @@ void readContextualExternalFile_no_external_test() {
//THEN
Assertions.assertThat(isOK).isFalse();
- verify(contextualExternalVariablePersistancePort, times(0)).backup(collectionInstrumentId);
- verify(contextualExternalVariablePersistancePort, times(0)).delete(collectionInstrumentId);
+ verify(contextualExternalVariablePersistancePort, never()).backup(collectionInstrumentId);
+ verify(contextualExternalVariablePersistancePort, never()).delete(collectionInstrumentId);
verify(contextualExternalVariablePersistancePort, never()).saveAll(anyList());
}
diff --git a/src/test/java/fr/insee/genesis/domain/service/contextualvariable/previous/ContextualPreviousVariableJsonServiceTest.java b/src/test/java/fr/insee/genesis/domain/service/contextualvariable/previous/ContextualPreviousVariableJsonServiceTest.java
index a09636fa6..d4475ad4d 100644
--- a/src/test/java/fr/insee/genesis/domain/service/contextualvariable/previous/ContextualPreviousVariableJsonServiceTest.java
+++ b/src/test/java/fr/insee/genesis/domain/service/contextualvariable/previous/ContextualPreviousVariableJsonServiceTest.java
@@ -80,8 +80,8 @@ void readContextualPreviousFile_no_previous_test() {
//THEN
Assertions.assertThat(isOK).isFalse();
- verify(contextualPreviousVariablePersistancePort, times(0)).backup(collectionInstrumentId);
- verify(contextualPreviousVariablePersistancePort, times(0)).delete(collectionInstrumentId);
+ verify(contextualPreviousVariablePersistancePort, never()).backup(collectionInstrumentId);
+ verify(contextualPreviousVariablePersistancePort, never()).delete(collectionInstrumentId);
verify(contextualPreviousVariablePersistancePort, never()).saveAll(anyList());
}
diff --git a/src/test/java/fr/insee/genesis/domain/service/rawdata/CombinedRawDataServiceTest.java b/src/test/java/fr/insee/genesis/domain/service/rawdata/CombinedRawDataServiceTest.java
index ec04503e8..d18990a7f 100644
--- a/src/test/java/fr/insee/genesis/domain/service/rawdata/CombinedRawDataServiceTest.java
+++ b/src/test/java/fr/insee/genesis/domain/service/rawdata/CombinedRawDataServiceTest.java
@@ -1,11 +1,14 @@
package fr.insee.genesis.domain.service.rawdata;
import fr.insee.genesis.controller.dto.rawdata.CombinedRawDataDto;
+import fr.insee.genesis.controller.dto.rawdata.RawDataIdentifierDto;
+import fr.insee.genesis.controller.dto.rawdata.RawDataIdentifiersDto;
import fr.insee.genesis.domain.model.surveyunit.Mode;
import fr.insee.genesis.domain.model.surveyunit.rawdata.LunaticJsonRawDataModel;
import fr.insee.genesis.domain.model.surveyunit.rawdata.RawResponseModel;
import fr.insee.genesis.domain.ports.spi.LunaticJsonRawDataPersistencePort;
import fr.insee.genesis.domain.ports.spi.RawResponsePersistencePort;
+import fr.insee.genesis.exceptions.NoDataException;
import org.assertj.core.api.Assertions;
import org.bson.types.ObjectId;
import org.junit.jupiter.api.Test;
@@ -92,4 +95,49 @@ void getCombinedRawData_shouldHandleEmptyLists() {
Assertions.assertThat(result.lunaticRawDataModels()).isEmpty();
}
+ @Test
+ void getRawDataIdentifiersByCollectionInstrumentId_shouldReturnRawResponseIdentifiers() throws NoDataException {
+ // GIVEN
+ String collectionInstrumentId = "COLLECTION_1";
+
+ RawDataIdentifiersDto rawResult = new RawDataIdentifiersDto(
+ null,
+ List.of(new RawDataIdentifierDto(
+ "INTERROGATION_1",
+ "SURVEY_UNIT_1",
+ LocalDateTime.now(),
+ null
+ ))
+ );
+
+ Mockito.when(rawResponsePersistencePort.findRawResponseIdentifiersByCollectionInstrumentId(collectionInstrumentId))
+ .thenReturn(rawResult);
+
+ // WHEN
+ RawDataIdentifiersDto result =
+ combinedRawDataService.getRawDataIdentifiersByCollectionInstrumentId(collectionInstrumentId);
+
+ // THEN
+ Assertions.assertThat(result).isEqualTo(rawResult);
+ Mockito.verify(lunaticJsonRawDataPersistencePort, Mockito.never())
+ .findLunaticJsonRawDataIdentifiersByQuestionnaireId(Mockito.anyString());
+ }
+
+ @Test
+ void getRawDataIdentifiersByCollectionInstrumentId_shouldThrowNoDataExceptionWhenNoDataFound() {
+ // GIVEN
+ String collectionInstrumentId = "UNKNOWN";
+
+ Mockito.when(rawResponsePersistencePort.findRawResponseIdentifiersByCollectionInstrumentId(collectionInstrumentId))
+ .thenReturn(null);
+
+ Mockito.when(lunaticJsonRawDataPersistencePort.findLunaticJsonRawDataIdentifiersByQuestionnaireId(collectionInstrumentId))
+ .thenReturn(null);
+
+ // WHEN + THEN
+ Assertions.assertThatThrownBy(() ->
+ combinedRawDataService.getRawDataIdentifiersByCollectionInstrumentId(collectionInstrumentId)
+ ).isInstanceOf(NoDataException.class);
+ }
+
}
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 36b405a52..92cf8afb7 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
@@ -2,6 +2,7 @@
import fr.insee.bpm.metadata.model.MetadataModel;
import fr.insee.bpm.metadata.model.VariablesMap;
+import fr.insee.genesis.TestConstants;
import fr.insee.genesis.configuration.Config;
import fr.insee.genesis.controller.dto.rawdata.LunaticJsonRawDataUnprocessedDto;
import fr.insee.genesis.controller.utils.ControllerUtils;
@@ -21,7 +22,9 @@
import fr.insee.genesis.domain.service.surveyunit.SurveyUnitService;
import fr.insee.genesis.exceptions.GenesisError;
import fr.insee.genesis.exceptions.GenesisException;
+import fr.insee.genesis.exceptions.NoDataException;
import fr.insee.genesis.infrastructure.utils.FileUtils;
+import org.assertj.core.api.Assertions;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Nested;
@@ -49,6 +52,7 @@
import java.util.Map;
import java.util.Set;
+import static fr.insee.genesis.TestConstants.DEFAULT_COLLECTION_INSTRUMENT_ID;
import static fr.insee.genesis.TestConstants.DEFAULT_INTERROGATION_ID;
import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.assertThatThrownBy;
@@ -808,4 +812,44 @@ void findRawDataByCampaignIdAndDate_should_return_page_from_persistance_port(){
);
assertThat(result).isEqualTo(lunaticJsonRawDataModelPage);
}
+
+ @Test
+ @DisplayName("getLunaticJsonDataByQuestionnaireIdAndInterrogationId must call persistence port")
+ void getLunaticJsonDataByQuestionnaireIdAndInterrogationId_shouldDelegateToPersistencePort()
+ throws NoDataException {
+ // GIVEN
+ String interrogationId = TestConstants.DEFAULT_INTERROGATION_ID;
+ String questionnaireId = DEFAULT_COLLECTION_INSTRUMENT_ID;
+
+ LunaticJsonRawDataModel expected = mock(LunaticJsonRawDataModel.class);
+ List expectedList = List.of(expected);
+
+ doReturn(expectedList)
+ .when(lunaticJsonRawDataPersistencePort)
+ .findLunaticJsonDataByQuestionnaireIdAndInterrogationId(questionnaireId, interrogationId);
+
+ // WHEN
+ List result =
+ service.getLunaticJsonDataByQuestionnaireIdAndInterrogationId(questionnaireId, interrogationId);
+
+ // THEN
+ Assertions.assertThat(result).isEqualTo(expectedList);
+ }
+
+ @Test
+ @DisplayName("getLunaticJsonDataByQuestionnaireIdAndInterrogationId must throw NoDataException when no data found")
+ void getLunaticJsonDataByQuestionnaireIdAndInterrogationId_noData_shouldThrowNoDataException() {
+ // GIVEN
+ String interrogationId = TestConstants.DEFAULT_INTERROGATION_ID;
+ String questionnaireId = DEFAULT_COLLECTION_INSTRUMENT_ID;
+
+ doReturn(List.of())
+ .when(lunaticJsonRawDataPersistencePort)
+ .findLunaticJsonDataByQuestionnaireIdAndInterrogationId(questionnaireId, interrogationId);
+
+ // WHEN + THEN
+ Assertions.assertThatThrownBy(() ->
+ service.getLunaticJsonDataByQuestionnaireIdAndInterrogationId(questionnaireId, interrogationId)
+ ).isInstanceOf(NoDataException.class);
+ }
}
\ No newline at end of file
diff --git a/src/test/java/fr/insee/genesis/domain/service/rawdata/RawResponseServiceUnitTest.java b/src/test/java/fr/insee/genesis/domain/service/rawdata/RawResponseServiceUnitTest.java
index e5565f249..5f67283d8 100644
--- a/src/test/java/fr/insee/genesis/domain/service/rawdata/RawResponseServiceUnitTest.java
+++ b/src/test/java/fr/insee/genesis/domain/service/rawdata/RawResponseServiceUnitTest.java
@@ -16,6 +16,7 @@
import fr.insee.genesis.domain.service.surveyunit.SurveyUnitQualityService;
import fr.insee.genesis.domain.service.surveyunit.SurveyUnitService;
import fr.insee.genesis.exceptions.GenesisException;
+import fr.insee.genesis.exceptions.NoDataException;
import fr.insee.genesis.infrastructure.utils.FileUtils;
import fr.insee.modelefiliere.ModeDto;
import fr.insee.modelefiliere.RawResponseDto;
@@ -45,7 +46,9 @@
import java.util.Map;
import java.util.Set;
+import static fr.insee.genesis.TestConstants.DEFAULT_COLLECTION_INSTRUMENT_ID;
import static fr.insee.genesis.TestConstants.DEFAULT_INTERROGATION_ID;
+import static org.assertj.core.api.Assertions.assertThatThrownBy;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.mock;
@@ -662,6 +665,42 @@ void getRawResponsesByInterrogationID_shouldDelegateToPersistencePort() {
Assertions.assertThat(result).isEqualTo(expected);
}
+ @Test
+ @DisplayName("getRawResponseByCollectionInstrumentIdAndInterrogationId must call persistence port")
+ void getRawResponseByCollectionInstrumentIdAndInterrogationId_shouldDelegateToPersistencePort() throws NoDataException {
+ // GIVEN
+ String interrogationId = TestConstants.DEFAULT_INTERROGATION_ID;
+ String collectionInstrumentId = DEFAULT_COLLECTION_INSTRUMENT_ID;
+ List expected = List.of(mock(RawResponseModel.class));
+ doReturn(expected).when(rawResponsePersistencePort).findRawResponseByCollectionInstrumentIdAndInterrogationId(collectionInstrumentId, interrogationId);
+
+ // WHEN
+ List result = rawResponseService.getRawResponseByCollectionInstrumentIdAndInterrogationId(collectionInstrumentId, interrogationId);
+
+ // THEN
+ Assertions.assertThat(result).isEqualTo(expected);
+ }
+
+ @Test
+ @DisplayName("getRawResponseByCollectionInstrumentIdAndInterrogationId must throw NoDataException when no raw response found")
+ void getRawResponseByCollectionInstrumentIdAndInterrogationId_noData_shouldThrowNoDataException() {
+ // GIVEN
+ String interrogationId = TestConstants.DEFAULT_INTERROGATION_ID;
+ String collectionInstrumentId = DEFAULT_COLLECTION_INSTRUMENT_ID;
+
+ doReturn(List.of())
+ .when(rawResponsePersistencePort)
+ .findRawResponseByCollectionInstrumentIdAndInterrogationId(collectionInstrumentId, interrogationId);
+
+ // WHEN + THEN
+ assertThatThrownBy(() ->
+ rawResponseService.getRawResponseByCollectionInstrumentIdAndInterrogationId(
+ collectionInstrumentId,
+ interrogationId
+ )
+ ).isInstanceOf(NoDataException.class);
+ }
+
@Test
@DisplayName("updateProcessDates must call persistence port for each collectionInstrumentId")
void updateProcessDates_shouldCallPersistencePortForEachCollectionInstrument() {
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 180ac1e9b..a1813a719 100644
--- a/src/test/java/fr/insee/genesis/infrastructure/adapter/LunaticJsonRawDataMongoAdapterTest.java
+++ b/src/test/java/fr/insee/genesis/infrastructure/adapter/LunaticJsonRawDataMongoAdapterTest.java
@@ -722,4 +722,35 @@ private LunaticJsonRawDataModel buildModel() {
LocalDateTime.now()
);
}
+
+ @Nested
+ @DisplayName("findLunaticJsonDataByQuestionnaireIdAndInterrogationId() tests")
+ class FindRawDataByQuestionnaireIdAndInterrogationIdTests {
+
+ @Test
+ @DisplayName("Should delegate to repository and return mapped model")
+ void findRawData_shouldReturnMappedModel() {
+ //GIVEN
+ when(repository.findByQuestionnaireIdAndInterrogationId(QUESTIONNAIRE_ID,INTERROGATION_ID))
+ .thenReturn(List.of(getDocument()));
+
+ //WHEN
+ List result = adapter.findLunaticJsonDataByQuestionnaireIdAndInterrogationId(QUESTIONNAIRE_ID,INTERROGATION_ID);
+
+ //THEN
+ assertThat(result).isNotEmpty();
+ verify(repository).findByQuestionnaireIdAndInterrogationId(QUESTIONNAIRE_ID,INTERROGATION_ID);
+ }
+
+ @Test
+ @DisplayName("Should return null when no document found")
+ void findRawData_noDocument_shouldReturnNull() {
+ //GIVEN
+ when(repository.findByQuestionnaireIdAndInterrogationId(QUESTIONNAIRE_ID, INTERROGATION_ID)).thenReturn(null);
+
+ //WHEN + THEN
+ assertThat(adapter.findLunaticJsonDataByQuestionnaireIdAndInterrogationId(QUESTIONNAIRE_ID, INTERROGATION_ID)).isNull();
+ }
+ }
+
}
\ No newline at end of file
diff --git a/src/test/java/fr/insee/genesis/infrastructure/adapter/RawResponseMongoAdapterTest.java b/src/test/java/fr/insee/genesis/infrastructure/adapter/RawResponseMongoAdapterTest.java
index 70c3284fa..927500b89 100644
--- a/src/test/java/fr/insee/genesis/infrastructure/adapter/RawResponseMongoAdapterTest.java
+++ b/src/test/java/fr/insee/genesis/infrastructure/adapter/RawResponseMongoAdapterTest.java
@@ -577,4 +577,35 @@ private RawResponseDocument getDocument() {
LocalDateTime.now()
);
}
+
+ @Nested
+ @DisplayName("findRawResponseByCollectionInstrumentIdAndInterrogationId() tests")
+ class FindRawResponseByCollectionInstrumentIdAndInterrogationIdTests {
+
+ @Test
+ @DisplayName("Should delegate to repository and return mapped model")
+ void findRawData_shouldReturnMappedModel() {
+ //GIVEN
+ when(repository.findByCollectionInstrumentIdAndInterrogationId(COLLECTION_INSTRUMENT_ID, INTERROGATION_ID))
+ .thenReturn(List.of(getDocument()));
+
+ //WHEN
+ List result = adapter.findRawResponseByCollectionInstrumentIdAndInterrogationId(COLLECTION_INSTRUMENT_ID, INTERROGATION_ID);
+
+ //THEN
+ assertThat(result).isNotEmpty();
+ verify(repository).findByCollectionInstrumentIdAndInterrogationId(COLLECTION_INSTRUMENT_ID, INTERROGATION_ID);
+ }
+
+ @Test
+ @DisplayName("Should return null when no document found")
+ void findRawData_noDocument_shouldReturnNull() {
+ //GIVEN
+ when(repository.findByCollectionInstrumentIdAndInterrogationId(COLLECTION_INSTRUMENT_ID, INTERROGATION_ID)).thenReturn(null);
+
+ //WHEN + THEN
+ assertThat(adapter.findRawResponseByCollectionInstrumentIdAndInterrogationId(COLLECTION_INSTRUMENT_ID, INTERROGATION_ID)).isNull();
+ }
+ }
+
}
\ No newline at end of file