diff --git a/pom.xml b/pom.xml index b234cacba..a6f55fc6b 100644 --- a/pom.xml +++ b/pom.xml @@ -99,7 +99,7 @@ pom import - + org.gridsuite diff --git a/src/main/java/org/gridsuite/modification/server/NetworkModificationServerException.java b/src/main/java/org/gridsuite/modification/server/NetworkModificationServerException.java index 519575c84..f14199fb8 100644 --- a/src/main/java/org/gridsuite/modification/server/NetworkModificationServerException.java +++ b/src/main/java/org/gridsuite/modification/server/NetworkModificationServerException.java @@ -6,61 +6,12 @@ */ package org.gridsuite.modification.server; -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.powsybl.commons.PowsyblException; -import lombok.Getter; -import lombok.extern.slf4j.Slf4j; -import org.gridsuite.modification.NetworkModificationException; -import org.springframework.http.HttpStatus; -import org.springframework.web.client.HttpStatusCodeException; - -import java.util.Objects; - /** * @author Slimane Amar */ -@Slf4j -public class NetworkModificationServerException extends PowsyblException { - public enum Type { - DUPLICATION_ARGUMENT_INVALID(HttpStatus.BAD_REQUEST, "Invalid argument for duplication"); - - public final HttpStatus status; - private final String message; - - Type(HttpStatus status, String message) { - this.status = status; - this.message = message; - } - } - - @Getter - private final Type type; - - public NetworkModificationServerException(Type type) { - super(Objects.requireNonNull(type.name()) + ((type.message == null) ? "" : " : " + type.message)); - this.type = type; - } - - public static NetworkModificationException handleChangeError(HttpStatusCodeException httpException, NetworkModificationException.Type type) { - String responseBody = httpException.getResponseBodyAsString(); - if (responseBody.isEmpty()) { - return new NetworkModificationException(type, httpException.getStatusCode().toString()); - } - - String message = responseBody; - try { - JsonNode node = new ObjectMapper().readTree(responseBody).path("message"); - if (!node.isMissingNode()) { - message = node.asText(); - } - } catch (JsonProcessingException e) { - // responseBody by default - } - - log.error(message, httpException); +public class NetworkModificationServerException extends RuntimeException { - return new NetworkModificationException(type, message); + public NetworkModificationServerException(String message) { + super(message); } } diff --git a/src/main/java/org/gridsuite/modification/server/RestResponseEntityExceptionHandler.java b/src/main/java/org/gridsuite/modification/server/RestResponseEntityExceptionHandler.java deleted file mode 100644 index d4b87abf9..000000000 --- a/src/main/java/org/gridsuite/modification/server/RestResponseEntityExceptionHandler.java +++ /dev/null @@ -1,44 +0,0 @@ -/** - * Copyright (c) 2021, RTE (http://www.rte-france.com) - * This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. - */ -package org.gridsuite.modification.server; - -import org.gridsuite.modification.NetworkModificationException; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.http.HttpStatus; -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.ControllerAdvice; -import org.springframework.web.bind.annotation.ExceptionHandler; - -/** - * @author Slimane Amar - */ -@ControllerAdvice -public class RestResponseEntityExceptionHandler { - - private static final Logger LOGGER = LoggerFactory.getLogger(RestResponseEntityExceptionHandler.class); - private static final String HANDLER_MESSAGE = "Caught in handler"; - - @ExceptionHandler(NetworkModificationException.class) - protected ResponseEntity handleException(NetworkModificationException exception) { - return handleException(exception.getType().status, exception); - } - - @ExceptionHandler(NetworkModificationServerException.class) - protected ResponseEntity handleException(NetworkModificationServerException exception) { - return handleException(exception.getType().status, exception); - } - - private ResponseEntity handleException(HttpStatus status, Exception exception) { - if (LOGGER.isErrorEnabled()) { - LOGGER.error(HANDLER_MESSAGE, exception); - } - return ResponseEntity - .status(status) - .body(exception.getMessage()); - } -} diff --git a/src/main/java/org/gridsuite/modification/server/entities/ModificationEntity.java b/src/main/java/org/gridsuite/modification/server/entities/ModificationEntity.java index 9abc8c373..f6da74547 100644 --- a/src/main/java/org/gridsuite/modification/server/entities/ModificationEntity.java +++ b/src/main/java/org/gridsuite/modification/server/entities/ModificationEntity.java @@ -138,7 +138,7 @@ public static ModificationEntity fromDTO(ModificationInfos dto) { Constructor constructor = entityClass.getConstructor(dto.getClass()); return constructor.newInstance(dto); } catch (Exception e) { - throw new RuntimeException("Failed to map DTO to Entity", e); + throw new RuntimeException("Failed to map DTO to Entity: " + e.getCause().getMessage(), e); } } else { throw new IllegalArgumentException("No entity class registered for DTO class: " + dto.getClass()); diff --git a/src/main/java/org/gridsuite/modification/server/entities/equipment/modification/attribute/EquipmentAttributeModificationEntity.java b/src/main/java/org/gridsuite/modification/server/entities/equipment/modification/attribute/EquipmentAttributeModificationEntity.java index 12f6f7a04..bff812f89 100644 --- a/src/main/java/org/gridsuite/modification/server/entities/equipment/modification/attribute/EquipmentAttributeModificationEntity.java +++ b/src/main/java/org/gridsuite/modification/server/entities/equipment/modification/attribute/EquipmentAttributeModificationEntity.java @@ -95,7 +95,7 @@ public static EquipmentAttributeModificationEntity createAttributeEntity(Equi Constructor> constructor = entityClass.getConstructor(EquipmentAttributeModificationInfos.class); return constructor.newInstance(dto); } catch (Exception e) { - throw new RuntimeException("Failed to map DTO to Entity", e); + throw new RuntimeException("Failed to map DTO to Entity: " + e.getCause().getMessage(), e); } } else { throw new IllegalArgumentException("No entity class registered for attribute value class: " + attributeValueClass); diff --git a/src/main/java/org/gridsuite/modification/server/modifications/NetworkStoreListener.java b/src/main/java/org/gridsuite/modification/server/modifications/NetworkStoreListener.java index d49a2d275..78609fd48 100644 --- a/src/main/java/org/gridsuite/modification/server/modifications/NetworkStoreListener.java +++ b/src/main/java/org/gridsuite/modification/server/modifications/NetworkStoreListener.java @@ -10,7 +10,6 @@ import com.powsybl.iidm.network.*; import com.powsybl.network.store.client.NetworkStoreService; import lombok.Getter; -import org.gridsuite.modification.NetworkModificationException; import org.gridsuite.modification.dto.ModificationInfos; import org.gridsuite.modification.server.dto.elasticsearch.EquipmentInfos; import org.gridsuite.modification.server.dto.elasticsearch.ModificationApplicationInfos; @@ -26,7 +25,6 @@ import java.util.regex.Pattern; import java.util.stream.Stream; -import static org.gridsuite.modification.NetworkModificationException.Type.MODIFICATION_ERROR; import static org.gridsuite.modification.server.elasticsearch.EquipmentInfosService.getIndexedEquipmentTypes; import static org.gridsuite.modification.server.elasticsearch.EquipmentInfosService.getIndexedEquipmentTypesInModification; @@ -196,13 +194,8 @@ public void initModificationApplication(UUID groupUuid, ModificationInfos modifi } public List flushModificationApplications() { - try { - networkStoreService.flush(network); // At first - flushImpactedEquipments(); - } catch (Exception e) { - throw new NetworkModificationException(MODIFICATION_ERROR, e); - } - + networkStoreService.flush(network); // At first + flushImpactedEquipments(); return reduceNetworkImpacts(); } diff --git a/src/main/java/org/gridsuite/modification/server/repositories/NetworkModificationRepository.java b/src/main/java/org/gridsuite/modification/server/repositories/NetworkModificationRepository.java index b56fd5dcf..7a06dc236 100644 --- a/src/main/java/org/gridsuite/modification/server/repositories/NetworkModificationRepository.java +++ b/src/main/java/org/gridsuite/modification/server/repositories/NetworkModificationRepository.java @@ -19,8 +19,11 @@ import org.gridsuite.modification.server.entities.equipment.modification.EquipmentModificationEntity; import org.gridsuite.modification.server.entities.tabular.TabularModificationsEntity; import org.gridsuite.modification.server.entities.tabular.TabularPropertyEntity; +import org.springframework.http.HttpStatus; +import org.springframework.http.HttpStatusCode; import org.springframework.stereotype.Repository; import org.springframework.transaction.annotation.Transactional; +import org.springframework.web.server.ResponseStatusException; import java.util.*; import java.util.function.Function; @@ -141,7 +144,7 @@ public UUID createNetworkCompositeModification(@NonNull List modificationU public void updateCompositeModification(@NonNull UUID compositeUuid, @NonNull List modificationUuids) { ModificationEntity modificationEntity = modificationRepository.findById(compositeUuid) - .orElseThrow(() -> new NetworkModificationException(MODIFICATION_NOT_FOUND, String.format(MODIFICATION_NOT_FOUND_MESSAGE, compositeUuid))); + .orElseThrow(() -> new ResponseStatusException(HttpStatus.NOT_FOUND, String.format(MODIFICATION_NOT_FOUND_MESSAGE, compositeUuid))); if (!(modificationEntity instanceof CompositeModificationEntity compositeEntity)) { throw new NetworkModificationException(MODIFICATION_ERROR, @@ -284,8 +287,8 @@ public List getModifications(UUID groupUuid, boolean onlyMeta public List getModifications(UUID groupUuid, boolean onlyMetadata, boolean errorOnGroupNotFound, boolean onlyStashed) { try { return onlyMetadata ? getModificationsMetadata(groupUuid, onlyStashed) : getModificationsInfos(List.of(groupUuid), onlyStashed); - } catch (NetworkModificationException e) { - if (e.getType() == MODIFICATION_GROUP_NOT_FOUND && !errorOnGroupNotFound) { + } catch (ResponseStatusException e) { + if (e.getStatusCode() == HttpStatusCode.valueOf(404) && !errorOnGroupNotFound) { return List.of(); } throw e; @@ -437,7 +440,7 @@ public ModificationInfos getModificationInfo(UUID modificationUuid) { public ModificationEntity getModificationEntity(UUID modificationUuid) { return modificationRepository .findById(modificationUuid) - .orElseThrow(() -> new NetworkModificationException(MODIFICATION_NOT_FOUND, modificationUuid.toString())); + .orElseThrow(() -> new ResponseStatusException(HttpStatus.NOT_FOUND, String.format(MODIFICATION_NOT_FOUND_MESSAGE, modificationUuid))); } @Transactional // To have the 2 delete in the same transaction (atomic) @@ -451,8 +454,8 @@ public void deleteModificationGroup(UUID groupUuid, boolean errorOnGroupNotFound deleteModifications(modifications.stream().filter(Objects::nonNull).toList()); } modificationGroupRepository.delete(groupEntity); - } catch (NetworkModificationException e) { - if (e.getType() == MODIFICATION_GROUP_NOT_FOUND && !errorOnGroupNotFound) { + } catch (ResponseStatusException e) { + if (e.getStatusCode() == HttpStatusCode.valueOf(404) && !errorOnGroupNotFound) { return; } throw e; @@ -486,7 +489,7 @@ public int deleteModifications(UUID groupUuid, List uuids) { } private ModificationGroupEntity getModificationGroup(UUID groupUuid) { - return this.modificationGroupRepository.findById(groupUuid).orElseThrow(() -> new NetworkModificationException(MODIFICATION_GROUP_NOT_FOUND, groupUuid.toString())); + return this.modificationGroupRepository.findById(groupUuid).orElseThrow(() -> new ResponseStatusException(HttpStatus.NOT_FOUND, "Modification group not found " + groupUuid)); } private ModificationGroupEntity getOrCreateModificationGroup(UUID groupUuid) { @@ -564,7 +567,7 @@ public void stashNetworkModifications(@NonNull List modificationUuids, int for (UUID modificationUuid : modificationUuids) { ModificationEntity modificationEntity = this.modificationRepository .findById(modificationUuid) - .orElseThrow(() -> new NetworkModificationException(MODIFICATION_NOT_FOUND, String.format(MODIFICATION_NOT_FOUND_MESSAGE, modificationUuid))); + .orElseThrow(() -> new ResponseStatusException(HttpStatus.NOT_FOUND, String.format(MODIFICATION_NOT_FOUND_MESSAGE, modificationUuid))); modificationEntity.setStashed(true); modificationEntity.setModificationsOrder(stashModificationOrder); modificationEntities.add(modificationEntity); @@ -593,7 +596,7 @@ public void restoreNetworkModifications(@NonNull List modificationUuids, i int modificationOrder = unstashedSize; List modifications = modificationRepository.findAllByIdInReverse(modificationUuids); if (modifications.size() != modificationUuids.size()) { - throw new NetworkModificationException(MODIFICATION_NOT_FOUND); + throw new ResponseStatusException(HttpStatus.NOT_FOUND, "Modification not found"); } for (ModificationEntity modification : modifications) { modification.setStashed(false); @@ -646,8 +649,8 @@ public void deleteStashedModificationInGroup(UUID groupUuid, boolean errorOnGrou groupEntity.getModifications().removeAll(modifications); // No need to remove the group from the modification as we're going to delete it deleteModifications(modifications); } - } catch (NetworkModificationException e) { - if (e.getType() == MODIFICATION_GROUP_NOT_FOUND && !errorOnGroupNotFound) { + } catch (ResponseStatusException e) { + if (e.getStatusCode() == HttpStatusCode.valueOf(404) && !errorOnGroupNotFound) { return; } throw e; diff --git a/src/main/java/org/gridsuite/modification/server/service/FilterService.java b/src/main/java/org/gridsuite/modification/server/service/FilterService.java index 9b3060a55..7cad7dbea 100644 --- a/src/main/java/org/gridsuite/modification/server/service/FilterService.java +++ b/src/main/java/org/gridsuite/modification/server/service/FilterService.java @@ -16,7 +16,6 @@ import org.springframework.core.ParameterizedTypeReference; import org.springframework.http.HttpMethod; import org.springframework.stereotype.Service; -import org.springframework.web.client.HttpStatusCodeException; import org.springframework.web.client.RestTemplate; import org.springframework.web.util.UriComponentsBuilder; @@ -28,9 +27,6 @@ import java.util.stream.Collectors; import java.util.stream.Stream; -import static org.gridsuite.modification.NetworkModificationException.Type.FILTERS_NOT_FOUND; -import static org.gridsuite.modification.server.NetworkModificationServerException.handleChangeError; - /** * @author bendaamerahm */ @@ -60,11 +56,7 @@ public List getFilters(List filtersUuids) { String path = UriComponentsBuilder.fromPath(DELIMITER + FILTER_SERVER_API_VERSION + "/filters/metadata" + ids) .buildAndExpand() .toUriString(); - try { - return restTemplate.exchange(filterServerBaseUri + path, HttpMethod.GET, null, new ParameterizedTypeReference>() { }).getBody(); - } catch (HttpStatusCodeException e) { - throw handleChangeError(e, FILTERS_NOT_FOUND); - } + return restTemplate.exchange(filterServerBaseUri + path, HttpMethod.GET, null, new ParameterizedTypeReference>() { }).getBody(); } public Stream exportFilters(List filtersUuids, Network network) { diff --git a/src/main/java/org/gridsuite/modification/server/service/LoadFlowService.java b/src/main/java/org/gridsuite/modification/server/service/LoadFlowService.java index 6c689f6c0..a6019792d 100644 --- a/src/main/java/org/gridsuite/modification/server/service/LoadFlowService.java +++ b/src/main/java/org/gridsuite/modification/server/service/LoadFlowService.java @@ -8,7 +8,6 @@ import lombok.extern.slf4j.Slf4j; import org.gridsuite.modification.ILoadFlowService; -import org.gridsuite.modification.NetworkModificationException; import org.gridsuite.modification.dto.LoadFlowParametersInfos; import org.springframework.beans.factory.annotation.Value; import org.springframework.http.HttpStatus; @@ -19,7 +18,6 @@ import java.util.UUID; -import static org.gridsuite.modification.server.NetworkModificationServerException.handleChangeError; /** * @author Achour BERRAHMA @@ -50,7 +48,7 @@ public LoadFlowParametersInfos getLoadFlowParametersInfos(UUID uuid) { log.error("Load flow parameters with UUID {} not found", uuid); return null; } else { - throw handleChangeError(e, NetworkModificationException.Type.LOAD_FLOW_PARAMETERS_FETCH_ERROR); + throw e; } } } diff --git a/src/main/java/org/gridsuite/modification/server/service/NetworkModificationService.java b/src/main/java/org/gridsuite/modification/server/service/NetworkModificationService.java index 869051564..3d066bcfc 100644 --- a/src/main/java/org/gridsuite/modification/server/service/NetworkModificationService.java +++ b/src/main/java/org/gridsuite/modification/server/service/NetworkModificationService.java @@ -10,7 +10,6 @@ import co.elastic.clients.elasticsearch._types.query_dsl.Query; import com.fasterxml.jackson.databind.ObjectMapper; import com.google.common.collect.Streams; -import com.powsybl.commons.PowsyblException; import com.powsybl.iidm.network.Network; import com.powsybl.iidm.network.VariantManagerConstants; import com.powsybl.network.store.client.NetworkStoreService; @@ -37,8 +36,11 @@ import org.springframework.data.elasticsearch.client.elc.Queries; import org.springframework.data.elasticsearch.core.ElasticsearchOperations; import org.springframework.data.elasticsearch.core.SearchHit; +import org.springframework.http.HttpStatus; +import org.springframework.http.HttpStatusCode; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import org.springframework.web.server.ResponseStatusException; import java.util.*; import java.util.concurrent.CompletableFuture; @@ -48,7 +50,6 @@ import java.util.stream.Stream; import static org.gridsuite.modification.NetworkModificationException.Type.*; -import static org.gridsuite.modification.server.NetworkModificationServerException.Type.DUPLICATION_ARGUMENT_INVALID; import static org.gridsuite.modification.server.modifications.AsyncUtils.scheduleApplyModifications; /** @@ -124,7 +125,7 @@ public void verifyModifications(UUID groupUuid, Set modificationUuids) { .stream().map(ModificationInfos::getUuid) .collect(Collectors.toSet()) .containsAll(modificationUuids)) { - throw new NetworkModificationException(MODIFICATION_NOT_FOUND); + throw new ResponseStatusException(HttpStatus.NOT_FOUND, "Modification not found"); } } @@ -197,12 +198,7 @@ public void deleteIndexedModificationGroup(List groupUuids, UUID networkUu } public NetworkInfos getNetworkInfos(UUID networkUuid, String variantId, PreloadingStrategy preloadingStrategy) { - Network network; - try { - network = networkStoreService.getNetwork(networkUuid, preloadingStrategy); - } catch (PowsyblException e) { - throw new NetworkModificationException(NETWORK_NOT_FOUND, networkUuid.toString()); - } + Network network = networkStoreService.getNetwork(networkUuid, preloadingStrategy); boolean isVariantPresent = true; if (variantId != null) { if (network.getVariantManager().getVariantIds().stream().anyMatch(id -> id.equals(variantId))) { @@ -273,20 +269,12 @@ public Network cloneNetworkVariant(UUID networkUuid, String originVariantId, String destinationVariantId, PreloadingStrategy preloadingStrategy) { - Network network; - try { - network = networkStoreService.getNetwork(networkUuid, preloadingStrategy); - network.addListener(new NetworkVariantsListener(network, networkUuid, equipmentInfosService)); - } catch (PowsyblException e) { - throw new NetworkModificationException(NETWORK_NOT_FOUND, networkUuid.toString()); - } + + Network network = networkStoreService.getNetwork(networkUuid, preloadingStrategy); + network.addListener(new NetworkVariantsListener(network, networkUuid, equipmentInfosService)); String startingVariant = StringUtils.isBlank(originVariantId) ? VariantManagerConstants.INITIAL_VARIANT_ID : originVariantId; - try { - network.getVariantManager().cloneVariant(startingVariant, destinationVariantId, true); // cloning variant - network.getVariantManager().setWorkingVariant(destinationVariantId); // set current variant to destination variant - } catch (PowsyblException e) { - throw new NetworkModificationException(VARIANT_NOT_FOUND, startingVariant); - } + network.getVariantManager().cloneVariant(startingVariant, destinationVariantId, true); // cloning variant + network.getVariantManager().setWorkingVariant(destinationVariantId); // set current variant to destination variant return network; } @@ -299,8 +287,8 @@ public NetworkModificationResult buildVariant(@NonNull UUID networkUuid, @NonNul List modifications = List.of(); try { modifications = networkModificationRepository.getActiveModifications(groupUuid, modificationsToExclude); - } catch (NetworkModificationException e) { - if (e.getType() != MODIFICATION_GROUP_NOT_FOUND) { // May not exist + } catch (ResponseStatusException e) { + if (e.getStatusCode() == HttpStatusCode.valueOf(404)) { // May not exist throw e; } } @@ -331,7 +319,7 @@ public void stopBuildRequest(String receiver) { public void deleteNetworkModifications(UUID groupUuid, List modificationsUuids) { if (networkModificationRepository.deleteModifications(groupUuid, modificationsUuids) == 0) { - throw new NetworkModificationException(MODIFICATION_NOT_FOUND); + throw new ResponseStatusException(HttpStatus.NOT_FOUND, "Modification not found"); } } @@ -357,8 +345,8 @@ public Map duplicateGroup(UUID sourceGroupUuid, UUID groupUuid) { } return duplicateModificationMapping; - } catch (NetworkModificationException e) { - if (e.getType() == MODIFICATION_GROUP_NOT_FOUND) { // May not exist + } catch (ResponseStatusException e) { + if (e.getStatusCode() == HttpStatusCode.valueOf(404)) { // May not exist return Map.of(); } throw e; @@ -383,7 +371,7 @@ private CompletableFuture> applyModification public CompletableFuture duplicateModifications(@NonNull UUID targetGroupUuid, UUID originGroupUuid, @NonNull List modificationsUuids, @NonNull List applicationContexts) { if (originGroupUuid != null && !modificationsUuids.isEmpty()) { // Duplicate modifications from a group or from a list only - throw new NetworkModificationServerException(DUPLICATION_ARGUMENT_INVALID); + throw new NetworkModificationServerException("Invalid argument for duplication"); } List duplicateModifications = networkModificationRepository.saveDuplicateModifications(targetGroupUuid, originGroupUuid, modificationsUuids); List ids = duplicateModifications.stream().map(ModificationInfos::getUuid).toList(); diff --git a/src/main/java/org/gridsuite/modification/server/service/ReportService.java b/src/main/java/org/gridsuite/modification/server/service/ReportService.java index eda0efe20..cd1079d0e 100644 --- a/src/main/java/org/gridsuite/modification/server/service/ReportService.java +++ b/src/main/java/org/gridsuite/modification/server/service/ReportService.java @@ -6,10 +6,8 @@ */ package org.gridsuite.modification.server.service; -import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.InjectableValues; import com.fasterxml.jackson.databind.ObjectMapper; -import com.powsybl.commons.PowsyblException; import com.powsybl.commons.report.ReportNode; import com.powsybl.commons.report.ReportNodeDeserializer; import com.powsybl.commons.report.ReportNodeJsonModule; @@ -69,11 +67,7 @@ public void sendReport(UUID reportUuid, ReportNode reportNode, ReportMode report .toUriString(); var headers = new HttpHeaders(); headers.setContentType(MediaType.APPLICATION_JSON); - try { - reportServerRest.exchange(this.getReportServerURI() + path, HttpMethod.PUT, new HttpEntity<>(objectMapper.writeValueAsString(reportNode), headers), ReportNode.class); - } catch (JsonProcessingException error) { - throw new PowsyblException("error creating report", error); - } + reportServerRest.exchange(this.getReportServerURI() + path, HttpMethod.PUT, new HttpEntity<>(reportNode, headers), ReportNode.class); } public void sendReport(UUID reportUuid, ReportNode reportNode) { diff --git a/src/test/java/org/gridsuite/modification/server/ModificationControllerTest.java b/src/test/java/org/gridsuite/modification/server/ModificationControllerTest.java index c5c9c8c9f..04b151140 100644 --- a/src/test/java/org/gridsuite/modification/server/ModificationControllerTest.java +++ b/src/test/java/org/gridsuite/modification/server/ModificationControllerTest.java @@ -19,6 +19,7 @@ import com.powsybl.network.store.client.NetworkStoreService; import com.powsybl.network.store.client.PreloadingStrategy; import com.powsybl.network.store.iidm.impl.NetworkFactoryImpl; +import com.powsybl.ws.commons.error.BaseExceptionHandler; import org.apache.commons.collections4.ListUtils; import org.apache.commons.lang3.tuple.Pair; import org.gridsuite.modification.NetworkModificationException; @@ -43,6 +44,7 @@ import org.gridsuite.modification.server.utils.NetworkWithTeePoint; import org.gridsuite.modification.server.utils.TestUtils; import org.gridsuite.modification.utils.ModificationUtils; +import org.hamcrest.core.StringContains; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Tag; @@ -51,12 +53,14 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.context.annotation.Import; import org.springframework.http.MediaType; import org.springframework.mock.web.MockMultipartFile; import org.springframework.test.context.bean.override.mockito.MockitoBean; import org.springframework.test.web.servlet.MockMvc; import org.springframework.test.web.servlet.MvcResult; import org.springframework.test.web.servlet.request.MockMultipartHttpServletRequestBuilder; +import org.springframework.web.server.ResponseStatusException; import java.io.IOException; import java.io.InputStream; @@ -68,7 +72,6 @@ import static org.gridsuite.modification.NetworkModificationException.Type.*; import static org.gridsuite.modification.dto.OperationalLimitsGroupInfos.Applicability.SIDE1; import static org.gridsuite.modification.dto.OperationalLimitsGroupInfos.Applicability.SIDE2; -import static org.gridsuite.modification.server.NetworkModificationServerException.Type.DUPLICATION_ARGUMENT_INVALID; import static org.gridsuite.modification.server.elasticsearch.EquipmentInfosService.getIndexedEquipmentTypes; import static org.gridsuite.modification.server.impacts.TestImpactUtils.*; import static org.gridsuite.modification.server.report.NetworkModificationServerReportResourceBundle.ERROR_MESSAGE_KEY; @@ -89,6 +92,7 @@ */ @AutoConfigureMockMvc @SpringBootTest +@Import(BaseExceptionHandler.class) @Tag("IntegrationTest") class ModificationControllerTest { @@ -113,6 +117,7 @@ class ModificationControllerTest { private static final String LINE_TYPES_CATALOG_JSON_FILE_3 = "/line_types_catalog_3.json.gz"; private static final String NOT_EXISTING_JSON_FILE = "/not_existing_file.json.gz"; private static final String NETWORK_MODIFICATION_URI = URI_NETWORK_MODIF_BASE + "?groupUuid=" + TEST_GROUP_ID; + public static final String NOT_FOUND_NETWORK_ERROR_MSG = "not found network"; @Autowired private MockMvc mockMvc; @@ -159,7 +164,7 @@ void setUp() { networkWithTeePoint = NetworkWithTeePoint.create(TEST_NETWORK_WITH_TEE_POINT_ID); when(networkStoreService.getNetwork(eq(TEST_NETWORK_WITH_TEE_POINT_ID), nullable(PreloadingStrategy.class))).then((Answer) invocation -> networkWithTeePoint); - when(networkStoreService.getNetwork(eq(NOT_FOUND_NETWORK_ID), nullable(PreloadingStrategy.class))).thenThrow(new PowsyblException()); + when(networkStoreService.getNetwork(eq(NOT_FOUND_NETWORK_ID), nullable(PreloadingStrategy.class))).thenThrow(new PowsyblException(NOT_FOUND_NETWORK_ERROR_MSG)); when(networkStoreService.getNetwork(eq(TEST_NETWORK_WITH_FLUSH_ERROR_ID), nullable(PreloadingStrategy.class))).then((Answer) invocation -> NetworkCreation.create(TEST_NETWORK_WITH_FLUSH_ERROR_ID, true)); networkBusBreaker = NetworkCreation.createBusBreaker(TEST_NETWORK_BUS_BREAKER_ID); @@ -167,7 +172,7 @@ void setUp() { when(networkStoreService.getNetwork(eq(TEST_NETWORK_MIXED_TOPOLOGY_ID), nullable(PreloadingStrategy.class))).then((Answer) invocation -> NetworkCreation.createMixedTopology(TEST_NETWORK_MIXED_TOPOLOGY_ID)); - doThrow(new PowsyblException()).when(networkStoreService).flush(argThat(n -> TEST_NETWORK_WITH_FLUSH_ERROR_ID.toString().equals(n.getId()))); + doThrow(new PowsyblException("error when flushing")).when(networkStoreService).flush(argThat(n -> TEST_NETWORK_WITH_FLUSH_ERROR_ID.toString().equals(n.getId()))); // clean DB modificationRepository.deleteAll(); @@ -220,18 +225,18 @@ void testEquipmentIdNonNull() { @Test void testNetworkNotFound() throws Exception { String body = getJsonBody(LoadCreationInfos.builder().equipmentId("id").build(), NOT_FOUND_NETWORK_ID, NetworkCreation.VARIANT_ID); - MvcResult mvcResult = runRequestAsync(mockMvc, + runRequestAsync(mockMvc, post(NETWORK_MODIFICATION_URI).content(body).contentType(MediaType.APPLICATION_JSON), - status().isNotFound()); - assertEquals(new NetworkModificationException(NETWORK_NOT_FOUND, NOT_FOUND_NETWORK_ID.toString()).getMessage(), mvcResult.getResponse().getContentAsString()); + status().isInternalServerError(), + content().string(StringContains.containsString(NOT_FOUND_NETWORK_ERROR_MSG))); } @Test void assertThrowsUpdateModificationNotFound() { UUID modificationUuid = UUID.randomUUID(); ModificationInfos modificationInfos = LoadCreationInfos.builder().equipmentId("id").build(); - String errorMessage = assertThrows(NetworkModificationException.class, () -> networkModificationService.updateNetworkModification(modificationUuid, modificationInfos)).getMessage(); - assertEquals(new NetworkModificationException(MODIFICATION_NOT_FOUND, String.format("%s", modificationUuid)).getMessage(), errorMessage); + String errorMessage = assertThrows(ResponseStatusException.class, () -> networkModificationService.updateNetworkModification(modificationUuid, modificationInfos)).getMessage(); + assertTrue(errorMessage.contains(String.format("Modification (%s) not found", modificationUuid))); assertThrows(NullPointerException.class, () -> networkModificationService.updateNetworkModification(modificationUuid, null)); } @@ -284,7 +289,7 @@ void testModificationGroups() throws Exception { .andExpect(status().isOk()); mockMvc.perform(get("/v1/groups/{groupUuid}/network-modifications?onlyMetadata=true", TEST_GROUP_ID)).andExpectAll(status().isNotFound(), - content().string(new NetworkModificationException(MODIFICATION_GROUP_NOT_FOUND, TEST_GROUP_ID.toString()).getMessage())); + content().string(StringContains.containsString("Modification group not found " + TEST_GROUP_ID))); mvcResult = mockMvc.perform(get("/v1/groups/{groupUuid}/network-modifications?onlyMetadata=true&errorOnGroupNotFound=false", TEST_GROUP_ID)).andExpectAll( status().isOk(), @@ -574,7 +579,7 @@ void testCopyModification() throws Exception { put("/v1/groups/" + TEST_GROUP_ID + "?action=XXXXXXX") .content(bodyJson) .contentType(MediaType.APPLICATION_JSON)) - .andExpect(status().isBadRequest()); + .andExpect(status().isInternalServerError()); // create 1 modification in another group UUID otherGroupId = UUID.randomUUID(); @@ -613,12 +618,13 @@ void testCopyModification() throws Exception { // Duplicate modifications from a group and from a list : illegal operation bodyJson = getJsonBody(duplicateModificationUuidList, NetworkCreation.VARIANT_ID); - mvcResult = mockMvc.perform( + mockMvc.perform( put("/v1/groups/" + otherGroupId + "?action=COPY" + "&originGroupUuid=" + TEST_GROUP_ID) .content(bodyJson) .contentType(MediaType.APPLICATION_JSON)) - .andExpect(status().isBadRequest()).andReturn(); - assertEquals(new NetworkModificationServerException(DUPLICATION_ARGUMENT_INVALID).getMessage(), mvcResult.getResponse().getContentAsString()); + .andExpect(status().isInternalServerError()) + .andExpect(content().string(StringContains.containsString("Invalid argument for duplication"))) + .andReturn(); } /** @@ -657,7 +663,7 @@ void testCopyModificationOld() throws Exception { put(wrongUrl) .content(bodyJson) .contentType(MediaType.APPLICATION_JSON)) - .andExpect(status().isBadRequest()); + .andExpect(status().isInternalServerError()); // create 1 modification in another group UUID otherGroupId = UUID.randomUUID(); @@ -1764,8 +1770,8 @@ void testDuplicateCompositeModification() throws Exception { assertEquals(1, groupModifications.size()); assertEquals(modificationUuidList.get(0), groupModifications.get(0).getUuid()); // duplicate has been deleted - assertEquals("MODIFICATION_NOT_FOUND : " + returnedNewId, assertThrows(NetworkModificationException.class, () - -> modificationRepository.getModificationInfo(returnedNewId)).getMessage()); + assertTrue(assertThrows(ResponseStatusException.class, () + -> modificationRepository.getModificationInfo(returnedNewId)).getMessage().contains(String.format("Modification (%s) not found", returnedNewId))); } @Test @@ -1861,8 +1867,8 @@ void testStandaloneDeletionError() throws Exception { .queryParam("uuids", switchModificationId.toString())) .andExpectAll( status().is5xxServerError(), - content().string(new NetworkModificationException(MODIFICATION_DELETION_ERROR, - String.format("%s is owned by group %s", switchModificationId, TEST_GROUP_ID)).getMessage()) + content().string(StringContains.containsString(new NetworkModificationException(MODIFICATION_DELETION_ERROR, + String.format("%s is owned by group %s", switchModificationId, TEST_GROUP_ID)).getMessage())) ); } diff --git a/src/test/java/org/gridsuite/modification/server/NetworkModificationServerNameProvider.java b/src/test/java/org/gridsuite/modification/server/NetworkModificationServerNameProvider.java new file mode 100644 index 000000000..5162bfc4a --- /dev/null +++ b/src/test/java/org/gridsuite/modification/server/NetworkModificationServerNameProvider.java @@ -0,0 +1,23 @@ +/* + * Copyright (c) 2026, RTE (http://www.rte-france.com) + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ + +package org.gridsuite.modification.server; + +import com.powsybl.ws.commons.error.ServerNameProvider; +import org.springframework.stereotype.Component; + +/** + * @author Joris Mancini + */ +@Component +public class NetworkModificationServerNameProvider implements ServerNameProvider { + + @Override + public String serverName() { + return "network-modification-server"; + } +} diff --git a/src/test/java/org/gridsuite/modification/server/modifications/AbstractNetworkModificationTest.java b/src/test/java/org/gridsuite/modification/server/modifications/AbstractNetworkModificationTest.java index 2a251dfa0..639e9fe6d 100644 --- a/src/test/java/org/gridsuite/modification/server/modifications/AbstractNetworkModificationTest.java +++ b/src/test/java/org/gridsuite/modification/server/modifications/AbstractNetworkModificationTest.java @@ -16,6 +16,7 @@ import com.powsybl.network.store.client.NetworkStoreService; import com.powsybl.network.store.client.PreloadingStrategy; import com.powsybl.network.store.iidm.impl.NetworkImpl; +import com.powsybl.ws.commons.error.BaseExceptionHandler; import org.gridsuite.modification.dto.ModificationInfos; import org.gridsuite.modification.server.dto.NetworkModificationResult; import org.gridsuite.modification.server.dto.NetworkModificationsResult; @@ -35,6 +36,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.context.annotation.Import; import org.springframework.http.MediaType; import org.springframework.test.context.bean.override.mockito.MockitoBean; import org.springframework.test.web.servlet.MockMvc; @@ -65,6 +67,7 @@ */ @SpringBootTest @DisableElasticsearch +@Import(BaseExceptionHandler.class) @AutoConfigureMockMvc public abstract class AbstractNetworkModificationTest { private static final Logger LOGGER = LoggerFactory.getLogger(AbstractNetworkModificationTest.class); diff --git a/src/test/java/org/gridsuite/modification/server/modifications/BalancesAdjustmentTest.java b/src/test/java/org/gridsuite/modification/server/modifications/BalancesAdjustmentTest.java index cb237f39d..50a513a6a 100644 --- a/src/test/java/org/gridsuite/modification/server/modifications/BalancesAdjustmentTest.java +++ b/src/test/java/org/gridsuite/modification/server/modifications/BalancesAdjustmentTest.java @@ -15,18 +15,14 @@ import org.gridsuite.modification.NetworkModificationException; import org.gridsuite.modification.server.dto.NetworkModificationsResult; import org.gridsuite.modification.server.service.LoadFlowService; -import org.gridsuite.modification.server.NetworkModificationServerException; import org.gridsuite.modification.server.utils.elasticsearch.DisableElasticsearch; -import org.jetbrains.annotations.NotNull; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Tag; import org.junit.jupiter.api.Test; -import org.springframework.http.HttpStatus; import org.springframework.http.MediaType; import org.springframework.test.context.bean.override.mockito.MockitoBean; import org.springframework.test.web.servlet.MvcResult; import org.springframework.test.web.servlet.ResultActions; -import org.springframework.web.client.HttpStatusCodeException; import java.util.List; import java.util.Map; @@ -181,116 +177,6 @@ void testGetLoadFlowParametersInfosServerError() { assertEquals("LOAD_FLOW_PARAMETERS_FETCH_ERROR : Internal server error", exception.getMessage()); } - /** - * Test NetworkModificationServerException.handleChangeError() method with empty response body - */ - @Test - void testHandleChangeErrorWithEmptyResponseBody() { - HttpStatusCodeException httpException = new HttpStatusCodeException(HttpStatus.INTERNAL_SERVER_ERROR) { - @NotNull - @Override - public String getResponseBodyAsString() { - return ""; - } - }; - - NetworkModificationException result = NetworkModificationServerException.handleChangeError( - httpException, - NetworkModificationException.Type.LOAD_FLOW_PARAMETERS_FETCH_ERROR - ); - - assertEquals(NetworkModificationException.Type.LOAD_FLOW_PARAMETERS_FETCH_ERROR, result.getType()); - assertEquals("LOAD_FLOW_PARAMETERS_FETCH_ERROR : 500 INTERNAL_SERVER_ERROR", result.getMessage()); - } - - /** - * Test NetworkModificationServerException.handleChangeError() method with JSON response body containing message - */ - @Test - void testHandleChangeErrorWithJsonResponseBody() { - HttpStatusCodeException httpException = new HttpStatusCodeException(HttpStatus.BAD_REQUEST) { - @NotNull - @Override - public String getResponseBodyAsString() { - return "{\"message\": \"Invalid parameters provided\", \"code\": 400}"; - } - }; - - NetworkModificationException result = NetworkModificationServerException.handleChangeError( - httpException, - NetworkModificationException.Type.LOAD_FLOW_PARAMETERS_FETCH_ERROR - ); - - assertEquals(NetworkModificationException.Type.LOAD_FLOW_PARAMETERS_FETCH_ERROR, result.getType()); - assertEquals("LOAD_FLOW_PARAMETERS_FETCH_ERROR : Invalid parameters provided", result.getMessage()); - } - - /** - * Test NetworkModificationServerException.handleChangeError() method with plain text response body - */ - @Test - void testHandleChangeErrorWithPlainTextResponseBody() { - HttpStatusCodeException httpException = new HttpStatusCodeException(HttpStatus.NOT_FOUND) { - @NotNull - @Override - public String getResponseBodyAsString() { - return "Resource not found"; - } - }; - - NetworkModificationException result = NetworkModificationServerException.handleChangeError( - httpException, - NetworkModificationException.Type.LOAD_FLOW_PARAMETERS_FETCH_ERROR - ); - - assertEquals(NetworkModificationException.Type.LOAD_FLOW_PARAMETERS_FETCH_ERROR, result.getType()); - assertEquals("LOAD_FLOW_PARAMETERS_FETCH_ERROR : Resource not found", result.getMessage()); - } - - /** - * Test NetworkModificationServerException.handleChangeError() method with invalid JSON response body - */ - @Test - void testHandleChangeErrorWithInvalidJsonResponseBody() { - HttpStatusCodeException httpException = new HttpStatusCodeException(HttpStatus.INTERNAL_SERVER_ERROR) { - @NotNull - @Override - public String getResponseBodyAsString() { - return "{invalid json structure"; - } - }; - - NetworkModificationException result = NetworkModificationServerException.handleChangeError( - httpException, - NetworkModificationException.Type.LOAD_FLOW_PARAMETERS_FETCH_ERROR - ); - - assertEquals(NetworkModificationException.Type.LOAD_FLOW_PARAMETERS_FETCH_ERROR, result.getType()); - assertEquals("LOAD_FLOW_PARAMETERS_FETCH_ERROR : {invalid json structure", result.getMessage()); - } - - /** - * Test NetworkModificationServerException.handleChangeError() method with JSON response body without message field - */ - @Test - void testHandleChangeErrorWithJsonResponseBodyWithoutMessage() { - HttpStatusCodeException httpException = new HttpStatusCodeException(HttpStatus.CONFLICT) { - @NotNull - @Override - public String getResponseBodyAsString() { - return "{\"error\": \"Conflict occurred\", \"timestamp\": \"2025-01-01T10:00:00Z\"}"; - } - }; - - NetworkModificationException result = NetworkModificationServerException.handleChangeError( - httpException, - NetworkModificationException.Type.LOAD_FLOW_PARAMETERS_FETCH_ERROR - ); - - assertEquals(NetworkModificationException.Type.LOAD_FLOW_PARAMETERS_FETCH_ERROR, result.getType()); - assertEquals("LOAD_FLOW_PARAMETERS_FETCH_ERROR : {\"error\": \"Conflict occurred\", \"timestamp\": \"2025-01-01T10:00:00Z\"}", result.getMessage()); - } - @Override protected ModificationInfos buildModificationUpdate() { return BalancesAdjustmentModificationInfos.builder() diff --git a/src/test/java/org/gridsuite/modification/server/modifications/EquipmentAttributeModificationTest.java b/src/test/java/org/gridsuite/modification/server/modifications/EquipmentAttributeModificationTest.java index 626fc3730..d6c7a45ce 100644 --- a/src/test/java/org/gridsuite/modification/server/modifications/EquipmentAttributeModificationTest.java +++ b/src/test/java/org/gridsuite/modification/server/modifications/EquipmentAttributeModificationTest.java @@ -13,6 +13,7 @@ import org.gridsuite.modification.dto.EquipmentAttributeModificationInfos; import org.gridsuite.modification.dto.ModificationInfos; import org.gridsuite.modification.server.utils.NetworkCreation; +import org.hamcrest.core.StringContains; import org.junit.jupiter.api.Tag; import org.junit.jupiter.api.Test; import org.springframework.http.MediaType; @@ -159,8 +160,8 @@ void testWithErrors() throws Exception { String switchStatusModificationInfosJson = getJsonBody(switchStatusModificationInfos, null); mockMvc.perform(post(getNetworkModificationUri()).content(switchStatusModificationInfosJson).contentType(MediaType.APPLICATION_JSON)) .andExpectAll( - status().isBadRequest(), - content().string(new NetworkModificationException(EQUIPMENT_ATTRIBUTE_NAME_ERROR, "For switch status, the attribute name is only 'open'").getMessage())); + status().isInternalServerError(), + content().string(StringContains.containsString(new NetworkModificationException(EQUIPMENT_ATTRIBUTE_NAME_ERROR, "For switch status, the attribute name is only 'open'").getMessage()))); // bad equipment attribute value switchStatusModificationInfos.setEquipmentAttributeName("open"); @@ -169,8 +170,8 @@ void testWithErrors() throws Exception { mockMvc.perform(post(getNetworkModificationUri()).content(switchStatusModificationInfosJson).contentType(MediaType.APPLICATION_JSON)) .andExpectAll( - status().isBadRequest(), - content().string(new NetworkModificationException(EQUIPMENT_ATTRIBUTE_VALUE_ERROR, "For switch status, the attribute values are only " + Set.of(true, false)).getMessage())); + status().isInternalServerError(), + content().string(StringContains.containsString(new NetworkModificationException(EQUIPMENT_ATTRIBUTE_VALUE_ERROR, "For switch status, the attribute values are only " + Set.of(true, false)).getMessage()))); } @Override diff --git a/src/test/java/org/gridsuite/modification/server/modifications/LineAttachToVoltageLevelTest.java b/src/test/java/org/gridsuite/modification/server/modifications/LineAttachToVoltageLevelTest.java index 08d2e7582..ca299a576 100644 --- a/src/test/java/org/gridsuite/modification/server/modifications/LineAttachToVoltageLevelTest.java +++ b/src/test/java/org/gridsuite/modification/server/modifications/LineAttachToVoltageLevelTest.java @@ -14,6 +14,7 @@ import org.gridsuite.modification.NetworkModificationException; import org.gridsuite.modification.dto.*; import org.gridsuite.modification.server.utils.NetworkCreation; +import org.hamcrest.core.StringContains; import org.junit.jupiter.api.Tag; import org.junit.jupiter.api.Test; import org.springframework.http.MediaType; @@ -181,8 +182,8 @@ void testCreateWithErrors() throws Exception { String lineMissingLineJson = getJsonBody(lineMissingLine, null); mockMvc.perform(post(getNetworkModificationUri()).content(lineMissingLineJson).contentType(MediaType.APPLICATION_JSON)) .andExpectAll( - status().is4xxClientError(), - content().string(new NetworkModificationException(LINE_ATTACH_DESCRIPTION_ERROR, "Missing required attachment line description").getMessage()) + status().isInternalServerError(), + content().string(StringContains.containsString(new NetworkModificationException(LINE_ATTACH_DESCRIPTION_ERROR, "Missing required attachment line description").getMessage())) ); testNetworkModificationsCount(getGroupId(), 1); } diff --git a/src/test/java/org/gridsuite/modification/server/modifications/OperatingStatusModificationLockoutLineTest.java b/src/test/java/org/gridsuite/modification/server/modifications/OperatingStatusModificationLockoutLineTest.java index 5cf00ff40..7d59d8e53 100644 --- a/src/test/java/org/gridsuite/modification/server/modifications/OperatingStatusModificationLockoutLineTest.java +++ b/src/test/java/org/gridsuite/modification/server/modifications/OperatingStatusModificationLockoutLineTest.java @@ -18,6 +18,7 @@ import org.gridsuite.modification.dto.OperatingStatusModificationInfos; import org.gridsuite.modification.server.utils.NetworkCreation; import org.gridsuite.modification.server.utils.TestUtils; +import org.hamcrest.core.StringContains; import org.junit.jupiter.api.Tag; import org.junit.jupiter.api.Test; import org.springframework.http.MediaType; @@ -178,14 +179,14 @@ void testCreateWithErrors() throws Exception { modificationJson = getJsonBody(modificationInfos, null); mockMvc.perform(post(getNetworkModificationUri()).content(modificationJson).contentType(MediaType.APPLICATION_JSON)) .andExpectAll( - status().isBadRequest(), - content().string(new NetworkModificationException(OPERATING_ACTION_TYPE_EMPTY).getMessage()) + status().isInternalServerError(), + content().string(StringContains.containsString(new NetworkModificationException(OPERATING_ACTION_TYPE_EMPTY).getMessage())) ); // modification action not existing // note: should never happen in real mockMvc.perform(post(getNetworkModificationUri()).content(modificationJson.replace("LOCKOUT", "INVALID_ACTION")).contentType(MediaType.APPLICATION_JSON)) .andExpect( - status().is4xxClientError()); + status().isInternalServerError()); } @Override diff --git a/src/test/java/org/gridsuite/modification/server/modifications/byfilter/assignment/AbstractModificationByAssignmentTest.java b/src/test/java/org/gridsuite/modification/server/modifications/byfilter/assignment/AbstractModificationByAssignmentTest.java index 5ee834c23..1665695f0 100644 --- a/src/test/java/org/gridsuite/modification/server/modifications/byfilter/assignment/AbstractModificationByAssignmentTest.java +++ b/src/test/java/org/gridsuite/modification/server/modifications/byfilter/assignment/AbstractModificationByAssignmentTest.java @@ -89,7 +89,7 @@ public void specificSetUp() { public void testByModificationError() throws Exception { //Test with modification = null mockMvc.perform(post(getNetworkModificationUri()).content(mapper.writeValueAsString(null)).contentType(MediaType.APPLICATION_JSON)) - .andExpect(status().isBadRequest()); + .andExpect(status().isInternalServerError()); // Test with empty list of assignment checkCreationApplicationStatus(List.of(), NetworkModificationResult.ApplicationStatus.WITH_ERRORS);