Skip to content

Commit 35bba4f

Browse files
Merge pull request #243 from InseeFr/devSonar
Sonar : code quality
2 parents 008bd8a + 57846e1 commit 35bba4f

9 files changed

Lines changed: 115 additions & 52 deletions

File tree

src/main/java/fr/insee/genesis/controller/rest/responses/RawResponseController.java

Lines changed: 39 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -32,13 +32,16 @@
3232
import java.util.List;
3333
import java.util.Map;
3434
import java.util.Set;
35+
import java.util.stream.Collectors;
3536

3637
@Slf4j
3738
@Controller
3839
@RequestMapping(path = "/responses/raw" )
3940
public class RawResponseController {
4041

4142
private static final String SUCCESS_MESSAGE = "Interrogation %s saved";
43+
private static final String PARTITION_ID = "partitionId";
44+
private static final String INTERROGATION_ID = "interrogationId";
4245
private final LunaticJsonRawDataApiPort lunaticJsonRawDataApiPort;
4346

4447
public RawResponseController(LunaticJsonRawDataApiPort lunaticJsonRawDataApiPort) {
@@ -52,7 +55,7 @@ public ResponseEntity<String> saveRawResponsesFromJsonBody(
5255

5356
@RequestParam("campaignName") String campaignName,
5457
@RequestParam("questionnaireId") String questionnaireId,
55-
@RequestParam("interrogationId") String interrogationId,
58+
@RequestParam(INTERROGATION_ID) String interrogationId,
5659
@RequestParam(value = "surveyUnitId", required = false) String idUE,
5760
@RequestParam(value = "mode") Mode modeSpecified,
5861
@RequestBody Map<String, Object> dataJson
@@ -96,12 +99,8 @@ public ResponseEntity<String> saveRawResponsesFromJsonBodyWithValidation(
9699
new ObjectMapper().writeValueAsString(body)
97100
)
98101
);
99-
if(!errors.isEmpty()){
100-
throw new GenesisException(400, "Input data json is not valid \n%s".formatted(
101-
Arrays.toString(errors.toArray()))
102-
);
103-
}
104-
102+
// Throw Genesis exception if errors are present
103+
validate(errors);
105104
//Check required ids
106105
checkRequiredIds(body);
107106
}catch (JsonProcessingException jpe){
@@ -111,9 +110,9 @@ public ResponseEntity<String> saveRawResponsesFromJsonBodyWithValidation(
111110
}
112111

113112
LunaticJsonRawDataModel rawData = LunaticJsonRawDataModel.builder()
114-
.campaignId(body.get("partitionId").toString())
113+
.campaignId(body.get(PARTITION_ID).toString())
115114
.questionnaireId(body.get("questionnaireModelId").toString())
116-
.interrogationId(body.get("interrogationId").toString())
115+
.interrogationId(body.get(INTERROGATION_ID).toString())
117116
.idUE(body.get("surveyUnitId").toString())
118117
.mode(Mode.getEnumFromJsonName(body.get("mode").toString()))
119118
.data(body)
@@ -125,23 +124,9 @@ public ResponseEntity<String> saveRawResponsesFromJsonBodyWithValidation(
125124
return ResponseEntity.status(500).body("Unexpected error");
126125
}
127126

128-
log.info("Data saved for interrogationId {} and partition {}",body.get("interrogationId").toString(),
129-
body.get("partitionId").toString());
130-
return ResponseEntity.status(201).body(String.format(SUCCESS_MESSAGE,body.get("interrogationId").toString()));
131-
}
132-
133-
private void checkRequiredIds(Map<String, Object> body) throws GenesisException {
134-
for(String requiredKey : List.of(
135-
"partitionId",
136-
"questionnaireModelId",
137-
"interrogationId",
138-
"surveyUnitId",
139-
"mode"
140-
)){
141-
if(body.get(requiredKey) == null){
142-
throw new GenesisException(400, "No %s found in body".formatted(requiredKey));
143-
}
144-
}
127+
log.info("Data saved for interrogationId {} and partition {}",body.get(INTERROGATION_ID).toString(),
128+
body.get(PARTITION_ID).toString());
129+
return ResponseEntity.status(201).body(String.format(SUCCESS_MESSAGE,body.get(INTERROGATION_ID).toString()));
145130
}
146131

147132
//GET unprocessed
@@ -157,7 +142,7 @@ public ResponseEntity<List<LunaticJsonRawDataUnprocessedDto>> getUnproccessedJso
157142
@GetMapping(path= "/lunatic-json/get/by-interrogation-mode-and-campaign")
158143
@PreAuthorize("hasRole('ADMIN')")
159144
public ResponseEntity<LunaticJsonRawDataModel> getJsonRawData(
160-
@RequestParam("interrogationId") String interrogationId,
145+
@RequestParam(INTERROGATION_ID) String interrogationId,
161146
@RequestParam("campaignName") String campaignName,
162147
@RequestParam(value = "mode") Mode modeSpecified
163148
){
@@ -188,4 +173,31 @@ public ResponseEntity<String> processJsonRawData(
188173
}
189174
}
190175

176+
private void validate(Set<ValidationMessage> errors) throws GenesisException {
177+
if(!errors.isEmpty()){
178+
String errorMessage = errors.stream()
179+
.map(ValidationMessage::getMessage)
180+
.collect(Collectors.joining(System.lineSeparator() + " - "));
181+
182+
throw new GenesisException(
183+
400,
184+
"Input data JSON is not valid: %n - %s".formatted(errorMessage)
185+
);
186+
}
187+
}
188+
189+
private void checkRequiredIds(Map<String, Object> body) throws GenesisException {
190+
for(String requiredKey : List.of(
191+
PARTITION_ID,
192+
"questionnaireModelId",
193+
INTERROGATION_ID,
194+
"surveyUnitId",
195+
"mode"
196+
)){
197+
if(body.get(requiredKey) == null){
198+
throw new GenesisException(400, "No %s found in body".formatted(requiredKey));
199+
}
200+
}
201+
}
202+
191203
}

