diff --git a/CHANGELOG.md b/CHANGELOG.md index d51ba792..b832fcd7 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/src/main/java/fr/insee/genesis/configuration/LogRequestFilter.java b/src/main/java/fr/insee/genesis/configuration/LogRequestFilter.java new file mode 100644 index 00000000..e69de29b 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 00000000..7fb8a802 --- /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 00000000..54b689e5 --- /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 afa7389f..866bb4f2 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 f809e1ec..caeafb1a 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/collection-instruments/{collectionInstrumentId}/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 c66040a0..00000000 --- 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 00000000..2422078d --- /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 df3e73f1..4b263455 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); - + LunaticJsonRawDataModel 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 7771031d..df0b0ccb 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); + RawResponseModel 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 0dca5173..537379fa 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); + LunaticJsonRawDataModel 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 02a80860..8f983397 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); + RawResponseModel 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 8f57440b..001bbc92 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 782ca741..351f4571 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 7cf627cf..edd821ba 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 LunaticJsonRawDataModel getLunaticJsonDataByQuestionnaireIdAndInterrogationId(String questionnaireId, String interrogationId) throws NoDataException { + + LunaticJsonRawDataModel lunaticJsonRawDataModel = lunaticJsonRawDataPersistencePort.findLunaticJsonDataByQuestionnaireIdAndInterrogationId(questionnaireId, interrogationId); + if(lunaticJsonRawDataModel == null){ + throw new NoDataException( + "No lunatic JSON data found for questionnaireId=%s and interrogationId=%s" + .formatted(questionnaireId, interrogationId) + ); + } + return lunaticJsonRawDataModel; + } + @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 48d9ec96..1d7bb6e0 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 RawResponseModel getRawResponseByCollectionInstrumentIdAndInterrogationId( + String collectionInstrumentId, + String interrogationId + ) throws NoDataException { + RawResponseModel rawResponse = rawResponsePersistencePort + .findRawResponseByCollectionInstrumentIdAndInterrogationId( + collectionInstrumentId, + interrogationId + ); + + if (rawResponse == null) { + throw new NoDataException( + "No raw response found for collectionInstrumentId=%s and interrogationId=%s" + .formatted(collectionInstrumentId, interrogationId) + ); + } + + return rawResponse; + } + @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 0db9a466..b5f14a41 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 LunaticJsonRawDataModel findLunaticJsonDataByQuestionnaireIdAndInterrogationId(String questionnaireId, String interrogationId) { + LunaticJsonRawDataDocument lunaticJsonRawDataDocument = repository.findByQuestionnaireIdAndInterrogationId(questionnaireId, interrogationId); + return LunaticJsonRawDataDocumentMapper.INSTANCE.documentToModel(lunaticJsonRawDataDocument); + } + @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 6460d855..1c6ff311 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 RawResponseModel findRawResponseByCollectionInstrumentIdAndInterrogationId(String collectionInstrumentId, String interrogationId) { + RawResponseDocument rawResponseDocument = repository.findByCollectionInstrumentIdAndInterrogationId(collectionInstrumentId, interrogationId); + return RawResponseDocumentMapper.INSTANCE.documentToModel(rawResponseDocument); + } + + @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 348833f5..e27aac98 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 b2103a66..ae127177 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 a0e1121d..9d9ccdbc 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); + LunaticJsonRawDataDocument 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 f5e91d30..10539672 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); + + RawResponseDocument 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 9051cc92..801ccf43 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 a09636fa..d4475ad4 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 ec04503e..0878c5a5 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, 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 36b405a5..3968e6cc 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,40 @@ 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 collectionInstrumentId = DEFAULT_COLLECTION_INSTRUMENT_ID; + LunaticJsonRawDataModel expected = mock(LunaticJsonRawDataModel.class); + doReturn(expected).when(lunaticJsonRawDataPersistencePort).findLunaticJsonDataByQuestionnaireIdAndInterrogationId(collectionInstrumentId, interrogationId); + + // WHEN + LunaticJsonRawDataModel result = service.getLunaticJsonDataByQuestionnaireIdAndInterrogationId(collectionInstrumentId, interrogationId); + + // THEN + Assertions.assertThat(result).isEqualTo(expected); + } + + @Test + @DisplayName("getLunaticJsonDataByQuestionnaireIdAndInterrogationId must throw NoDataException when no lunaticJson data found") + void getLunaticJsonDataByQuestionnaireIdAndInterrogationId_noData_shouldThrowNoDataException() { + // GIVEN + String interrogationId = TestConstants.DEFAULT_INTERROGATION_ID; + String collectionInstrumentId = DEFAULT_COLLECTION_INSTRUMENT_ID; + + doReturn(null) + .when(lunaticJsonRawDataPersistencePort) + .findLunaticJsonDataByQuestionnaireIdAndInterrogationId(collectionInstrumentId, interrogationId); + + // WHEN + THEN + assertThatThrownBy(() -> + service.getLunaticJsonDataByQuestionnaireIdAndInterrogationId( + collectionInstrumentId, + 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 e5565f24..99462264 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; + RawResponseModel expected = mock(RawResponseModel.class); + doReturn(expected).when(rawResponsePersistencePort).findRawResponseByCollectionInstrumentIdAndInterrogationId(collectionInstrumentId, interrogationId); + + // WHEN + RawResponseModel 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(null) + .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 180ac1e9..26a223a3 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(getDocument()); + + //WHEN + LunaticJsonRawDataModel result = adapter.findLunaticJsonDataByQuestionnaireIdAndInterrogationId(QUESTIONNAIRE_ID,INTERROGATION_ID); + + //THEN + assertThat(result).isNotNull(); + 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 70c3284f..32d26a6a 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(getDocument()); + + //WHEN + RawResponseModel result = adapter.findRawResponseByCollectionInstrumentIdAndInterrogationId(COLLECTION_INSTRUMENT_ID, INTERROGATION_ID); + + //THEN + assertThat(result).isNotNull(); + 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