diff --git a/.github/workflows/create-release.yaml b/.github/workflows/create-release.yaml
index 501ccb132..15fa4a697 100644
--- a/.github/workflows/create-release.yaml
+++ b/.github/workflows/create-release.yaml
@@ -71,7 +71,7 @@ jobs:
java-version: '25'
- name: install model filiere
- run: mvn install:install-file -Dfile="$(pwd)/libs/modelefiliere-2.2.2-springboot4.jar" -DgroupId=fr.insee -DartifactId=modelefiliere -Dversion=2.2.2-springboot4 -Dpackaging=jar -DgeneratePom=true
+ run: mvn install:install-file -Dfile="$(pwd)/libs/modelefiliere-2.1.0.jar" -DgroupId=fr.insee -DartifactId=modelefiliere -Dversion=2.1.0 -Dpackaging=jar -DgeneratePom=true
- name: Clone BPM
uses: actions/checkout@v6
@@ -86,7 +86,7 @@ jobs:
cd ..
- uses: actions/checkout@v6
- - name: Build app
+ - name: Build app
run: |
git fetch origin main
git checkout origin/main
@@ -182,4 +182,4 @@ jobs:
password: ${{ secrets.DOCKERHUB_TOKEN }}
default_branch: ${{ github.ref }}
tags: ${{ needs.check-version.outputs.release-tag }}
- workdir: .
+ workdir: .
\ No newline at end of file
diff --git a/.github/workflows/docker.yaml b/.github/workflows/docker.yaml
index 34ef52940..030f04e8c 100644
--- a/.github/workflows/docker.yaml
+++ b/.github/workflows/docker.yaml
@@ -28,7 +28,7 @@ jobs:
java-version: "25"
- name: install model filiere
- run: mvn install:install-file -Dfile="$(pwd)/libs/modelefiliere-2.2.2-springboot4.jar" -DgroupId=fr.insee -DartifactId=modelefiliere -Dversion=2.2.2-springboot4 -Dpackaging=jar -DgeneratePom=true
+ run: mvn install:install-file -Dfile="$(pwd)/libs/modelefiliere-2.1.0.jar" -DgroupId=fr.insee -DartifactId=modelefiliere -Dversion=2.1.0 -Dpackaging=jar -DgeneratePom=true
- name: Clone BPM
uses: actions/checkout@master
diff --git a/.github/workflows/maven.yml b/.github/workflows/maven.yml
index 9fb5dcea9..ca58eeca0 100644
--- a/.github/workflows/maven.yml
+++ b/.github/workflows/maven.yml
@@ -30,7 +30,7 @@ jobs:
cache: maven
- name: install model filiere
- run: mvn install:install-file -Dfile="$(pwd)/libs/modelefiliere-2.2.2-springboot4.jar" -DgroupId=fr.insee -DartifactId=modelefiliere -Dversion=2.2.2-springboot4 -Dpackaging=jar -DgeneratePom=true
+ run: mvn install:install-file -Dfile="$(pwd)/libs/modelefiliere-2.1.0.jar" -DgroupId=fr.insee -DartifactId=modelefiliere -Dversion=2.1.0 -Dpackaging=jar -DgeneratePom=true
- name: Clone BPM
uses: actions/checkout@master
diff --git a/.github/workflows/scheduled-version-update.yaml b/.github/workflows/scheduled-version-update.yaml
index c06fa32c4..29adabad1 100644
--- a/.github/workflows/scheduled-version-update.yaml
+++ b/.github/workflows/scheduled-version-update.yaml
@@ -87,7 +87,7 @@ jobs:
- name: install model filiere
run: |
- mvn install:install-file -Dfile="$(pwd)/genesis/libs/modelefiliere-2.2.2-springboot4.jar" -DgroupId=fr.insee -DartifactId=modelefiliere -Dversion=2.2.2-springboot4 -Dpackaging=jar -DgeneratePom=true
+ mvn install:install-file -Dfile="$(pwd)/genesis/libs/modelefiliere-2.1.0.jar" -DgroupId=fr.insee -DartifactId=modelefiliere -Dversion=2.1.0 -Dpackaging=jar -DgeneratePom=true
- name: Clone BPM
uses: actions/checkout@master
diff --git a/.gitignore b/.gitignore
index 918479bc7..21e24e4c5 100644
--- a/.gitignore
+++ b/.gitignore
@@ -33,7 +33,6 @@ src/bin/
# Package Files #
*.jar
-!libs/*.jar
*.war
*.nar
*.ear
diff --git a/CHANGELOG.md b/CHANGELOG.md
index d6ef84aec..ca2f686e6 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,12 +1,4 @@
# Changelog
-## 2.7.0 [2026-06-18]
-### Changed
-- spring-boot 3.5.14 -> 4.0.6
-
-## 2.6.10 [2026-06-18]
-### Fixed
-- Aligned the conversion logic for multi-iteration variables with single-value variables during collectedVariables creation to avoid unexpected xxx.0 values for INTEGER variables.
-
## 2.6.9 [2026-06-11]
### Fixed
- Delete only expired V2 schedules from dataProcessingContext
diff --git a/libs/modelefiliere-2.1.0.jar b/libs/modelefiliere-2.1.0.jar
new file mode 100644
index 000000000..cadda87eb
Binary files /dev/null and b/libs/modelefiliere-2.1.0.jar differ
diff --git a/libs/modelefiliere-2.2.2-springboot4.jar b/libs/modelefiliere-2.2.2-springboot4.jar
deleted file mode 100644
index 37408feeb..000000000
Binary files a/libs/modelefiliere-2.2.2-springboot4.jar and /dev/null differ
diff --git a/pom.xml b/pom.xml
index 500047373..822310aa2 100644
--- a/pom.xml
+++ b/pom.xml
@@ -4,14 +4,14 @@
4.0.0
fr.insee.genesis
genesis-api
- 2.7.0
+ 2.6.9
jar
genesis-api
org.springframework.boot
spring-boot-starter-parent
- 4.0.6
+ 3.5.14
@@ -20,12 +20,14 @@
10.1.55
3.20.0
+ 5.13.4
+ 2.21.1
1.2.0
- 3.0.3
+ 2.8.17
1.6.3
- 1.25.5
+ 1.25.3
1.2.3
@@ -73,19 +75,10 @@
test
- org.springframework.boot
- spring-boot-starter-security-test
- test
-
-
- org.springframework.boot
- spring-boot-starter-webmvc-test
+ org.springframework.security
+ spring-security-test
test
-
- org.springframework.boot
- spring-boot-starter-actuator
-
@@ -113,7 +106,7 @@
fr.insee
modelefiliere
- 2.2.2-springboot4
+ 2.1.0
diff --git a/src/main/java/fr/insee/genesis/configuration/MongoConfig.java b/src/main/java/fr/insee/genesis/configuration/MongoConfig.java
new file mode 100644
index 000000000..8e693270d
--- /dev/null
+++ b/src/main/java/fr/insee/genesis/configuration/MongoConfig.java
@@ -0,0 +1,19 @@
+package fr.insee.genesis.configuration;
+
+import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.data.mongodb.MongoDatabaseFactory;
+import org.springframework.data.mongodb.MongoTransactionManager;
+import org.springframework.transaction.PlatformTransactionManager;
+
+@Configuration
+public class MongoConfig {
+
+ @Bean
+ @ConditionalOnMissingBean(PlatformTransactionManager.class)
+ MongoTransactionManager transactionManager(MongoDatabaseFactory dbFactory) {
+ return new MongoTransactionManager(dbFactory);
+ }
+
+}
diff --git a/src/main/java/fr/insee/genesis/controller/dto/SurveyUnitInputDto.java b/src/main/java/fr/insee/genesis/controller/dto/SurveyUnitInputDto.java
index c0af750d1..1c7ec8efd 100644
--- a/src/main/java/fr/insee/genesis/controller/dto/SurveyUnitInputDto.java
+++ b/src/main/java/fr/insee/genesis/controller/dto/SurveyUnitInputDto.java
@@ -1,16 +1,12 @@
package fr.insee.genesis.controller.dto;
import fr.insee.genesis.domain.model.surveyunit.Mode;
-import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
-import lombok.NoArgsConstructor;
import java.util.List;
@Builder
-@NoArgsConstructor
-@AllArgsConstructor
@Data
public class SurveyUnitInputDto {
private String questionnaireId;
diff --git a/src/main/java/fr/insee/genesis/controller/rest/LunaticModelController.java b/src/main/java/fr/insee/genesis/controller/rest/LunaticModelController.java
index ed38ccee4..47def0852 100644
--- a/src/main/java/fr/insee/genesis/controller/rest/LunaticModelController.java
+++ b/src/main/java/fr/insee/genesis/controller/rest/LunaticModelController.java
@@ -1,6 +1,7 @@
package fr.insee.genesis.controller.rest;
-import tools.jackson.core.JacksonException;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.ObjectMapper;
import fr.insee.genesis.domain.model.lunaticmodel.LunaticModelModel;
import fr.insee.genesis.domain.ports.api.LunaticModelApiPort;
import fr.insee.genesis.exceptions.GenesisException;
@@ -14,7 +15,6 @@
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
-import tools.jackson.databind.json.JsonMapper;
import java.util.Map;
@@ -45,12 +45,10 @@ public ResponseEntity saveRawResponsesFromJsonBody(
@PreAuthorize("hasRole('READER')")
public ResponseEntity getLunaticModelFromQuestionnaireId(
@RequestParam("questionnaireId") String questionnaireId
- ) throws JacksonException, GenesisException {
+ ) throws JsonProcessingException, GenesisException {
LunaticModelModel lunaticModelModel = lunaticModelApiPort.get(questionnaireId);
- JsonMapper objectMapper = JsonMapper.builder()
- .findAndAddModules()
- .build();
+ ObjectMapper objectMapper = new ObjectMapper().findAndRegisterModules();
return ResponseEntity.ok(objectMapper.writeValueAsString(lunaticModelModel.lunaticModel()));
}
}
diff --git a/src/main/java/fr/insee/genesis/controller/sources/xml/LunaticXmlDataParser.java b/src/main/java/fr/insee/genesis/controller/sources/xml/LunaticXmlDataParser.java
index f09e3f4d9..5250ec43a 100644
--- a/src/main/java/fr/insee/genesis/controller/sources/xml/LunaticXmlDataParser.java
+++ b/src/main/java/fr/insee/genesis/controller/sources/xml/LunaticXmlDataParser.java
@@ -248,7 +248,7 @@ private static void setValues(LunaticXmlCollectedData varData, Node value, List<
varData.setPrevious(valueTypes);
break;
default:
- throw new GenesisException(HttpStatus.LOCKED, "Tag not recognized: " + valueElement.getTagName());
+ throw new GenesisException(HttpStatus.DESTINATION_LOCKED, "Tag not recognized: " + valueElement.getTagName());
}
}
diff --git a/src/main/java/fr/insee/genesis/controller/utils/ExtendedJsonNormalizer.java b/src/main/java/fr/insee/genesis/controller/utils/ExtendedJsonNormalizer.java
index 58226bfc4..6bb1c4bdf 100644
--- a/src/main/java/fr/insee/genesis/controller/utils/ExtendedJsonNormalizer.java
+++ b/src/main/java/fr/insee/genesis/controller/utils/ExtendedJsonNormalizer.java
@@ -1,9 +1,9 @@
package fr.insee.genesis.controller.utils;
-import tools.jackson.databind.node.StringNode;
-import tools.jackson.databind.JsonNode;
-import tools.jackson.databind.node.ArrayNode;
-import tools.jackson.databind.node.ObjectNode;
+import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.databind.node.ArrayNode;
+import com.fasterxml.jackson.databind.node.ObjectNode;
+import com.fasterxml.jackson.databind.node.TextNode;
public class ExtendedJsonNormalizer {
public static final String $_DATE = "$date";
@@ -23,8 +23,8 @@ public static JsonNode normalize(JsonNode node) {
ObjectNode obj = (ObjectNode) node;
if (obj.size() == 1) {
- if (obj.has($_DATE) && obj.get($_DATE).isString()) {
- return StringNode.valueOf(obj.get($_DATE).asString());
+ if (obj.has($_DATE) && obj.get($_DATE).isTextual()) {
+ return TextNode.valueOf(obj.get($_DATE).asText());
}
// if (obj.has("$oid") && obj.get("$oid").isTextual()) {
// return TextNode.valueOf(obj.get("$oid").asText());
@@ -32,11 +32,9 @@ public static JsonNode normalize(JsonNode node) {
}
ObjectNode copy = obj.objectNode();
-
- obj.properties().forEach(e ->
+ obj.fields().forEachRemaining(e ->
copy.set(e.getKey(), normalize(e.getValue()))
);
-
return copy;
}
diff --git a/src/main/java/fr/insee/genesis/domain/converter/rawdata/RawResponseConverter.java b/src/main/java/fr/insee/genesis/domain/converter/rawdata/RawResponseConverter.java
index 199865827..63c10d8a5 100644
--- a/src/main/java/fr/insee/genesis/domain/converter/rawdata/RawResponseConverter.java
+++ b/src/main/java/fr/insee/genesis/domain/converter/rawdata/RawResponseConverter.java
@@ -164,19 +164,16 @@ private static void convertListVar(
VariablesMap variablesMap,
List destination
) {
- if (!(valuesForState instanceof List> values)) {
- throw new IllegalArgumentException("Object is not a List");
- }
-
- int iteration = 1;
- for (Object rawValue : values) {
- String value = rawValue == null ? null : getValueString(rawValue);
+ List values = JsonUtils.asStringList(valuesForState);
- if (value != null && !value.isEmpty()) {
- convertOneVar(variableEntry, value, variablesMap, iteration, destination);
+ if (!values.isEmpty()) {
+ int iteration = 1;
+ for (String value : values) {
+ if (value != null && !value.isEmpty()) {
+ convertOneVar(variableEntry, value, variablesMap, iteration, destination);
+ }
+ iteration++;
}
-
- iteration++;
}
}
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 b0cb90801..d257bf97b 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
@@ -1,6 +1,7 @@
package fr.insee.genesis.domain.service.context;
-import tools.jackson.databind.json.JsonMapper;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
import fr.insee.genesis.Constants;
import fr.insee.genesis.controller.dto.KraftwerkExecutionScheduleInput;
import fr.insee.genesis.controller.dto.rawdata.ScheduleResponseDto;
@@ -282,9 +283,8 @@ public void deleteExpiredSchedules(String logFolder) throws GenesisException {
scheduleName + ".json"
);
- JsonMapper objectMapper = JsonMapper.builder()
- .findAndAddModules()
- .build();
+ ObjectMapper objectMapper = new ObjectMapper().findAndRegisterModules();
+ objectMapper.registerModule(new JavaTimeModule());
String jsonToWrite = objectMapper.writeValueAsString(deletedSchedules);
diff --git a/src/main/java/fr/insee/genesis/domain/service/contextualvariable/external/ContextualExternalVariableJsonService.java b/src/main/java/fr/insee/genesis/domain/service/contextualvariable/external/ContextualExternalVariableJsonService.java
index 93acc58ba..140a367bf 100644
--- a/src/main/java/fr/insee/genesis/domain/service/contextualvariable/external/ContextualExternalVariableJsonService.java
+++ b/src/main/java/fr/insee/genesis/domain/service/contextualvariable/external/ContextualExternalVariableJsonService.java
@@ -1,10 +1,9 @@
package fr.insee.genesis.domain.service.contextualvariable.external;
-import fr.insee.genesis.exceptions.JsonParsingException;
-import tools.jackson.core.JacksonException;
-import tools.jackson.core.JsonParser;
-import tools.jackson.core.json.JsonFactory;
-import tools.jackson.core.JsonToken;
+import com.fasterxml.jackson.core.JsonFactory;
+import com.fasterxml.jackson.core.JsonParseException;
+import com.fasterxml.jackson.core.JsonParser;
+import com.fasterxml.jackson.core.JsonToken;
import fr.insee.genesis.domain.model.contextualvariable.ContextualExternalVariableModel;
import fr.insee.genesis.domain.ports.api.ContextualExternalVariableApiPort;
import fr.insee.genesis.domain.ports.spi.ContextualExternalVariablePersistancePort;
@@ -75,7 +74,7 @@ public boolean readContextualExternalFile(String collectionInstrumentId, String
contextualExternalVariablePersistancePort.deleteBackup(collectionInstrumentId);
return true;
}
- }catch (JacksonException jpe){
+ }catch (JsonParseException jpe){
contextualExternalVariablePersistancePort.restoreBackup(collectionInstrumentId);
throw new GenesisException(HttpStatus.BAD_REQUEST, "JSON Parsing exception : %s".formatted(jpe.toString()));
}catch (IOException ioe){
@@ -91,7 +90,7 @@ public ContextualExternalVariableModel findByCollectionInstrumentIdAndInterrogat
private static boolean goToContextualExternalToken(JsonParser jsonParser) throws IOException {
while (jsonParser.nextToken() != null) {
- if (jsonParser.currentToken() == JsonToken.PROPERTY_NAME
+ if (jsonParser.currentToken() == JsonToken.FIELD_NAME
&& "editedExternal".equals(jsonParser.currentName())) {
return true;
}
@@ -128,7 +127,7 @@ private ContextualExternalVariableModel readNextContextualExternal(JsonParser js
String collectionInstrumentId
) throws IOException {
if(jsonParser.currentToken() != JsonToken.START_OBJECT){
- throw new JsonParsingException("Expected { on line %d, got token %s".formatted(jsonParser.currentLocation().getLineNr(), jsonParser.currentToken()));
+ throw new JsonParseException("Expected { on line %d, got token %s".formatted(jsonParser.currentLocation().getLineNr(), jsonParser.currentToken()));
}
ContextualExternalVariableModel contextualExternalVariableModel = ContextualExternalVariableModel.builder()
.collectionInstrumentId(collectionInstrumentId)
@@ -136,7 +135,7 @@ private ContextualExternalVariableModel readNextContextualExternal(JsonParser js
.build();
jsonParser.nextToken();
while (!jsonParser.currentToken().equals(JsonToken.END_OBJECT)){
- if(jsonParser.currentToken().equals(JsonToken.PROPERTY_NAME) && jsonParser.currentName().equals("interrogationId")){
+ if(jsonParser.currentToken().equals(JsonToken.FIELD_NAME) && jsonParser.currentName().equals("interrogationId")){
jsonParser.nextToken();
contextualExternalVariableModel.setInterrogationId(jsonParser.getText());
jsonParser.nextToken();
diff --git a/src/main/java/fr/insee/genesis/domain/service/contextualvariable/previous/ContextualPreviousVariableJsonService.java b/src/main/java/fr/insee/genesis/domain/service/contextualvariable/previous/ContextualPreviousVariableJsonService.java
index 4a7cd4c35..2599d843f 100644
--- a/src/main/java/fr/insee/genesis/domain/service/contextualvariable/previous/ContextualPreviousVariableJsonService.java
+++ b/src/main/java/fr/insee/genesis/domain/service/contextualvariable/previous/ContextualPreviousVariableJsonService.java
@@ -1,10 +1,9 @@
package fr.insee.genesis.domain.service.contextualvariable.previous;
-import tools.jackson.core.JacksonException;
-import tools.jackson.core.json.JsonFactory;
-import fr.insee.genesis.exceptions.JsonParsingException;
-import tools.jackson.core.JsonParser;
-import tools.jackson.core.JsonToken;
+import com.fasterxml.jackson.core.JsonFactory;
+import com.fasterxml.jackson.core.JsonParseException;
+import com.fasterxml.jackson.core.JsonParser;
+import com.fasterxml.jackson.core.JsonToken;
import fr.insee.genesis.domain.model.contextualvariable.ContextualPreviousVariableModel;
import fr.insee.genesis.domain.ports.api.ContextualPreviousVariableApiPort;
import fr.insee.genesis.domain.ports.spi.ContextualPreviousVariablePersistancePort;
@@ -42,7 +41,7 @@ public boolean readContextualPreviousFile(String collectionInstrumentId,
try(FileInputStream inputStream = new FileInputStream(filePath)){
checkSourceStateLength(sourceState);
- JsonFactory jsonFactory = JsonFactory.builder().build();
+ JsonFactory jsonFactory = new JsonFactory();
try (JsonParser jsonParser = jsonFactory.createParser(inputStream)) {
if (!goToEditedPreviousToken(jsonParser)) {
log.warn("No EditedPrevious part found in file {}", filePath);
@@ -80,7 +79,7 @@ public boolean readContextualPreviousFile(String collectionInstrumentId,
contextualPreviousVariablePersistancePort.deleteBackup(collectionInstrumentId);
return true;
}
- }catch (JacksonException jpe){
+ }catch (JsonParseException jpe){
contextualPreviousVariablePersistancePort.restoreBackup(collectionInstrumentId);
throw new GenesisException(HttpStatus.BAD_REQUEST, "JSON Parsing exception : %s".formatted(jpe.toString()));
}catch (IOException _){
@@ -117,8 +116,8 @@ private static void checkSourceStateLength(String sourceState) throws GenesisExc
private boolean goToEditedPreviousToken(JsonParser jsonParser) throws IOException {
while (jsonParser.nextToken() != null) {
- if (jsonParser.currentToken() == JsonToken.PROPERTY_NAME
- && "editedPrevious".equals(jsonParser.currentName())) {
+ if (jsonParser.currentToken() == JsonToken.FIELD_NAME
+ && "editedPrevious".equals(jsonParser.getCurrentName())) {
return true;
}
}
@@ -130,7 +129,7 @@ private ContextualPreviousVariableModel readNextContextualPrevious(JsonParser js
String sourceState
) throws IOException {
if(jsonParser.currentToken() != JsonToken.START_OBJECT){
- throw new JsonParsingException("Expected { on line %d, got token %s".formatted(jsonParser.currentLocation().getLineNr(), jsonParser.currentToken()));
+ throw new JsonParseException("Expected { on line %d, got token %s".formatted(jsonParser.currentLocation().getLineNr(), jsonParser.currentToken()));
}
ContextualPreviousVariableModel contextualPreviousVariableModel = ContextualPreviousVariableModel.builder()
.collectionInstrumentId(collectionInstrumentId)
@@ -139,7 +138,7 @@ private ContextualPreviousVariableModel readNextContextualPrevious(JsonParser js
.build();
jsonParser.nextToken();
while (!jsonParser.currentToken().equals(JsonToken.END_OBJECT)){
- if(jsonParser.currentToken().equals(JsonToken.PROPERTY_NAME) && jsonParser.currentName().equals("interrogationId")){
+ if(jsonParser.currentToken().equals(JsonToken.FIELD_NAME) && jsonParser.currentName().equals("interrogationId")){
jsonParser.nextToken();
contextualPreviousVariableModel.setInterrogationId(jsonParser.getText());
jsonParser.nextToken();
@@ -175,7 +174,7 @@ private Object readValue(JsonParser jsonParser) throws IOException{
case START_ARRAY -> {
return readArray(jsonParser);
}
- case null, default -> throw new JsonParsingException("Unexpected token %s on line %d".formatted(
+ case null, default -> throw new JsonParseException("Unexpected token %s on line %d".formatted(
jsonParser.currentToken(), jsonParser.currentLocation().getLineNr())
);
}
diff --git a/src/main/java/fr/insee/genesis/domain/utils/JsonUtils.java b/src/main/java/fr/insee/genesis/domain/utils/JsonUtils.java
index add5531da..e2b91c803 100644
--- a/src/main/java/fr/insee/genesis/domain/utils/JsonUtils.java
+++ b/src/main/java/fr/insee/genesis/domain/utils/JsonUtils.java
@@ -1,11 +1,11 @@
package fr.insee.genesis.domain.utils;
-import fr.insee.genesis.exceptions.JsonParsingException;
-import tools.jackson.core.JsonParser;
-import tools.jackson.core.JacksonException;
-import tools.jackson.core.JsonToken;
+import com.fasterxml.jackson.core.JsonParseException;
+import com.fasterxml.jackson.core.JsonParser;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.core.JsonToken;
+import com.fasterxml.jackson.databind.ObjectMapper;
import lombok.experimental.UtilityClass;
-import tools.jackson.databind.json.JsonMapper;
import java.io.IOException;
import java.util.ArrayList;
@@ -14,11 +14,9 @@
@UtilityClass
public class JsonUtils {
- JsonMapper objectMapper = JsonMapper.builder()
- .findAndAddModules()
- .build();
+ private static final ObjectMapper objectMapper = new ObjectMapper().findAndRegisterModules();
- public static Map jsonToMap(String json) throws JacksonException {
+ public static Map jsonToMap(String json) throws JsonProcessingException {
return objectMapper.readValue(json, Map.class);
}
@@ -56,7 +54,7 @@ public static Object readValue(JsonParser jsonParser) throws IOException {
case START_ARRAY -> {
return readArray(jsonParser);
}
- case null, default -> throw new JsonParsingException("Unexpected token %s on line %d".formatted(
+ case null, default -> throw new JsonParseException("Unexpected token %s on line %d".formatted(
jsonParser.currentToken(), jsonParser.currentLocation().getLineNr())
);
}
diff --git a/src/main/java/fr/insee/genesis/exceptions/JsonParsingException.java b/src/main/java/fr/insee/genesis/exceptions/JsonParsingException.java
deleted file mode 100644
index b42d78a40..000000000
--- a/src/main/java/fr/insee/genesis/exceptions/JsonParsingException.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package fr.insee.genesis.exceptions;
-
-import java.io.IOException;
-
-public class JsonParsingException extends IOException {
- public JsonParsingException(String message) {
- super(message);
- }
-}
diff --git a/src/main/java/fr/insee/genesis/infrastructure/adapter/SurveyUnitMongoAdapter.java b/src/main/java/fr/insee/genesis/infrastructure/adapter/SurveyUnitMongoAdapter.java
index 99a01737a..b5aded9e1 100644
--- a/src/main/java/fr/insee/genesis/infrastructure/adapter/SurveyUnitMongoAdapter.java
+++ b/src/main/java/fr/insee/genesis/infrastructure/adapter/SurveyUnitMongoAdapter.java
@@ -1,7 +1,8 @@
package fr.insee.genesis.infrastructure.adapter;
-import tools.jackson.core.JacksonException;
-import tools.jackson.databind.JsonNode;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.databind.ObjectMapper;
import com.mongodb.client.MongoCollection;
import fr.insee.genesis.Constants;
import fr.insee.genesis.domain.model.surveyunit.InterrogationInfo;
@@ -18,7 +19,7 @@
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.stereotype.Service;
-import tools.jackson.databind.json.JsonMapper;
+import org.springframework.transaction.annotation.Transactional;
import java.time.Instant;
import java.time.LocalDateTime;
@@ -45,6 +46,7 @@ public SurveyUnitMongoAdapter(SurveyUnitMongoDBRepository mongoRepository, Mongo
}
@Override
+ @Transactional
public void saveAll(List surveyUnitModels) {
List suList = SurveyUnitDocumentMapper.INSTANCE.listModelToListDocument(surveyUnitModels);
mongoRepository.insert(suList);
@@ -142,13 +144,11 @@ public long count() {
private static @NotNull Set extractQuestionnaireIdsFromJson(Set mongoResponse) {
Set questionnaireIds = new HashSet<>();
for(String line : mongoResponse){
- JsonMapper objectMapper = JsonMapper.builder()
- .findAndAddModules()
- .build();
+ ObjectMapper objectMapper = new ObjectMapper().findAndRegisterModules();
try{
JsonNode jsonNode = objectMapper.readTree(line);
questionnaireIds.add(jsonNode.get(QUESTIONNAIRE_ID).asText());
- }catch (JacksonException e){
+ }catch (JsonProcessingException e){
log.error(e.getMessage());
}
}
diff --git a/src/main/java/fr/insee/genesis/infrastructure/document/surveyunit/SurveyUnitDocument.java b/src/main/java/fr/insee/genesis/infrastructure/document/surveyunit/SurveyUnitDocument.java
index cdf2b7b9d..c51d9cfe7 100644
--- a/src/main/java/fr/insee/genesis/infrastructure/document/surveyunit/SurveyUnitDocument.java
+++ b/src/main/java/fr/insee/genesis/infrastructure/document/surveyunit/SurveyUnitDocument.java
@@ -1,5 +1,6 @@
package fr.insee.genesis.infrastructure.document.surveyunit;
+import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import fr.insee.genesis.Constants;
import fr.insee.modelefiliere.RawResponseDto;
diff --git a/src/main/java/fr/insee/genesis/infrastructure/repository/RawResponseInputRepository.java b/src/main/java/fr/insee/genesis/infrastructure/repository/RawResponseInputRepository.java
index fac05f343..3b324e87e 100644
--- a/src/main/java/fr/insee/genesis/infrastructure/repository/RawResponseInputRepository.java
+++ b/src/main/java/fr/insee/genesis/infrastructure/repository/RawResponseInputRepository.java
@@ -1,7 +1,7 @@
package fr.insee.genesis.infrastructure.repository;
-import tools.jackson.core.JacksonException;
-import tools.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.ObjectMapper;
import fr.insee.modelefiliere.RawResponseDto;
import lombok.RequiredArgsConstructor;
import org.bson.Document;
@@ -35,7 +35,7 @@ public void saveAsRawJson(RawResponseDto dto) {
document.put("recordDate", Instant.now());
document.put("payload", payload);
mongoTemplate.save(document, "rawResponses");
- } catch (JacksonException e) {
+ } catch (JsonProcessingException e) {
throw new RuntimeException(e);
}
diff --git a/src/main/java/fr/insee/genesis/infrastructure/utils/FileUtils.java b/src/main/java/fr/insee/genesis/infrastructure/utils/FileUtils.java
index 445f61858..1e6952291 100644
--- a/src/main/java/fr/insee/genesis/infrastructure/utils/FileUtils.java
+++ b/src/main/java/fr/insee/genesis/infrastructure/utils/FileUtils.java
@@ -1,5 +1,6 @@
package fr.insee.genesis.infrastructure.utils;
+import com.fasterxml.jackson.databind.ObjectMapper;
import fr.insee.genesis.Constants;
import fr.insee.genesis.configuration.Config;
import fr.insee.genesis.domain.model.surveyunit.Mode;
@@ -9,13 +10,8 @@
import lombok.extern.slf4j.Slf4j;
import org.springframework.http.HttpStatus;
import org.springframework.stereotype.Component;
-import tools.jackson.databind.json.JsonMapper;
-import java.io.BufferedWriter;
-import java.io.File;
-import java.io.FileWriter;
-import java.io.IOException;
-import java.io.UncheckedIOException;
+import java.io.*;
import java.nio.file.Files;
import java.nio.file.NoSuchFileException;
import java.nio.file.Path;
@@ -230,9 +226,8 @@ public void writeFile(Path filePath, String fileContent) {
*/
public void writeSuUpdatesInFile(Path filePath, Stream responsesStream) throws IOException {
Files.createDirectories(filePath.getParent());
- JsonMapper objectMapper = JsonMapper.builder()
- .findAndAddModules()
- .build();
+ ObjectMapper objectMapper = new ObjectMapper().findAndRegisterModules();
+ objectMapper.findAndRegisterModules();
try (BufferedWriter writer = new BufferedWriter(new FileWriter(filePath.toFile(), true))) {
writer.write("[");
responsesStream.forEach(response -> {
diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties
index a8cd56ab0..15d29f604 100644
--- a/src/main/resources/application.properties
+++ b/src/main/resources/application.properties
@@ -45,6 +45,6 @@ management.endpoint.health.show-details=always
#--------------------------------------------------------------------------
# Database MongoDB
#--------------------------------------------------------------------------
-spring.mongodb.auto-index-creation=true
-spring.mongodb.uri=mongodb://${fr.insee.genesis.persistence.database.mongodb.username}:${fr.insee.genesis.persistence.database.mongodb.password}@${fr.insee.genesis.persistence.database.mongodb.host1}:${fr.insee.genesis.persistence.database.mongodb.port},${fr.insee.genesis.persistence.database.mongodb.host2}:${fr.insee.genesis.persistence.database.mongodb.port},${fr.insee.genesis.persistence.database.mongodb.host3}:${fr.insee.genesis.persistence.database.mongodb.port}/${fr.insee.genesis.persistence.database.mongodb.database}
+spring.data.mongodb.auto-index-creation=true
+spring.data.mongodb.uri=mongodb://${fr.insee.genesis.persistence.database.mongodb.username}:${fr.insee.genesis.persistence.database.mongodb.password}@${fr.insee.genesis.persistence.database.mongodb.host1}:${fr.insee.genesis.persistence.database.mongodb.port},${fr.insee.genesis.persistence.database.mongodb.host2}:${fr.insee.genesis.persistence.database.mongodb.port},${fr.insee.genesis.persistence.database.mongodb.host3}:${fr.insee.genesis.persistence.database.mongodb.port}/${fr.insee.genesis.persistence.database.mongodb.database}
server.compression.enabled=true
\ No newline at end of file
diff --git a/src/test/java/fr/insee/genesis/TransactionManagerTestConfig.java b/src/test/java/fr/insee/genesis/TransactionManagerTestConfig.java
new file mode 100644
index 000000000..96811f8b2
--- /dev/null
+++ b/src/test/java/fr/insee/genesis/TransactionManagerTestConfig.java
@@ -0,0 +1,15 @@
+package fr.insee.genesis;
+
+import org.mockito.Mockito;
+import org.springframework.boot.test.context.TestConfiguration;
+import org.springframework.context.annotation.Bean;
+import org.springframework.transaction.PlatformTransactionManager;
+
+@TestConfiguration
+public class TransactionManagerTestConfig {
+
+ @Bean
+ PlatformTransactionManager transactionManager() {
+ return Mockito.mock(PlatformTransactionManager.class);
+ }
+}
diff --git a/src/test/java/fr/insee/genesis/controller/IntegrationTestAbstract.java b/src/test/java/fr/insee/genesis/controller/IntegrationTestAbstract.java
index 338e14f00..4b66cf6a3 100644
--- a/src/test/java/fr/insee/genesis/controller/IntegrationTestAbstract.java
+++ b/src/test/java/fr/insee/genesis/controller/IntegrationTestAbstract.java
@@ -1,5 +1,6 @@
package fr.insee.genesis.controller;
+import fr.insee.genesis.TransactionManagerTestConfig;
import fr.insee.genesis.controller.utils.ControllerUtils;
import fr.insee.genesis.domain.ports.spi.SurveyUnitQualityToolPort;
import fr.insee.genesis.infrastructure.repository.ContextualExternalVariableMongoDBRepository;
@@ -14,10 +15,11 @@
import fr.insee.genesis.infrastructure.repository.SurveyUnitMongoDBRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
-import org.springframework.boot.data.mongodb.autoconfigure.DataMongoAutoConfiguration;
-import org.springframework.boot.mongodb.autoconfigure.MongoAutoConfiguration;
+import org.springframework.boot.autoconfigure.data.mongo.MongoDataAutoConfiguration;
+import org.springframework.boot.autoconfigure.mongo.MongoAutoConfiguration;
+import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc;
import org.springframework.boot.test.context.SpringBootTest;
-import org.springframework.boot.webmvc.test.autoconfigure.AutoConfigureMockMvc;
+import org.springframework.context.annotation.Import;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.test.context.ActiveProfiles;
import org.springframework.test.context.TestPropertySource;
@@ -34,7 +36,8 @@
@TestPropertySource(properties = {
"logging.level.=DEBUG"
})
-@EnableAutoConfiguration(exclude = {MongoAutoConfiguration.class, DataMongoAutoConfiguration.class})
+@EnableAutoConfiguration(exclude = {MongoAutoConfiguration.class, MongoDataAutoConfiguration.class})
+@Import(TransactionManagerTestConfig.class)
public abstract class IntegrationTestAbstract {
@Autowired
protected MockMvc mockMvc;
diff --git a/src/test/java/fr/insee/genesis/controller/rest/DataProcessingContextControllerTest.java b/src/test/java/fr/insee/genesis/controller/rest/DataProcessingContextControllerTest.java
index e5d595cc4..40abea177 100644
--- a/src/test/java/fr/insee/genesis/controller/rest/DataProcessingContextControllerTest.java
+++ b/src/test/java/fr/insee/genesis/controller/rest/DataProcessingContextControllerTest.java
@@ -1,7 +1,7 @@
package fr.insee.genesis.controller.rest;
-import org.springframework.boot.webmvc.test.autoconfigure.WebMvcTest;
-import tools.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
import fr.insee.genesis.controller.dto.KraftwerkExecutionScheduleInput;
import fr.insee.genesis.controller.dto.ScheduleRequestDto;
import fr.insee.genesis.controller.dto.rawdata.ScheduleResponseDto;
@@ -20,12 +20,12 @@
import org.junit.jupiter.params.provider.ValueSource;
import org.mockito.ArgumentCaptor;
import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.security.test.context.support.WithMockUser;
import org.springframework.test.context.bean.override.mockito.MockitoBean;
import org.springframework.test.web.servlet.MockMvc;
-import tools.jackson.databind.json.JsonMapper;
import java.time.LocalDateTime;
import java.util.List;
@@ -68,9 +68,8 @@ class DataProcessingContextControllerTest {
@BeforeEach
void setUp() {
- objectMapper = JsonMapper.builder()
- .findAndAddModules()
- .build();
+ objectMapper = new ObjectMapper();
+ objectMapper.registerModule(new JavaTimeModule());
}
@Nested
diff --git a/src/test/java/fr/insee/genesis/controller/rest/HealthCheckControllerTest.java b/src/test/java/fr/insee/genesis/controller/rest/HealthCheckControllerTest.java
index 87cd2daa3..5a19d42f2 100644
--- a/src/test/java/fr/insee/genesis/controller/rest/HealthCheckControllerTest.java
+++ b/src/test/java/fr/insee/genesis/controller/rest/HealthCheckControllerTest.java
@@ -6,7 +6,7 @@
import org.junit.jupiter.api.Nested;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.boot.webmvc.test.autoconfigure.WebMvcTest;
+import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest;
import org.springframework.security.test.context.support.WithMockUser;
import org.springframework.test.context.TestPropertySource;
import org.springframework.test.context.bean.override.mockito.MockitoBean;
diff --git a/src/test/java/fr/insee/genesis/controller/rest/LunaticModelControllerIT.java b/src/test/java/fr/insee/genesis/controller/rest/LunaticModelControllerIT.java
index 69687c07e..8f0f22558 100644
--- a/src/test/java/fr/insee/genesis/controller/rest/LunaticModelControllerIT.java
+++ b/src/test/java/fr/insee/genesis/controller/rest/LunaticModelControllerIT.java
@@ -16,11 +16,12 @@
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.ValueSource;
import org.mockito.ArgumentCaptor;
+import org.mockito.Mock;
import org.springframework.data.mongodb.core.ExecutableUpdateOperation;
import org.springframework.data.mongodb.core.query.CriteriaDefinition;
import org.springframework.data.mongodb.core.query.Update;
import org.springframework.http.MediaType;
-import org.springframework.test.context.bean.override.mockito.MockitoBean;
+import org.springframework.security.test.context.support.WithMockUser;
import org.springframework.test.context.bean.override.mockito.MockitoSpyBean;
import java.nio.file.Files;
@@ -38,7 +39,6 @@
import static org.mockito.Mockito.verifyNoInteractions;
import static org.mockito.Mockito.when;
import static org.springframework.security.test.web.servlet.request.SecurityMockMvcRequestPostProcessors.csrf;
-import static org.springframework.security.test.web.servlet.request.SecurityMockMvcRequestPostProcessors.user;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.put;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath;
@@ -46,13 +46,13 @@
class LunaticModelControllerIT extends IntegrationTestAbstract {
- @MockitoBean
+ @Mock
private ExecutableUpdateOperation.ExecutableUpdate executableUpdate;
- @MockitoBean
+ @Mock
private ExecutableUpdateOperation.UpdateWithUpdate updateWithUpdate;
- @MockitoBean
+ @Mock
private ExecutableUpdateOperation.TerminatingUpdate terminatingUpdate;
@MockitoSpyBean
@@ -76,6 +76,7 @@ class SaveLunaticModelTests{
"specs/LUNATIC-TEST/lunaticlog2021x21_web.json",
"specs/RAWDATATESTCAMPAIGN/WEB/lunaticFAM2025X01.json"
})
+ @WithMockUser(roles = "USER_BACK_OFFICE")
@DisplayName("Lunatic model saving test")
@SneakyThrows
void save_lunaticModel_test(String jsonFilePathString){
@@ -88,7 +89,6 @@ void save_lunaticModel_test(String jsonFilePathString){
//WHEN
mockMvc.perform(put("/lunatic-model/save")
- .with(user("test").roles("USER_BACK_OFFICE"))
.with(csrf())
.param("questionnaireId", questionnaireId)
.contentType(MediaType.APPLICATION_JSON)
@@ -131,6 +131,7 @@ void save_lunaticModel_test(String jsonFilePathString){
//SAD PATH
@Test
+ @WithMockUser(roles = "USER_BACK_OFFICE")
@DisplayName("Lunatic model save invalid syntax")
@SneakyThrows
void save_lunaticModel_syntax_error_test(){
@@ -143,7 +144,6 @@ void save_lunaticModel_syntax_error_test(){
//WHEN + THEN
mockMvc.perform(put("/lunatic-model/save")
- .with(user("test").roles("USER_BACK_OFFICE"))
.with(csrf())
.param("questionnaireId", questionnaireId)
.contentType(MediaType.APPLICATION_JSON)
@@ -159,6 +159,7 @@ class GetLunaticModelTests{
//HAPPY PATH
@Test
@DisplayName("Get Lunatic model test")
+ @WithMockUser(roles = "READER")
@SneakyThrows
void get_lunaticModel_test(){
//GIVEN
@@ -179,7 +180,6 @@ void get_lunaticModel_test(){
//WHEN + THEN
mockMvc.perform(get("/lunatic-model/get")
- .with(user("test").roles("READER"))
.with(csrf())
.param("questionnaireId", collectionInstrumentId))
.andExpect(status().isOk())
@@ -189,12 +189,14 @@ void get_lunaticModel_test(){
//BAD PATHS
@Test
@DisplayName("Get non existent Lunatic model")
+ @WithMockUser(roles = "READER")
@SneakyThrows
- void get_lunaticModel_not_found_test() {
+ void get_lunaticModel_not_found_test(){
+ //GIVEN
String collectionInstrumentId = "collectionInstrumentId";
+ //WHEN + THEN
mockMvc.perform(get("/lunatic-model/get")
- .with(user("test").roles("READER"))
.with(csrf())
.param("questionnaireId", collectionInstrumentId))
.andExpect(status().isNotFound());
diff --git a/src/test/java/fr/insee/genesis/controller/rest/LunaticModelControllerTest.java b/src/test/java/fr/insee/genesis/controller/rest/LunaticModelControllerTest.java
index 09d688b50..5ab280608 100644
--- a/src/test/java/fr/insee/genesis/controller/rest/LunaticModelControllerTest.java
+++ b/src/test/java/fr/insee/genesis/controller/rest/LunaticModelControllerTest.java
@@ -1,6 +1,6 @@
package fr.insee.genesis.controller.rest;
-import tools.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.ObjectMapper;
import fr.insee.genesis.domain.model.lunaticmodel.LunaticModelModel;
import fr.insee.genesis.domain.ports.api.LunaticModelApiPort;
import lombok.SneakyThrows;
@@ -11,7 +11,6 @@
import org.mockito.Mock;
import org.mockito.junit.jupiter.MockitoExtension;
import org.springframework.http.ResponseEntity;
-import tools.jackson.databind.json.JsonMapper;
import java.time.LocalDateTime;
import java.util.HashMap;
@@ -51,9 +50,7 @@ void saveRawResponsesFromJsonBody() {
void getLunaticModelFromQuestionnaireId() {
//GIVEN
String questionnaireId = "test";
- JsonMapper objectMapper = JsonMapper.builder()
- .findAndAddModules()
- .build();
+ ObjectMapper objectMapper = new ObjectMapper().findAndRegisterModules();
Map lunaticModel = new HashMap<>();
String expected = objectMapper.writeValueAsString(lunaticModel);
doReturn(LunaticModelModel.builder()
diff --git a/src/test/java/fr/insee/genesis/controller/rest/responses/RawResponseControllerIT.java b/src/test/java/fr/insee/genesis/controller/rest/responses/RawResponseControllerIT.java
index 782e87c7b..db58fdfb3 100644
--- a/src/test/java/fr/insee/genesis/controller/rest/responses/RawResponseControllerIT.java
+++ b/src/test/java/fr/insee/genesis/controller/rest/responses/RawResponseControllerIT.java
@@ -1,7 +1,7 @@
package fr.insee.genesis.controller.rest.responses;
-import tools.jackson.databind.JsonNode;
-import tools.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.databind.ObjectMapper;
import fr.insee.bpm.metadata.model.MetadataModel;
import fr.insee.bpm.metadata.model.Variable;
import fr.insee.bpm.metadata.model.VariableType;
@@ -32,7 +32,6 @@
import org.springframework.http.MediaType;
import org.springframework.security.test.context.support.WithMockUser;
import org.springframework.test.context.bean.override.mockito.MockitoSpyBean;
-import tools.jackson.databind.json.JsonMapper;
import java.nio.file.Files;
import java.nio.file.Path;
@@ -70,9 +69,8 @@ class RawResponseControllerIT extends IntegrationTestAbstract {
@BeforeEach
void init(){
- objectMapper = JsonMapper.builder()
- .findAndAddModules()
- .build();
+ objectMapper = new ObjectMapper();
+ objectMapper.findAndRegisterModules();
}
diff --git a/src/test/java/fr/insee/genesis/controller/rest/responses/RawResponseControllerTest.java b/src/test/java/fr/insee/genesis/controller/rest/responses/RawResponseControllerTest.java
index b32bad06f..832b278bd 100644
--- a/src/test/java/fr/insee/genesis/controller/rest/responses/RawResponseControllerTest.java
+++ b/src/test/java/fr/insee/genesis/controller/rest/responses/RawResponseControllerTest.java
@@ -1,5 +1,6 @@
package fr.insee.genesis.controller.rest.responses;
+import fr.insee.genesis.TransactionManagerTestConfig;
import fr.insee.genesis.configuration.auth.security.DefaultSecurityConfig;
import fr.insee.genesis.domain.model.surveyunit.Mode;
import fr.insee.genesis.domain.model.surveyunit.rawdata.DataProcessResult;
@@ -16,10 +17,10 @@
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
-import org.springframework.boot.data.mongodb.autoconfigure.DataMongoAutoConfiguration;
-import org.springframework.boot.mongodb.autoconfigure.MongoAutoConfiguration;
-import org.springframework.boot.webmvc.test.autoconfigure.AutoConfigureMockMvc;
-import org.springframework.boot.webmvc.test.autoconfigure.WebMvcTest;
+import org.springframework.boot.autoconfigure.data.mongo.MongoDataAutoConfiguration;
+import org.springframework.boot.autoconfigure.mongo.MongoAutoConfiguration;
+import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc;
+import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest;
import org.springframework.context.annotation.Import;
import org.springframework.data.domain.PageImpl;
import org.springframework.data.domain.PageRequest;
@@ -59,10 +60,10 @@
@TestPropertySource(properties = {
"fr.insee.genesis.authentication=NONE"
})
-@Import({DefaultSecurityConfig.class})
+@Import({DefaultSecurityConfig.class, TransactionManagerTestConfig.class})
@ActiveProfiles("test")
@AutoConfigureMockMvc
-@EnableAutoConfiguration(exclude = {MongoAutoConfiguration.class, DataMongoAutoConfiguration.class})
+@EnableAutoConfiguration(exclude = {MongoAutoConfiguration.class, MongoDataAutoConfiguration.class})
class RawResponseControllerTest {
@Autowired
diff --git a/src/test/java/fr/insee/genesis/controller/rest/responses/ResponseControllerTest.java b/src/test/java/fr/insee/genesis/controller/rest/responses/ResponseControllerTest.java
index 5238e827b..c943fdbc7 100644
--- a/src/test/java/fr/insee/genesis/controller/rest/responses/ResponseControllerTest.java
+++ b/src/test/java/fr/insee/genesis/controller/rest/responses/ResponseControllerTest.java
@@ -2,6 +2,7 @@
import fr.insee.bpm.metadata.model.MetadataModel;
import fr.insee.bpm.metadata.model.VariablesMap;
+import fr.insee.genesis.TransactionManagerTestConfig;
import fr.insee.genesis.configuration.auth.security.DefaultSecurityConfig;
import fr.insee.genesis.controller.dto.SurveyUnitDto;
import fr.insee.genesis.controller.dto.SurveyUnitSimplifiedDto;
@@ -25,10 +26,10 @@
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
-import org.springframework.boot.data.mongodb.autoconfigure.DataMongoAutoConfiguration;
-import org.springframework.boot.mongodb.autoconfigure.MongoAutoConfiguration;
-import org.springframework.boot.webmvc.test.autoconfigure.AutoConfigureMockMvc;
-import org.springframework.boot.webmvc.test.autoconfigure.WebMvcTest;
+import org.springframework.boot.autoconfigure.data.mongo.MongoDataAutoConfiguration;
+import org.springframework.boot.autoconfigure.mongo.MongoAutoConfiguration;
+import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc;
+import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest;
import org.springframework.context.annotation.Import;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
@@ -59,10 +60,10 @@
@TestPropertySource(properties = {
"fr.insee.genesis.authentication=NONE"
})
-@Import({DefaultSecurityConfig.class})
+@Import({DefaultSecurityConfig.class, TransactionManagerTestConfig.class})
@ActiveProfiles("test")
@AutoConfigureMockMvc
-@EnableAutoConfiguration(exclude = {MongoAutoConfiguration.class, DataMongoAutoConfiguration.class})
+@EnableAutoConfiguration(exclude = {MongoAutoConfiguration.class, MongoDataAutoConfiguration.class})
class ResponseControllerTest {
@Autowired
diff --git a/src/test/java/fr/insee/genesis/domain/utils/JsonUtilsTest.java b/src/test/java/fr/insee/genesis/domain/utils/JsonUtilsTest.java
index 0a934d73d..01d1a880d 100644
--- a/src/test/java/fr/insee/genesis/domain/utils/JsonUtilsTest.java
+++ b/src/test/java/fr/insee/genesis/domain/utils/JsonUtilsTest.java
@@ -1,6 +1,6 @@
package fr.insee.genesis.domain.utils;
-import tools.jackson.core.JacksonException;
+import com.fasterxml.jackson.core.JsonProcessingException;
import lombok.extern.slf4j.Slf4j;
import org.assertj.core.api.Assertions;
import org.junit.jupiter.api.Test;
@@ -31,7 +31,7 @@ void jsonToMap_shouldThrowExceptionForInvalidJson() {
String invalidJson = "{key1: value1, key2: }";
assertThatThrownBy(() -> JsonUtils.jsonToMap(invalidJson))
- .isInstanceOf(JacksonException.class);
+ .isInstanceOf(JsonProcessingException.class);
}
@Test
diff --git a/src/test/java/fr/insee/genesis/infrastructure/adapter/SurveyUnitMongoAdapterTest.java b/src/test/java/fr/insee/genesis/infrastructure/adapter/SurveyUnitMongoAdapterTest.java
index d7aaf8ee4..a4fecdf7f 100644
--- a/src/test/java/fr/insee/genesis/infrastructure/adapter/SurveyUnitMongoAdapterTest.java
+++ b/src/test/java/fr/insee/genesis/infrastructure/adapter/SurveyUnitMongoAdapterTest.java
@@ -18,7 +18,9 @@
import org.mockito.Mockito;
import org.mockito.junit.jupiter.MockitoExtension;
import org.springframework.data.mongodb.core.MongoTemplate;
+import org.springframework.transaction.annotation.Transactional;
+import java.lang.reflect.Method;
import java.time.Instant;
import java.time.LocalDateTime;
import java.util.List;
@@ -90,6 +92,15 @@ void saveAll_shouldMapAllModels() {
verify(mongoRepository).insert(captor.capture());
assertThat(captor.getValue()).hasSize(3);
}
+
+ @Test
+ @DisplayName("saveAll() should be annotated with @Transactional")
+ void saveAll_shouldBeTransactional() throws NoSuchMethodException {
+ Method method = SurveyUnitMongoAdapter.class.getMethod("saveAll", List.class);
+ assertThat(method.isAnnotationPresent(Transactional.class)).isTrue();
+ }
+
+
}
@Nested
diff --git a/src/test/java/fr/insee/genesis/infrastructure/repository/RawResponseInputRepositoryTest.java b/src/test/java/fr/insee/genesis/infrastructure/repository/RawResponseInputRepositoryTest.java
index a302c6ceb..27f778331 100644
--- a/src/test/java/fr/insee/genesis/infrastructure/repository/RawResponseInputRepositoryTest.java
+++ b/src/test/java/fr/insee/genesis/infrastructure/repository/RawResponseInputRepositoryTest.java
@@ -1,7 +1,7 @@
package fr.insee.genesis.infrastructure.repository;
-import tools.jackson.core.JacksonException;
-import tools.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.ObjectMapper;
import fr.insee.modelefiliere.ModeDto;
import fr.insee.modelefiliere.RawResponseDto;
import org.junit.jupiter.api.DisplayName;
@@ -49,7 +49,7 @@ class SaveAsRawJsonTests {
@Test
@DisplayName("Should serialize the DTO to JSON and save to the correct collection")
- void saveAsRawJson_shouldSerializeAndSave() throws JacksonException {
+ void saveAsRawJson_shouldSerializeAndSave() throws JsonProcessingException {
// GIVEN
RawResponseDto dto = buildDto();
when(objectMapper.writeValueAsString(dto)).thenReturn("{\"interrogationId\":\"interrogation-123\"}");
@@ -64,7 +64,7 @@ void saveAsRawJson_shouldSerializeAndSave() throws JacksonException {
@Test
@DisplayName("Should save a document containing interrogationId")
- void saveAsRawJson_documentShouldContainInterrogationId() throws JacksonException {
+ void saveAsRawJson_documentShouldContainInterrogationId() throws JsonProcessingException {
// GIVEN
RawResponseDto dto = buildDto();
when(objectMapper.writeValueAsString(dto)).thenReturn("{}");
@@ -81,7 +81,7 @@ void saveAsRawJson_documentShouldContainInterrogationId() throws JacksonExceptio
@Test
@DisplayName("Should save a document containing collectionInstrumentId")
- void saveAsRawJson_documentShouldContainCollectionInstrumentId() throws JacksonException {
+ void saveAsRawJson_documentShouldContainCollectionInstrumentId() throws JsonProcessingException {
// GIVEN
RawResponseDto dto = buildDto();
when(objectMapper.writeValueAsString(dto)).thenReturn("{}");
@@ -98,7 +98,7 @@ void saveAsRawJson_documentShouldContainCollectionInstrumentId() throws JacksonE
@Test
@DisplayName("Should save a document containing mode")
- void saveAsRawJson_documentShouldContainMode() throws JacksonException {
+ void saveAsRawJson_documentShouldContainMode() throws JsonProcessingException {
// GIVEN
RawResponseDto dto = buildDto();
when(objectMapper.writeValueAsString(dto)).thenReturn("{}");
@@ -115,7 +115,7 @@ void saveAsRawJson_documentShouldContainMode() throws JacksonException {
@Test
@DisplayName("Should save a document containing a non-null recordDate")
- void saveAsRawJson_documentShouldContainRecordDate() throws JacksonException {
+ void saveAsRawJson_documentShouldContainRecordDate() throws JsonProcessingException {
// GIVEN
RawResponseDto dto = buildDto();
when(objectMapper.writeValueAsString(dto)).thenReturn("{}");
@@ -133,7 +133,7 @@ void saveAsRawJson_documentShouldContainRecordDate() throws JacksonException {
@Test
@DisplayName("Should save a document containing a non-null payload")
- void saveAsRawJson_documentShouldContainPayload() throws JacksonException {
+ void saveAsRawJson_documentShouldContainPayload() throws JsonProcessingException {
// GIVEN
RawResponseDto dto = buildDto();
when(objectMapper.writeValueAsString(dto))
@@ -152,7 +152,7 @@ void saveAsRawJson_documentShouldContainPayload() throws JacksonException {
@Test
@DisplayName("Should save to the 'rawResponses' collection exactly")
- void saveAsRawJson_shouldSaveToCorrectCollection() throws JacksonException {
+ void saveAsRawJson_shouldSaveToCorrectCollection() throws JsonProcessingException {
// GIVEN
RawResponseDto dto = buildDto();
when(objectMapper.writeValueAsString(dto)).thenReturn("{}");
@@ -168,7 +168,7 @@ void saveAsRawJson_shouldSaveToCorrectCollection() throws JacksonException {
@Test
@DisplayName("Should call mongoTemplate.save() exactly once")
- void saveAsRawJson_shouldCallSaveExactlyOnce() throws JacksonException {
+ void saveAsRawJson_shouldCallSaveExactlyOnce() throws JsonProcessingException {
// GIVEN
RawResponseDto dto = buildDto();
when(objectMapper.writeValueAsString(dto)).thenReturn("{}");
@@ -183,26 +183,26 @@ void saveAsRawJson_shouldCallSaveExactlyOnce() throws JacksonException {
@Test
@DisplayName("Should wrap JsonProcessingException in RuntimeException")
- void saveAsRawJson_jsonProcessingException_shouldThrowRuntimeException() throws JacksonException {
+ void saveAsRawJson_jsonProcessingException_shouldThrowRuntimeException() throws JsonProcessingException {
// GIVEN
RawResponseDto dto = buildDto();
when(objectMapper.writeValueAsString(dto))
- .thenThrow(new JacksonException("serialization error") {});
+ .thenThrow(new JsonProcessingException("serialization error") {});
// WHEN / THEN
assertThatThrownBy(() -> repository.saveAsRawJson(dto))
.isInstanceOf(RuntimeException.class)
- .hasCauseInstanceOf(JacksonException.class)
+ .hasCauseInstanceOf(JsonProcessingException.class)
.hasRootCauseMessage("serialization error");
}
@Test
@DisplayName("Should not call mongoTemplate when serialization fails")
- void saveAsRawJson_jsonProcessingException_shouldNotCallMongoTemplate() throws JacksonException {
+ void saveAsRawJson_jsonProcessingException_shouldNotCallMongoTemplate() throws JsonProcessingException {
// GIVEN
RawResponseDto dto = buildDto();
when(objectMapper.writeValueAsString(dto))
- .thenThrow(new JacksonException("serialization error") {});
+ .thenThrow(new JsonProcessingException("serialization error") {});
// WHEN
try {