src/main/java/fr/insee/genesis/domain/ports/api/SurveyUnitApiPort.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@
66
import fr.insee.genesis.controller.dto.QuestionnaireWithCampaign;
77
import fr.insee.genesis.controller.dto.SurveyUnitDto;
88
import fr.insee.genesis.controller.dto.SurveyUnitInputDto;
9-
import fr.insee.genesis.controller.services.MetadataService;
109
import fr.insee.genesis.domain.model.surveyunit.Mode;
1110
import fr.insee.genesis.domain.model.surveyunit.SurveyUnitModel;
1211
import fr.insee.genesis.exceptions.GenesisException;

src/main/java/fr/insee/genesis/domain/service/context/DataProcessingContextService.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -155,7 +155,7 @@ public DataProcessingContextModel getContext(String interrogationId) throws Gene
155155
return null;
156156
}
157157
if(partitionIds.size() > 1){
158-
throw new GenesisException(500,"Multiple partitions for interrogation %s\n%s".formatted(
158+
throw new GenesisException(500,"Multiple partitions for interrogation %s %n%s".formatted(
159159
interrogationId,
160160
Arrays.toString(partitionIds.toArray())
161161
));

src/main/java/fr/insee/genesis/domain/service/surveyunit/SurveyUnitService.java

Lines changed: 4 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -155,14 +155,8 @@ public List<List<SurveyUnitModel>> findLatestByIdAndByQuestionnaireIdAndModeOrde
155155
List<List<SurveyUnitModel>> listLatestUpdatesbyVariables = new ArrayList<>();
156156

157157
//1) QUERY
158-
// => convertion of "List<InterrogationId>" -> "List<String>" for query using lamda
159-
/*
160-
List<String> queryInParam = new ArrayList<String>();
161-
for(InterrogationId interrId : interrogationIds) {
162-
queryInParam.add(interrId.getInterrogationId());
163-
}
164-
*/
165-
List<String> queryInParam = interrogationIds.stream().map(InterrogationId::getInterrogationId).collect(Collectors.toList());
158+
// => conversion of "List<InterrogationId>" -> "List<String>" for query using lamda
159+
List<String> queryInParam = interrogationIds.stream().map(InterrogationId::getInterrogationId).toList();
166160

167161
//Get !!!all versions!!! of a set of "interrogationIds"
168162
List<SurveyUnitModel> allResponsesVersionsSet = surveyUnitPersistencePort.findBySetOfIdsAndQuestionnaireIdAndMode(questionnaireId, mode, queryInParam);
@@ -174,10 +168,10 @@ public List<List<SurveyUnitModel>> findLatestByIdAndByQuestionnaireIdAndModeOrde
174168
.sorted((o1, o2) -> o2.getRecordDate().compareTo(o1.getRecordDate())) //Sorting update by date (latest updates first by date of upload in database)
175169
.toList();
176170

177-
List<SurveyUnitModel> LatestUpdates = extractLatestUpdates(allResponsesVersionsForSingleInterrId);
171+
List<SurveyUnitModel> latestUpdates = extractLatestUpdates(allResponsesVersionsForSingleInterrId);
178172

179173
//3) add to result (: keep same existing process)
180-
listLatestUpdatesbyVariables.add(LatestUpdates);
174+
listLatestUpdatesbyVariables.add(latestUpdates);
181175
});
182176

183177
return listLatestUpdatesbyVariables;

src/test/java/cucumber/functional_tests/MainDefinitions.java

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
package cucumber.functional_tests;
22

3-
import com.fasterxml.jackson.databind.ObjectMapper;
43
import cucumber.TestConstants;
54
import fr.insee.bpm.exceptions.MetadataParserException;
65
import fr.insee.bpm.metadata.model.VariablesMap;
@@ -328,12 +327,11 @@ public void check_external_variable_content_in_mongo(
328327
}
329328

330329
@Then("If we get latest states for {string} in collected variable {string}, survey unit {string} we should have {string} for iteration {int}")
331-
public void check_latest_state_collected(String questionnaireId, String variableName, String interrogationId, String expectedValue, int iteration) throws GenesisException, IOException {
330+
public void check_latest_state_collected(String questionnaireId, String variableName, String interrogationId, String expectedValue, int iteration) throws GenesisException {
332331
ResponseEntity<Object> response =
333332
responseController.findResponsesByInterrogationAndQuestionnaireLatestStates(interrogationId, questionnaireId);
334333
Assertions.assertThat(response.getStatusCode().value()).isEqualTo(200);
335334

336-
ObjectMapper objectMapper = new ObjectMapper().findAndRegisterModules();
337335
SurveyUnitQualityToolDto surveyUnitQualityToolDto = (SurveyUnitQualityToolDto) response.getBody();
338336

339337
List<VariableQualityToolDto> variableQualityToolDtos = surveyUnitQualityToolDto.getCollectedVariables().stream().filter(
@@ -353,7 +351,7 @@ public void check_latest_state_collected(String questionnaireId, String variable
353351
}
354352

355353
@Then("If we get latest states for {string} in external variable {string}, survey unit {string} we should have {string} for iteration {int}")
356-
public void check_latest_state_external(String questionnaireId, String variableName, String interrogationId, String expectedValue, int iteration) throws IOException, GenesisException {
354+
public void check_latest_state_external(String questionnaireId, String variableName, String interrogationId, String expectedValue, int iteration) throws GenesisException {
357355
ResponseEntity<Object> response =
358356
responseController.findResponsesByInterrogationAndQuestionnaireLatestStates(interrogationId, questionnaireId);
359357
Assertions.assertThat(response.getStatusCode().value()).isEqualTo(200);
@@ -435,7 +433,7 @@ public void check_su_latest_states_collected_variables_volumetry(String interrog
435433
@Then("The extracted survey unit latest states response should have a survey unit DTO has interrogationId " +
436434
"{string}" +
437435
" with {int} external variables")
438-
public void check_su_latest_states_external_variables_volumetry(String interrogationId, int expectedVolumetry) throws IOException {
436+
public void check_su_latest_states_external_variables_volumetry(String interrogationId, int expectedVolumetry) {
439437
Assertions.assertThat(surveyUnitLatestStatesResponse).isNotNull();
440438
Assertions.assertThat(surveyUnitLatestStatesResponse.getBody()).isNotNull();
441439
SurveyUnitQualityToolDto surveyUnitQualityToolDto = (SurveyUnitQualityToolDto) surveyUnitLatestStatesResponse.getBody();

src/test/java/fr/insee/genesis/controller/rest/responses/InterrogationControllerTest.java

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ void reset() throws IOException {
4444

4545

4646
//When + Then
47-
@Test
47+
@Test
4848
void getAllInterrogationIdsByQuestionnaireTest() {
4949
ResponseEntity<List<InterrogationId>> response = interrogationControllerStatic.getAllInterrogationIdsByQuestionnaire(DEFAULT_QUESTIONNAIRE_ID);
5050

@@ -53,6 +53,13 @@ void getAllInterrogationIdsByQuestionnaireTest() {
5353
Assertions.assertThat(response.getBody().getFirst().getInterrogationId()).isEqualTo(DEFAULT_INTERROGATION_ID);
5454
}
5555

56+
@Test
57+
void countAllInterrogationIdsByQuestionnaireTest() {
58+
ResponseEntity<Long> response = interrogationControllerStatic.countAllInterrogationIdsByQuestionnaire(DEFAULT_QUESTIONNAIRE_ID);
5659

60+
Assertions.assertThat(response.getStatusCode().is2xxSuccessful()).isTrue();
61+
Assertions.assertThat(response.getBody()).isNotNull();
62+
Assertions.assertThat(response.getBody()).isEqualTo(1L);
63+
}
5764

5865
}

src/test/java/fr/insee/genesis/controller/rest/responses/ResponseControllerTest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -238,7 +238,7 @@ void getLatestForUEListTest() {
238238

239239
// Perret tests
240240
@Test
241-
void getLatestByStatesSurveyDataTest() throws GenesisException, IOException {
241+
void getLatestByStatesSurveyDataTest() throws GenesisException {
242242
//GIVEN
243243
//Recent Collected already in stub
244244
//Old Collected

src/test/java/fr/insee/genesis/domain/service/context/DataProcessingContextServiceTest.java

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
11
package fr.insee.genesis.domain.service.context;
22

3+
import fr.insee.genesis.domain.model.context.DataProcessingContextModel;
34
import fr.insee.genesis.domain.model.context.schedule.KraftwerkExecutionSchedule;
45
import fr.insee.genesis.domain.model.context.schedule.ServiceToCall;
6+
import fr.insee.genesis.domain.model.surveyunit.SurveyUnitModel;
57
import fr.insee.genesis.exceptions.GenesisException;
68
import fr.insee.genesis.infrastructure.document.context.DataProcessingContextDocument;
79
import fr.insee.genesis.stubs.DataProcessingContextPersistancePortStub;
@@ -15,6 +17,8 @@
1517
import java.util.ArrayList;
1618
import java.util.List;
1719

20+
import static org.junit.jupiter.api.Assertions.assertThrows;
21+
1822
class DataProcessingContextServiceTest {
1923
//Given
2024
static SurveyUnitPersistencePortStub surveyUnitPersistencePortStub;
@@ -32,6 +36,7 @@ static void init(){
3236
@BeforeEach
3337
void reset(){
3438
dataProcessingContextPersistencePortStub.getMongoStub().clear();
39+
surveyUnitPersistencePortStub.getMongoStub().clear();
3540

3641
List<KraftwerkExecutionSchedule> kraftwerkExecutionScheduleList = new ArrayList<>();
3742
kraftwerkExecutionScheduleList.add(new KraftwerkExecutionSchedule(
@@ -182,4 +187,57 @@ void removeExpiredSchedules_test_delete_document() throws GenesisException {
182187
).toList().getFirst().getKraftwerkExecutionScheduleList()).isEmpty();
183188

184189
}
190+
191+
@Test
192+
void getContext_shouldThrow500IfMultiplePartitions() {
193+
// Given
194+
SurveyUnitModel su1 = SurveyUnitModel.builder()
195+
.campaignId("CAMPAIGN1")
196+
.interrogationId("00001")
197+
.build();
198+
SurveyUnitModel su2 = SurveyUnitModel.builder()
199+
.campaignId("CAMPAIGN2")
200+
.interrogationId("00001")
201+
.build();
202+
List<SurveyUnitModel> sus = new ArrayList<>();
203+
sus.add(su1);
204+
sus.add(su2);
205+
surveyUnitPersistencePortStub.saveAll(sus);
206+
207+
// When & Then
208+
GenesisException ex = assertThrows(GenesisException.class, () -> dataProcessingContextService.getContext("00001"));
209+
//To ensure test is portable on Unix/Linux/macOS and windows systems
210+
String normalizedMessage = ex.getMessage().replaceAll("\\r?\\n", "");
211+
Assertions.assertThat(ex.getStatus()).isEqualTo(500);
212+
Assertions.assertThat(normalizedMessage).isEqualTo("Multiple partitions for interrogation 00001 [CAMPAIGN2, CAMPAIGN1]");
213+
}
214+
215+
@Test
216+
void getContext_shouldThrow404IfNoInterrogations() {
217+
// When & Then
218+
GenesisException ex = assertThrows(GenesisException.class, () -> dataProcessingContextService.getContext("00001"));
219+
Assertions.assertThat(ex.getStatus()).isEqualTo(404);
220+
Assertions.assertThat(ex.getMessage()).isEqualTo("No interrogation in database with id 00001");
221+
}
222+
223+
@Test
224+
void getContext_shouldReturnContextIfOnePartition() throws GenesisException {
225+
// Given
226+
SurveyUnitModel su1 = SurveyUnitModel.builder()
227+
.campaignId("TEST")
228+
.interrogationId("00001")
229+
.build();
230+
List<SurveyUnitModel> sus = new ArrayList<>();
231+
sus.add(su1);
232+
surveyUnitPersistencePortStub.saveAll(sus);
233+
DataProcessingContextModel result = dataProcessingContextService.getContext("00001");
234+
235+
// When & Then
236+
Assertions.assertThat(result).isNotNull();
237+
Assertions.assertThat(result.getPartitionId()).isEqualTo("TEST");
238+
Assertions.assertThat(result.isWithReview()).isFalse();
239+
}
240+
241+
242+
185243
}

src/test/java/fr/insee/genesis/stubs/SurveyUnitPersistencePortStub.java

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,6 @@ public List<SurveyUnitModel> findByIds(String interrogationId, String questionna
3535
* @author Adrien Marchal
3636
*/
3737
public List<SurveyUnitModel> findBySetOfIdsAndQuestionnaireIdAndMode(String questionnaireId, String mode, List<String> interrogationIdSet) {
38-
//TODO : TO BE IMPLEMENTED
3938
return new ArrayList<SurveyUnitModel>();
4039
}
4140
//========= OPTIMISATIONS PERFS (START) ==========
@@ -102,11 +101,7 @@ public long countInterrogationIdsByQuestionnaireId(String questionnaireId) {
102101
* @author Adrien Marchal
103102
*/
104103
public List<SurveyUnitModel> findPageableInterrogationIdsByQuestionnaireId(String questionnaireId, Long skip, Long limit) {
105-
List<SurveyUnitModel> surveyUnitModelList = new ArrayList<>();
106-
if(skip < mongoStub.size()) {
107-
108-
}
109-
return surveyUnitModelList;
104+
return List.of();
110105
}
111106
//======= OPTIMISATIONS PERFS (END) =========
112107

0 commit comments

Comments
 (0)