diff --git a/components/pom.xml b/components/pom.xml index 9bdbbe3f..b45b1a09 100644 --- a/components/pom.xml +++ b/components/pom.xml @@ -1,12 +1,11 @@ - - + 4.0.0 org.folio mod-workflow - 1.2.0-SNAPSHOT + 1.3.0-SNAPSHOT workflow-components diff --git a/components/src/main/java/org/folio/rest/workflow/model/EmailTask.java b/components/src/main/java/org/folio/rest/workflow/model/EmailTask.java index 7ad5f2ac..79dffb38 100644 --- a/components/src/main/java/org/folio/rest/workflow/model/EmailTask.java +++ b/components/src/main/java/org/folio/rest/workflow/model/EmailTask.java @@ -8,7 +8,7 @@ import lombok.Setter; import org.folio.rest.workflow.model.components.DelegateTask; import org.folio.rest.workflow.model.has.common.HasEmailTaskCommon; -import org.springframework.lang.NonNull; +import org.jspecify.annotations.NonNull; @Entity public class EmailTask extends AbstractTask implements DelegateTask, HasEmailTaskCommon { diff --git a/components/src/main/java/org/folio/rest/workflow/model/NodeInterface.java b/components/src/main/java/org/folio/rest/workflow/model/NodeInterface.java index aecdf593..534be765 100644 --- a/components/src/main/java/org/folio/rest/workflow/model/NodeInterface.java +++ b/components/src/main/java/org/folio/rest/workflow/model/NodeInterface.java @@ -2,8 +2,8 @@ import com.fasterxml.jackson.annotation.JsonSubTypes; import com.fasterxml.jackson.annotation.JsonTypeInfo; -import com.fasterxml.jackson.databind.annotation.JsonTypeIdResolver; import org.folio.rest.workflow.model.resolver.DeserializeAsNodeJsonResolver; +import tools.jackson.databind.annotation.JsonTypeIdResolver; @JsonTypeIdResolver(DeserializeAsNodeJsonResolver.class) @JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.EXISTING_PROPERTY, property = "deserializeAs") diff --git a/components/src/main/java/org/folio/rest/workflow/model/Workflow.java b/components/src/main/java/org/folio/rest/workflow/model/Workflow.java index 38c5ffc4..794d4a38 100644 --- a/components/src/main/java/org/folio/rest/workflow/model/Workflow.java +++ b/components/src/main/java/org/folio/rest/workflow/model/Workflow.java @@ -1,7 +1,6 @@ package org.folio.rest.workflow.model; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; -import com.fasterxml.jackson.databind.JsonNode; import jakarta.persistence.CollectionTable; import jakarta.persistence.Column; import jakarta.persistence.Convert; @@ -33,6 +32,7 @@ import org.folio.spring.domain.model.AbstractBaseEntity; import org.hibernate.annotations.ColumnDefault; import org.springframework.data.annotation.Version; +import tools.jackson.databind.JsonNode; @Entity @JsonIgnoreProperties({ "hibernateLazyInitializer", "handler" }) diff --git a/components/src/main/java/org/folio/rest/workflow/model/converter/AbstractConverter.java b/components/src/main/java/org/folio/rest/workflow/model/converter/AbstractConverter.java index 602fb5c9..ba9ae40d 100644 --- a/components/src/main/java/org/folio/rest/workflow/model/converter/AbstractConverter.java +++ b/components/src/main/java/org/folio/rest/workflow/model/converter/AbstractConverter.java @@ -1,16 +1,19 @@ package org.folio.rest.workflow.model.converter; -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.core.StreamReadFeature; -import com.fasterxml.jackson.core.type.TypeReference; -import com.fasterxml.jackson.databind.DeserializationFeature; -import com.fasterxml.jackson.databind.MapperFeature; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.databind.json.JsonMapper; import jakarta.persistence.AttributeConverter; +import tools.jackson.core.JacksonException; +import tools.jackson.core.StreamReadFeature; +import tools.jackson.core.type.TypeReference; +import tools.jackson.databind.DeserializationFeature; +import tools.jackson.databind.MapperFeature; +import tools.jackson.databind.ObjectMapper; +import tools.jackson.databind.json.JsonMapper; /** - * This converts the value into a JSON representation stored as a single string tin the database. + * This converts the value into a JSON representation stored as a single string in the database. + * + * Implementations need only provide the T. + * Each implementation is expected to be used as-is as a JSON string value without needing the type details. */ public abstract class AbstractConverter implements AttributeConverter { @@ -27,7 +30,7 @@ public String convertToDatabaseColumn(T attribute) { try { return objectMapper.writeValueAsString(attribute); - } catch (JsonProcessingException e) { + } catch (JacksonException e) { throw new RuntimeException(e.getMessage()); } } @@ -38,11 +41,13 @@ public T convertToEntityAttribute(String dbData) { try { return objectMapper.readValue(dbData, getTypeReference()); - } catch (JsonProcessingException e) { + } catch (JacksonException e) { throw new RuntimeException(e.getMessage()); } } - public abstract TypeReference getTypeReference(); + public TypeReference getTypeReference() { + return new TypeReference() {}; + } } diff --git a/components/src/main/java/org/folio/rest/workflow/model/converter/ComparisonListConverter.java b/components/src/main/java/org/folio/rest/workflow/model/converter/ComparisonListConverter.java index 8aca3402..92d07510 100644 --- a/components/src/main/java/org/folio/rest/workflow/model/converter/ComparisonListConverter.java +++ b/components/src/main/java/org/folio/rest/workflow/model/converter/ComparisonListConverter.java @@ -1,16 +1,13 @@ package org.folio.rest.workflow.model.converter; -import com.fasterxml.jackson.core.type.TypeReference; import jakarta.persistence.Converter; import java.util.List; import org.folio.rest.workflow.dto.Comparison; +/** + * Comparison list converter. + */ @Converter public class ComparisonListConverter extends AbstractConverter> { - @Override - public TypeReference> getTypeReference() { - return new TypeReference>() {}; - } - } diff --git a/components/src/main/java/org/folio/rest/workflow/model/converter/EmbeddedVariableConverter.java b/components/src/main/java/org/folio/rest/workflow/model/converter/EmbeddedVariableConverter.java index 8851a5ed..886568c1 100644 --- a/components/src/main/java/org/folio/rest/workflow/model/converter/EmbeddedVariableConverter.java +++ b/components/src/main/java/org/folio/rest/workflow/model/converter/EmbeddedVariableConverter.java @@ -1,6 +1,5 @@ package org.folio.rest.workflow.model.converter; -import com.fasterxml.jackson.core.type.TypeReference; import jakarta.persistence.Converter; import org.folio.rest.workflow.model.EmbeddedVariable; @@ -10,9 +9,4 @@ @Converter public class EmbeddedVariableConverter extends AbstractConverter { - @Override - public TypeReference getTypeReference() { - return new TypeReference() {}; - } - } diff --git a/components/src/main/java/org/folio/rest/workflow/model/converter/InputAttributeListConverter.java b/components/src/main/java/org/folio/rest/workflow/model/converter/InputAttributeListConverter.java index e1de3fd6..dd66694f 100644 --- a/components/src/main/java/org/folio/rest/workflow/model/converter/InputAttributeListConverter.java +++ b/components/src/main/java/org/folio/rest/workflow/model/converter/InputAttributeListConverter.java @@ -1,6 +1,5 @@ package org.folio.rest.workflow.model.converter; -import com.fasterxml.jackson.core.type.TypeReference; import jakarta.persistence.Converter; import java.util.List; import org.folio.rest.workflow.enums.InputAttribute; @@ -11,9 +10,4 @@ @Converter public class InputAttributeListConverter extends AbstractConverter> { - @Override - public TypeReference> getTypeReference() { - return new TypeReference>() {}; - } - } diff --git a/components/src/main/java/org/folio/rest/workflow/model/converter/JsonNodeConverter.java b/components/src/main/java/org/folio/rest/workflow/model/converter/JsonNodeConverter.java index 243c88c3..a7dfa108 100644 --- a/components/src/main/java/org/folio/rest/workflow/model/converter/JsonNodeConverter.java +++ b/components/src/main/java/org/folio/rest/workflow/model/converter/JsonNodeConverter.java @@ -1,15 +1,12 @@ package org.folio.rest.workflow.model.converter; -import com.fasterxml.jackson.core.type.TypeReference; -import com.fasterxml.jackson.databind.JsonNode; import jakarta.persistence.Converter; +import tools.jackson.databind.JsonNode; +/** + * JSON Node converted. + */ @Converter public class JsonNodeConverter extends AbstractConverter { - @Override - public TypeReference getTypeReference() { - return new TypeReference() {}; - } - } diff --git a/components/src/main/java/org/folio/rest/workflow/model/converter/MappingListConverter.java b/components/src/main/java/org/folio/rest/workflow/model/converter/MappingListConverter.java index 214b94e7..bc26a402 100644 --- a/components/src/main/java/org/folio/rest/workflow/model/converter/MappingListConverter.java +++ b/components/src/main/java/org/folio/rest/workflow/model/converter/MappingListConverter.java @@ -1,16 +1,13 @@ package org.folio.rest.workflow.model.converter; -import com.fasterxml.jackson.core.type.TypeReference; import jakarta.persistence.Converter; import java.util.List; import org.folio.rest.workflow.dto.Mapping; +/** + * Mapping list converter. + */ @Converter public class MappingListConverter extends AbstractConverter> { - @Override - public TypeReference> getTypeReference() { - return new TypeReference>() {}; - } - } diff --git a/components/src/main/java/org/folio/rest/workflow/model/converter/RequestConverter.java b/components/src/main/java/org/folio/rest/workflow/model/converter/RequestConverter.java index 99e372a2..386bb988 100644 --- a/components/src/main/java/org/folio/rest/workflow/model/converter/RequestConverter.java +++ b/components/src/main/java/org/folio/rest/workflow/model/converter/RequestConverter.java @@ -1,15 +1,12 @@ package org.folio.rest.workflow.model.converter; -import com.fasterxml.jackson.core.type.TypeReference; import jakarta.persistence.Converter; import org.folio.rest.workflow.dto.Request; +/** + * Request converter. + */ @Converter public class RequestConverter extends AbstractConverter { - @Override - public TypeReference getTypeReference() { - return new TypeReference() {}; - } - } diff --git a/components/src/main/java/org/folio/rest/workflow/model/converter/StringListConverter.java b/components/src/main/java/org/folio/rest/workflow/model/converter/StringListConverter.java index 4e23b188..a36e75d9 100644 --- a/components/src/main/java/org/folio/rest/workflow/model/converter/StringListConverter.java +++ b/components/src/main/java/org/folio/rest/workflow/model/converter/StringListConverter.java @@ -1,6 +1,5 @@ package org.folio.rest.workflow.model.converter; -import com.fasterxml.jackson.core.type.TypeReference; import jakarta.persistence.Converter; import java.util.List; @@ -10,9 +9,4 @@ @Converter public class StringListConverter extends AbstractConverter> { - @Override - public TypeReference> getTypeReference() { - return new TypeReference>() {}; - } - } diff --git a/components/src/main/java/org/folio/rest/workflow/model/has/common/HasWorkflowCommon.java b/components/src/main/java/org/folio/rest/workflow/model/has/common/HasWorkflowCommon.java index bf468779..0abd219d 100644 --- a/components/src/main/java/org/folio/rest/workflow/model/has/common/HasWorkflowCommon.java +++ b/components/src/main/java/org/folio/rest/workflow/model/has/common/HasWorkflowCommon.java @@ -1,8 +1,8 @@ package org.folio.rest.workflow.model.has.common; -import com.fasterxml.jackson.databind.JsonNode; import java.util.Map; import org.folio.rest.workflow.model.Setup; +import tools.jackson.databind.JsonNode; /** * This interface provides common methods for {@link org.folio.rest.workflow.model.Workflow Workflow}. diff --git a/components/src/main/java/org/folio/rest/workflow/model/resolver/DeserializeAsNodeJsonResolver.java b/components/src/main/java/org/folio/rest/workflow/model/resolver/DeserializeAsNodeJsonResolver.java index 8ea28f5a..8dde4c87 100644 --- a/components/src/main/java/org/folio/rest/workflow/model/resolver/DeserializeAsNodeJsonResolver.java +++ b/components/src/main/java/org/folio/rest/workflow/model/resolver/DeserializeAsNodeJsonResolver.java @@ -3,9 +3,6 @@ import static java.util.Map.entry; import com.fasterxml.jackson.annotation.JsonTypeInfo.Id; -import com.fasterxml.jackson.databind.DatabindContext; -import com.fasterxml.jackson.databind.JavaType; -import com.fasterxml.jackson.databind.jsontype.impl.TypeIdResolverBase; import java.util.Map; import org.folio.rest.workflow.model.CompressFileTask; import org.folio.rest.workflow.model.Condition; @@ -34,12 +31,18 @@ import org.folio.rest.workflow.model.Subprocess; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import tools.jackson.core.JacksonException; +import tools.jackson.databind.DatabindContext; +import tools.jackson.databind.JavaType; +import tools.jackson.databind.jsontype.impl.TypeIdResolverBase; /** * Resolve the type from the `deserializeAs` field from a `Node`. */ public class DeserializeAsNodeJsonResolver extends TypeIdResolverBase { + private static final long serialVersionUID = 30422936630293L; + /** * A map of classes that are allowed to be deserialized. */ @@ -73,13 +76,13 @@ public class DeserializeAsNodeJsonResolver extends TypeIdResolverBase { private static final Logger logger = LoggerFactory.getLogger(DeserializeAsNodeJsonResolver.class); @Override - public String idFromValue(Object value) { + public String idFromValue(DatabindContext ctxt, Object value) throws JacksonException { return value.getClass().getSimpleName(); } @Override - public String idFromValueAndType(Object value, Class suggestedType) { - return idFromValue(value); + public String idFromValueAndType(DatabindContext ctxt, Object value, Class suggestedType) throws JacksonException { + return idFromValue(ctxt, value); } @Override diff --git a/components/src/test/java/org/folio/rest/workflow/model/WorkflowTest.java b/components/src/test/java/org/folio/rest/workflow/model/WorkflowTest.java index 22fc17ed..416a71ec 100644 --- a/components/src/test/java/org/folio/rest/workflow/model/WorkflowTest.java +++ b/components/src/test/java/org/folio/rest/workflow/model/WorkflowTest.java @@ -6,7 +6,6 @@ import static org.springframework.test.util.ReflectionTestUtils.getField; import static org.springframework.test.util.ReflectionTestUtils.setField; -import com.fasterxml.jackson.databind.JsonNode; import java.util.ArrayList; import java.util.HashMap; import java.util.List; @@ -20,6 +19,7 @@ import org.junit.jupiter.params.provider.MethodSource; import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; +import tools.jackson.databind.JsonNode; @ExtendWith(MockitoExtension.class) class WorkflowTest { diff --git a/components/src/test/java/org/folio/rest/workflow/model/converter/AbstractConverterTest.java b/components/src/test/java/org/folio/rest/workflow/model/converter/AbstractConverterTest.java index 6788aadd..f9d35560 100644 --- a/components/src/test/java/org/folio/rest/workflow/model/converter/AbstractConverterTest.java +++ b/components/src/test/java/org/folio/rest/workflow/model/converter/AbstractConverterTest.java @@ -5,10 +5,10 @@ import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertNotNull; -import com.fasterxml.jackson.core.type.TypeReference; import java.util.List; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; +import tools.jackson.core.type.TypeReference; class AbstractConverterTest { diff --git a/components/src/test/java/org/folio/rest/workflow/model/resolver/DeserializeAsNodeJsonResolverTest.java b/components/src/test/java/org/folio/rest/workflow/model/resolver/DeserializeAsNodeJsonResolverTest.java index 8b31f631..33a8887b 100644 --- a/components/src/test/java/org/folio/rest/workflow/model/resolver/DeserializeAsNodeJsonResolverTest.java +++ b/components/src/test/java/org/folio/rest/workflow/model/resolver/DeserializeAsNodeJsonResolverTest.java @@ -5,10 +5,6 @@ import static org.mockito.Mockito.when; import com.fasterxml.jackson.annotation.JsonTypeInfo.Id; -import com.fasterxml.jackson.databind.DatabindContext; -import com.fasterxml.jackson.databind.JavaType; -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.ObjectMapper; import java.util.stream.Stream; import java.util.stream.Stream.Builder; import org.junit.jupiter.api.BeforeEach; @@ -22,6 +18,11 @@ import org.mockito.InjectMocks; import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; +import tools.jackson.databind.DatabindContext; +import tools.jackson.databind.JavaType; +import tools.jackson.databind.JsonNode; +import tools.jackson.databind.ObjectMapper; +import tools.jackson.databind.json.JsonMapper; @ExtendWith(MockitoExtension.class) class DeserializeAsNodeJsonResolverTest { @@ -36,19 +37,19 @@ class DeserializeAsNodeJsonResolverTest { @BeforeEach void beforeEach() { - mapper = new ObjectMapper(); + mapper = JsonMapper.builder().build(); } @Test void idFromValueWorksTest() { - String result = deserializeAsJsonResolver.idFromValue(new String()); + String result = deserializeAsJsonResolver.idFromValue(null, new String()); assertEquals(String.class.getSimpleName(), result); } @Test void idFromValueAndTypeWorksTest() { - String result = deserializeAsJsonResolver.idFromValueAndType(new String(), JsonNode.class); + String result = deserializeAsJsonResolver.idFromValueAndType(null, new String(), JsonNode.class); assertEquals(String.class.getSimpleName(), result); } diff --git a/pom.xml b/pom.xml index 1d11cc25..21baf67b 100644 --- a/pom.xml +++ b/pom.xml @@ -6,11 +6,11 @@ org.folio spring-module-core - 2.1.0-SNAPSHOT + 2.2.0-SNAPSHOT mod-workflow - 1.2.0-SNAPSHOT + 1.3.0-SNAPSHOT Okapi Workflow Module Okapi workflow module using Spring Boot @@ -31,7 +31,7 @@ UTF-8 - 2.1.0-SNAPSHOT + 2.2.0-SNAPSHOT true diff --git a/service/pom.xml b/service/pom.xml index c14a479a..0bb1ae92 100644 --- a/service/pom.xml +++ b/service/pom.xml @@ -1,12 +1,11 @@ - - + 4.0.0 org.folio mod-workflow - 1.2.0-SNAPSHOT + 1.3.0-SNAPSHOT workflow-service @@ -18,7 +17,7 @@ 9000 - 8.3.0-SNAPSHOT + 10.0.0 @@ -83,12 +82,12 @@ org.springframework.boot spring-boot-starter-test - - - org.springframework.boot - spring-boot-starter-logging - - + test + + + + org.springframework.boot + spring-boot-starter-webmvc-test test @@ -101,7 +100,7 @@ org.apache.commons commons-compress - 1.26.2 + 1.28.0 @@ -116,8 +115,8 @@ - org.hibernate.orm.tooling - hibernate-enhance-maven-plugin + org.hibernate.orm + hibernate-maven-plugin enhance @@ -126,7 +125,6 @@ enhance - true true true true diff --git a/service/src/main/java/org/folio/rest/workflow/config/FolioSpringLiquibaseConfig.java b/service/src/main/java/org/folio/rest/workflow/config/FolioSpringLiquibaseConfig.java index d60265c5..30cb83b3 100644 --- a/service/src/main/java/org/folio/rest/workflow/config/FolioSpringLiquibaseConfig.java +++ b/service/src/main/java/org/folio/rest/workflow/config/FolioSpringLiquibaseConfig.java @@ -8,7 +8,7 @@ public class FolioSpringLiquibaseConfig { @Bean - public FolioSpringLiquibase folioSpringLiquibase() { + FolioSpringLiquibase folioSpringLiquibase() { return new FolioSpringLiquibase(); } diff --git a/service/src/main/java/org/folio/rest/workflow/config/KafkaProducerConfig.java b/service/src/main/java/org/folio/rest/workflow/config/KafkaProducerConfig.java index 8dfae5cf..95664d35 100644 --- a/service/src/main/java/org/folio/rest/workflow/config/KafkaProducerConfig.java +++ b/service/src/main/java/org/folio/rest/workflow/config/KafkaProducerConfig.java @@ -33,7 +33,7 @@ public ProducerFactory eventProducerFactory() { } @Bean - public KafkaTemplate eventKafkaTemplate() { + KafkaTemplate eventKafkaTemplate() { return new KafkaTemplate<>(eventProducerFactory()); } diff --git a/service/src/main/java/org/folio/rest/workflow/config/OkHttpConfig.java b/service/src/main/java/org/folio/rest/workflow/config/OkHttpConfig.java index 0d2bada2..629ee7c6 100644 --- a/service/src/main/java/org/folio/rest/workflow/config/OkHttpConfig.java +++ b/service/src/main/java/org/folio/rest/workflow/config/OkHttpConfig.java @@ -1,22 +1,8 @@ package org.folio.rest.workflow.config; -import feign.okhttp.OkHttpClient; -import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration public class OkHttpConfig { - /** - * Add feignOkHttpClient to prevent issues introduced when using folio-spring-base. - * - * The issue involves enrichUrlAndHeadersClient, FeignClientConfiguration, and okhttp3.OkHttpClient. - * - * This defines a bean of type 'okhttp3.OkHttpClient' to prevent the error. - */ - @Bean - public OkHttpClient feignOkHttpClient() { - return new OkHttpClient(); - } - } diff --git a/service/src/main/java/org/folio/rest/workflow/controller/EventController.java b/service/src/main/java/org/folio/rest/workflow/controller/EventController.java index 58f4e242..fe8caee1 100644 --- a/service/src/main/java/org/folio/rest/workflow/controller/EventController.java +++ b/service/src/main/java/org/folio/rest/workflow/controller/EventController.java @@ -1,8 +1,5 @@ package org.folio.rest.workflow.controller; -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.databind.node.ObjectNode; import jakarta.servlet.http.HttpServletRequest; import java.io.File; import java.io.IOException; @@ -35,6 +32,9 @@ import org.springframework.web.bind.annotation.RestController; import org.springframework.web.multipart.MultipartFile; import org.springframework.web.servlet.HandlerMapping; +import tools.jackson.databind.JsonNode; +import tools.jackson.databind.ObjectMapper; +import tools.jackson.databind.node.ObjectNode; @RestController @RequestMapping("/events") diff --git a/service/src/main/java/org/folio/rest/workflow/controller/WorkflowController.java b/service/src/main/java/org/folio/rest/workflow/controller/WorkflowController.java index d5f6e435..05d4bdf2 100644 --- a/service/src/main/java/org/folio/rest/workflow/controller/WorkflowController.java +++ b/service/src/main/java/org/folio/rest/workflow/controller/WorkflowController.java @@ -1,6 +1,5 @@ package org.folio.rest.workflow.controller; -import com.fasterxml.jackson.databind.JsonNode; import java.io.IOException; import java.net.URI; import java.net.URISyntaxException; @@ -30,6 +29,7 @@ import org.springframework.web.bind.annotation.RequestPart; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.multipart.MultipartFile; +import tools.jackson.databind.JsonNode; @Slf4j @RestController diff --git a/service/src/main/java/org/folio/rest/workflow/controller/advice/AbstractAdvice.java b/service/src/main/java/org/folio/rest/workflow/controller/advice/AbstractAdvice.java index 07f3231b..c08d0fa7 100644 --- a/service/src/main/java/org/folio/rest/workflow/controller/advice/AbstractAdvice.java +++ b/service/src/main/java/org/folio/rest/workflow/controller/advice/AbstractAdvice.java @@ -1,11 +1,12 @@ package org.folio.rest.workflow.controller.advice; -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.databind.ObjectMapper; + import org.folio.spring.web.utility.ErrorUtility; import org.springframework.http.HttpStatus; import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; import org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping; +import tools.jackson.core.JacksonException; +import tools.jackson.databind.ObjectMapper; abstract class AbstractAdvice extends RequestMappingHandlerMapping { @@ -46,7 +47,7 @@ protected ResponseEntity buildError(Exception ex, HttpStatus code, Medi // Catch the exceptions and report it, then fall back to a plain text error message. try { message = getObjectMapper().writeValueAsString(ErrorUtility.buildError(ex, code)); - } catch (JsonProcessingException e) { + } catch (JacksonException e) { logger.error("Mapping error to JSON Object failed.", e); type = MediaType.TEXT_PLAIN; diff --git a/service/src/main/java/org/folio/rest/workflow/controller/advice/EventControllerAdvice.java b/service/src/main/java/org/folio/rest/workflow/controller/advice/EventControllerAdvice.java index 640acc41..39a9db5c 100644 --- a/service/src/main/java/org/folio/rest/workflow/controller/advice/EventControllerAdvice.java +++ b/service/src/main/java/org/folio/rest/workflow/controller/advice/EventControllerAdvice.java @@ -1,5 +1,4 @@ package org.folio.rest.workflow.controller.advice; -import com.fasterxml.jackson.databind.ObjectMapper; import java.nio.file.FileSystemException; import org.folio.rest.workflow.exception.EventPublishException; import org.springframework.http.HttpStatus; @@ -7,6 +6,8 @@ import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.ResponseStatus; import org.springframework.web.bind.annotation.RestControllerAdvice; +import tools.jackson.databind.ObjectMapper; +import tools.jackson.databind.json.JsonMapper; @RestControllerAdvice public class EventControllerAdvice extends AbstractAdvice { @@ -14,7 +15,7 @@ public class EventControllerAdvice extends AbstractAdvice { ObjectMapper objectMapper; public EventControllerAdvice() { - this.objectMapper = new ObjectMapper(); + this.objectMapper = JsonMapper.builder().build(); } @Override diff --git a/service/src/main/java/org/folio/rest/workflow/controller/advice/GlobalAdvice.java b/service/src/main/java/org/folio/rest/workflow/controller/advice/GlobalAdvice.java index 70ad596a..8f0342ff 100644 --- a/service/src/main/java/org/folio/rest/workflow/controller/advice/GlobalAdvice.java +++ b/service/src/main/java/org/folio/rest/workflow/controller/advice/GlobalAdvice.java @@ -1,11 +1,12 @@ package org.folio.rest.workflow.controller.advice; -import com.fasterxml.jackson.databind.ObjectMapper; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.transaction.TransactionSystemException; import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.RestControllerAdvice; +import tools.jackson.databind.ObjectMapper; +import tools.jackson.databind.json.JsonMapper; @RestControllerAdvice public class GlobalAdvice extends AbstractAdvice { @@ -13,7 +14,7 @@ public class GlobalAdvice extends AbstractAdvice { ObjectMapper objectMapper; public GlobalAdvice() { - this.objectMapper = new ObjectMapper(); + this.objectMapper = JsonMapper.builder().build(); } @Override diff --git a/service/src/main/java/org/folio/rest/workflow/controller/advice/WorkflowControllerAdvice.java b/service/src/main/java/org/folio/rest/workflow/controller/advice/WorkflowControllerAdvice.java index 4f598024..88cebeef 100644 --- a/service/src/main/java/org/folio/rest/workflow/controller/advice/WorkflowControllerAdvice.java +++ b/service/src/main/java/org/folio/rest/workflow/controller/advice/WorkflowControllerAdvice.java @@ -1,6 +1,5 @@ package org.folio.rest.workflow.controller.advice; -import com.fasterxml.jackson.databind.ObjectMapper; import jakarta.persistence.EntityNotFoundException; import org.folio.rest.workflow.exception.WorkflowAlreadyActiveException; import org.folio.rest.workflow.exception.WorkflowCreateAlreadyExistsException; @@ -13,6 +12,8 @@ import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.ResponseStatus; import org.springframework.web.bind.annotation.RestControllerAdvice; +import tools.jackson.databind.ObjectMapper; +import tools.jackson.databind.json.JsonMapper; @RestControllerAdvice public class WorkflowControllerAdvice extends AbstractAdvice { @@ -20,7 +21,7 @@ public class WorkflowControllerAdvice extends AbstractAdvice { ObjectMapper objectMapper; public WorkflowControllerAdvice() { - this.objectMapper = new ObjectMapper(); + this.objectMapper = JsonMapper.builder().build(); } @Override @@ -48,7 +49,7 @@ public ResponseEntity handleWorkflowNotFoundException(WorkflowNotFoundEx @ResponseStatus(HttpStatus.FORBIDDEN) @ExceptionHandler(WorkflowAlreadyActiveException.class) - public ResponseEntity handleWorkflowAlreadyActivrException(WorkflowAlreadyActiveException exception) { + public ResponseEntity handleWorkflowAlreadyActiveException(WorkflowAlreadyActiveException exception) { return buildError(exception, HttpStatus.FORBIDDEN); } @@ -66,7 +67,7 @@ public ResponseEntity handleWorkflowEngineServiceException(WorkflowEngin @ResponseStatus(HttpStatus.BAD_REQUEST) @ExceptionHandler(WorkflowImportException.class) - public ResponseEntity handleWorkflowImportExceptionException(WorkflowImportException exception) { + public ResponseEntity handleWorkflowImportException(WorkflowImportException exception) { return buildError(exception, HttpStatus.BAD_REQUEST); } diff --git a/service/src/main/java/org/folio/rest/workflow/model/ExtractedWorkflow.java b/service/src/main/java/org/folio/rest/workflow/model/ExtractedWorkflow.java index 916ff0d2..c26f8775 100644 --- a/service/src/main/java/org/folio/rest/workflow/model/ExtractedWorkflow.java +++ b/service/src/main/java/org/folio/rest/workflow/model/ExtractedWorkflow.java @@ -1,12 +1,12 @@ package org.folio.rest.workflow.model; -import com.fasterxml.jackson.databind.JsonNode; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.regex.Pattern; import lombok.Getter; +import tools.jackson.databind.JsonNode; /** * A collection of Workflow Nodes for use during import. diff --git a/service/src/main/java/org/folio/rest/workflow/model/repo/WorkflowRepo.java b/service/src/main/java/org/folio/rest/workflow/model/repo/WorkflowRepo.java index 28ccc3ed..cda44f94 100644 --- a/service/src/main/java/org/folio/rest/workflow/model/repo/WorkflowRepo.java +++ b/service/src/main/java/org/folio/rest/workflow/model/repo/WorkflowRepo.java @@ -2,6 +2,7 @@ import org.folio.rest.workflow.model.Workflow; import org.folio.spring.cql.JpaCqlRepository; +import org.springframework.data.jpa.repository.Query; import org.springframework.data.rest.core.annotation.RepositoryRestResource; import org.springframework.data.rest.core.annotation.RestResource; @@ -19,4 +20,7 @@ public interface WorkflowRepo extends JpaCqlRepository { @Override @RestResource(exported = false) public void deleteById(String id); + + @Query("SELECT COUNT(*) FROM Workflow") + public long countAll(); } diff --git a/service/src/main/java/org/folio/rest/workflow/service/AbstractCqlService.java b/service/src/main/java/org/folio/rest/workflow/service/AbstractCqlService.java index afec2756..cea856d4 100644 --- a/service/src/main/java/org/folio/rest/workflow/service/AbstractCqlService.java +++ b/service/src/main/java/org/folio/rest/workflow/service/AbstractCqlService.java @@ -1,9 +1,9 @@ package org.folio.rest.workflow.service; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.databind.node.ArrayNode; -import com.fasterxml.jackson.databind.node.ObjectNode; import java.util.List; +import tools.jackson.databind.ObjectMapper; +import tools.jackson.databind.node.ArrayNode; +import tools.jackson.databind.node.ObjectNode; /** * Provide common CQL-specific service functionality. diff --git a/service/src/main/java/org/folio/rest/workflow/service/OkapiDiscoveryService.java b/service/src/main/java/org/folio/rest/workflow/service/OkapiDiscoveryService.java index 17e8e7db..8f84e63d 100644 --- a/service/src/main/java/org/folio/rest/workflow/service/OkapiDiscoveryService.java +++ b/service/src/main/java/org/folio/rest/workflow/service/OkapiDiscoveryService.java @@ -2,8 +2,6 @@ import static org.springframework.http.HttpMethod.GET; -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.ObjectMapper; import java.io.IOException; import java.util.ArrayList; import java.util.HashMap; @@ -20,6 +18,8 @@ import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; import org.springframework.stereotype.Service; +import tools.jackson.databind.JsonNode; +import tools.jackson.databind.ObjectMapper; @Service public class OkapiDiscoveryService { @@ -56,7 +56,7 @@ public List getActionsByTenant(String tenant) throws IOException { List actions = new ArrayList<>(); JsonNode modulesNode = getModules(tenant); for (JsonNode moduleNode : modulesNode) { - String id = moduleNode.get("id").asText(); + String id = moduleNode.get("id").asString(); actions.addAll(getActionsByTenantAndModuleId(tenant, id)); } return actions; @@ -81,7 +81,7 @@ public Map> getHandlers(String tenant, String id) throws I if (moduleDescriptorNode.get(PROVIDES) != null) { for (JsonNode interfaceNode : moduleDescriptorNode.get(PROVIDES)) { List handlers = new ArrayList<>(); - String interfaceName = interfaceNode.get(ID).asText(); + String interfaceName = interfaceNode.get(ID).asString(); for (JsonNode handlersNode : interfaceNode.get(HANDLERS)) { handlers.add(objectMapper.readValue(handlersNode.toString(), Handler.class)); } diff --git a/service/src/main/java/org/folio/rest/workflow/service/WorkflowCqlService.java b/service/src/main/java/org/folio/rest/workflow/service/WorkflowCqlService.java index 34749d1e..dbb0cea8 100644 --- a/service/src/main/java/org/folio/rest/workflow/service/WorkflowCqlService.java +++ b/service/src/main/java/org/folio/rest/workflow/service/WorkflowCqlService.java @@ -1,13 +1,13 @@ package org.folio.rest.workflow.service; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.databind.node.ObjectNode; import org.apache.commons.lang3.StringUtils; import org.folio.rest.workflow.model.Workflow; import org.folio.rest.workflow.model.repo.WorkflowRepo; import org.folio.spring.data.OffsetRequest; import org.springframework.data.domain.Page; import org.springframework.stereotype.Service; +import tools.jackson.databind.ObjectMapper; +import tools.jackson.databind.node.ObjectNode; @Service public class WorkflowCqlService extends AbstractCqlService { @@ -19,11 +19,6 @@ public WorkflowCqlService(ObjectMapper mapper, WorkflowRepo repo) { this.repo = repo; } - @Override - protected String getTypeName() { - return Workflow.class.getSimpleName().toLowerCase() + "s"; - } - @Override public ObjectNode findByCql(String query, Long offset, Integer limit) { Page page = null; @@ -31,13 +26,18 @@ public ObjectNode findByCql(String query, Long offset, Integer limit) { if (StringUtils.isBlank(query)) { page = repo.findAll(new OffsetRequest(offset, limit)); - total = repo.count(); + total = repo.countAll(); } else { page = repo.findByCql(query, new OffsetRequest(offset, limit)); - total = repo.count(query); + total = repo.countByCql(query); } return toJson(page.toList(), total); } + @Override + protected String getTypeName() { + return Workflow.class.getSimpleName().toLowerCase() + "s"; + } + } diff --git a/service/src/main/java/org/folio/rest/workflow/service/WorkflowEngineService.java b/service/src/main/java/org/folio/rest/workflow/service/WorkflowEngineService.java index 155f8436..be5a4dfd 100644 --- a/service/src/main/java/org/folio/rest/workflow/service/WorkflowEngineService.java +++ b/service/src/main/java/org/folio/rest/workflow/service/WorkflowEngineService.java @@ -1,9 +1,5 @@ package org.folio.rest.workflow.service; -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.databind.node.ArrayNode; -import com.fasterxml.jackson.databind.node.ObjectNode; import java.util.Iterator; import lombok.extern.slf4j.Slf4j; import org.folio.rest.workflow.dto.WorkflowDto; @@ -14,7 +10,7 @@ import org.folio.rest.workflow.model.repo.WorkflowRepo; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; -import org.springframework.boot.web.client.RestTemplateBuilder; +import org.springframework.boot.restclient.RestTemplateBuilder; import org.springframework.http.HttpEntity; import org.springframework.http.HttpHeaders; import org.springframework.http.HttpMethod; @@ -22,6 +18,10 @@ import org.springframework.http.ResponseEntity; import org.springframework.stereotype.Service; import org.springframework.web.client.RestTemplate; +import tools.jackson.databind.JsonNode; +import tools.jackson.databind.ObjectMapper; +import tools.jackson.databind.node.ArrayNode; +import tools.jackson.databind.node.ObjectNode; @Slf4j @Service @@ -121,7 +121,7 @@ public JsonNode start(String workflowId, String tenant, String token, JsonNode c String version = workflow.getVersionTag(); JsonNode definition = fetchDeploymentDefinition(id, version, tenant, token); - String definitionId = definition.get("id").asText(); + String definitionId = definition.get("id").asString(); HttpEntity contextHttpEntity = new HttpEntity<>(context, headers(tenant, token)); @@ -141,7 +141,7 @@ public JsonNode history(String workflowId, String tenant, String token) throws W String version = workflow.getVersionTag(); JsonNode processDefinition = fetchDeploymentDefinition(deploymentId, version, tenant, token); - String processDefinitionId = processDefinition.get("id").asText(); + String processDefinitionId = processDefinition.get("id").asString(); ArrayNode instances = fetchProcessInstanceHistory(processDefinitionId, tenant, token); @@ -149,7 +149,7 @@ public JsonNode history(String workflowId, String tenant, String token) throws W while (iter.hasNext()) { JsonNode instance = iter.next(); - String processInstanceId = instance.get("id").asText(); + String processInstanceId = instance.get("id").asString(); ((ObjectNode) instance).withArray("incidents") .addAll(fetchIncidentsHistory(processInstanceId, tenant, token)); diff --git a/service/src/main/java/org/folio/rest/workflow/service/WorkflowImportService.java b/service/src/main/java/org/folio/rest/workflow/service/WorkflowImportService.java index 82caef6e..dcee8a66 100644 --- a/service/src/main/java/org/folio/rest/workflow/service/WorkflowImportService.java +++ b/service/src/main/java/org/folio/rest/workflow/service/WorkflowImportService.java @@ -21,11 +21,6 @@ import static org.folio.rest.workflow.model.ExtractedWorkflow.WORKFLOW_JSON; import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.databind.node.ArrayNode; -import com.fasterxml.jackson.databind.node.JsonNodeType; -import com.fasterxml.jackson.databind.node.ObjectNode; import com.github.jknack.handlebars.internal.Files; import java.io.BufferedInputStream; import java.io.IOException; @@ -61,6 +56,11 @@ import org.folio.rest.workflow.utility.CompressFileMagic; import org.springframework.core.io.Resource; import org.springframework.stereotype.Service; +import tools.jackson.databind.JsonNode; +import tools.jackson.databind.ObjectMapper; +import tools.jackson.databind.node.ArrayNode; +import tools.jackson.databind.node.JsonNodeType; +import tools.jackson.databind.node.ObjectNode; @Slf4j @Service @@ -150,8 +150,8 @@ private void collapseNodeScripts(ExtractedWorkflow extracted) throws WorkflowImp continue; } - String scriptFormat = entry.getValue().get(SCRIPT_FORMAT).asText(); - String fileName = entry.getValue().get(CODE).asText(); + String scriptFormat = entry.getValue().get(SCRIPT_FORMAT).asString(); + String fileName = entry.getValue().get(CODE).asString(); String extension = scriptFormat.toLowerCase().trim(); switch (scriptFormat) { @@ -189,7 +189,7 @@ private void collapseNodeScripts(ExtractedWorkflow extracted) throws WorkflowImp * @throws WorkflowImportInvalidOrMissingProperty If a property is missing. */ private boolean collapseNodeScriptsContinue(Entry entry) throws WorkflowImportInvalidOrMissingProperty { - String deserializeAs = entry.getValue().get(DESERIALIZE_AS).asText(); + String deserializeAs = entry.getValue().get(DESERIALIZE_AS).asString(); if (!SCRIPT_TASK.equalsIgnoreCase(deserializeAs)) { return true; } @@ -340,9 +340,9 @@ private void extractSubLevel(String name, InputStream inputStream, ExtractedWork } if (pathParts[0].equalsIgnoreCase(NODES)) { - extracted.getNodes().put(json.get(ID).asText(), json); + extracted.getNodes().put(json.get(ID).asString(), json); } else { - extracted.getTriggers().put(json.get(ID).asText(), json); + extracted.getTriggers().put(json.get(ID).asString(), json); } } @@ -362,7 +362,7 @@ private void expandWorkflow(ExtractedWorkflow extracted) throws JsonProcessingE } JsonNode workflowNode = extracted.getRequired().get(WORKFLOW_JSON); - String workflowId = workflowNode.get(ID).asText(); + String workflowId = workflowNode.get(ID).asString(); // The expandNode() method requires the Workflow to be on the getNodes(), so temporarily add it. extracted.getNodes().put(workflowId, extracted.getRequired().get(WORKFLOW_JSON)); @@ -386,7 +386,7 @@ private void expandWorkflow(ExtractedWorkflow extracted) throws JsonProcessingE * @throws WorkflowImportInvalidOrMissingProperty On invalid property. */ private void expandNode(Map nodes, JsonNode node, List expanded) throws JsonProcessingException, WorkflowImportInvalidOrMissingProperty { - String nodeId = node.get(ID).asText(); + String nodeId = node.get(ID).asString(); if (expanded.contains(nodeId)) { return; } @@ -493,7 +493,7 @@ private void verifyExistence(JsonNode json) throws WorkflowImportException { throw new WorkflowImportInvalidOrMissingProperty(null, ID); } - String id = json.get(ID).asText(); + String id = json.get(ID).asString(); if (workflowRepo.existsById(id)) { throw new WorkflowImportAlreadyImported(id); @@ -539,7 +539,7 @@ private boolean verifyPathParts(String name, String[] pathParts) { */ private void verifyVersion(JsonNode json) { if (json.has(VERSION)) { - String version = json.get(VERSION).asText(); + String version = json.get(VERSION).asString(); if (!VERSION_PATTERN_1_0.matcher(version).find()) { log.warn("Unknown version '{}', attempting import anyway.", version); diff --git a/service/src/main/resources/application.yaml b/service/src/main/resources/application.yaml index fccec1d3..dfb80fb4 100644 --- a/service/src/main/resources/application.yaml +++ b/service/src/main/resources/application.yaml @@ -15,9 +15,6 @@ server: port: 8081 servlet: context-path: / - encoding: - charset: UTF-8 - enabled: true spring: application.name: mod-workflow @@ -38,6 +35,11 @@ spring: banner-mode: console log-startup-info: true + servlet: + encoding: + charset: UTF-8 + enabled: true + sql: init: #platform: h2 diff --git a/service/src/test/java/org/folio/rest/workflow/config/JunitHelperWebMvcConfig.java b/service/src/test/java/org/folio/rest/workflow/config/JunitHelperWebMvcConfig.java new file mode 100644 index 00000000..53376f62 --- /dev/null +++ b/service/src/test/java/org/folio/rest/workflow/config/JunitHelperWebMvcConfig.java @@ -0,0 +1,26 @@ +package org.folio.rest.workflow.config; + +import org.springframework.boot.test.context.TestConfiguration; +import org.springframework.context.annotation.Bean; +import org.springframework.test.context.ActiveProfiles; +import tools.jackson.databind.DeserializationFeature; +import tools.jackson.databind.ObjectMapper; +import tools.jackson.databind.json.JsonMapper; + +/** + * Provide custom web MVC settings for use during unit tests. + */ +@TestConfiguration +@ActiveProfiles("test") +public class JunitHelperWebMvcConfig { + + @Bean + ObjectMapper objectMapper() { + final ObjectMapper mapper = JsonMapper + .builder() + .disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES) + .build(); + + return mapper; + } +} diff --git a/service/src/test/java/org/folio/rest/workflow/controller/ActionControllerTest.java b/service/src/test/java/org/folio/rest/workflow/controller/ActionControllerTest.java index fb1107bd..0fc85616 100644 --- a/service/src/test/java/org/folio/rest/workflow/controller/ActionControllerTest.java +++ b/service/src/test/java/org/folio/rest/workflow/controller/ActionControllerTest.java @@ -33,7 +33,6 @@ import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.log; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; -import com.fasterxml.jackson.databind.ObjectMapper; import java.lang.reflect.Method; import java.util.ArrayList; import java.util.List; @@ -48,7 +47,7 @@ import org.junit.jupiter.params.provider.MethodSource; import org.mockito.junit.jupiter.MockitoExtension; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; +import org.springframework.boot.webmvc.test.autoconfigure.WebMvcTest; import org.springframework.http.HttpHeaders; import org.springframework.http.MediaType; import org.springframework.test.context.bean.override.mockito.MockitoBean; @@ -57,6 +56,7 @@ import org.springframework.test.web.servlet.request.MockHttpServletRequestBuilder; import org.springframework.test.web.servlet.setup.MockMvcBuilders; import org.springframework.util.MultiValueMap; +import tools.jackson.databind.ObjectMapper; @WebMvcTest(ActionController.class) @ExtendWith(MockitoExtension.class) diff --git a/service/src/test/java/org/folio/rest/workflow/controller/EventControllerTest.java b/service/src/test/java/org/folio/rest/workflow/controller/EventControllerTest.java index 1c33d9a5..299410a3 100644 --- a/service/src/test/java/org/folio/rest/workflow/controller/EventControllerTest.java +++ b/service/src/test/java/org/folio/rest/workflow/controller/EventControllerTest.java @@ -24,21 +24,24 @@ import org.folio.spring.tenant.properties.TenantProperties; import org.folio.spring.tenant.resolver.TenantHeaderResolver; import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.extension.ExtendWith; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.Arguments; import org.junit.jupiter.params.provider.MethodSource; import org.mockito.Mock; +import org.mockito.junit.jupiter.MockitoExtension; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; +import org.springframework.boot.webmvc.test.autoconfigure.WebMvcTest; 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.request.MockHttpServletRequestBuilder; +import org.springframework.test.web.servlet.request.MockMultipartHttpServletRequestBuilder; import org.springframework.test.web.servlet.request.MockMvcRequestBuilders; import org.springframework.test.web.servlet.setup.MockMvcBuilders; @WebMvcTest(EventController.class) +@ExtendWith(MockitoExtension.class) class EventControllerTest { private MockMvc mockMvc; @@ -118,7 +121,7 @@ static Stream uploadRejected() { arguments("diku", "a", join(separator,"..", "..", "..", "..", "x.txt"))); } - MockHttpServletRequestBuilder upload(String tenant, String dir, String file) throws Exception { + MockMultipartHttpServletRequestBuilder upload(String tenant, String dir, String file) throws Exception { var sampleFile = new MockMultipartFile( "file", file, diff --git a/service/src/test/java/org/folio/rest/workflow/controller/WorkflowControllerTest.java b/service/src/test/java/org/folio/rest/workflow/controller/WorkflowControllerTest.java index faec8eb8..24fc251c 100644 --- a/service/src/test/java/org/folio/rest/workflow/controller/WorkflowControllerTest.java +++ b/service/src/test/java/org/folio/rest/workflow/controller/WorkflowControllerTest.java @@ -23,8 +23,11 @@ import static org.folio.spring.test.mock.MockMvcReflection.POST; import static org.folio.spring.test.mock.MockMvcReflection.PUT; import static org.folio.spring.test.mock.MockMvcRequest.appendBody; +import static org.folio.spring.test.mock.MockMvcRequest.appendBodyMultipart; import static org.folio.spring.test.mock.MockMvcRequest.appendHeaders; +import static org.folio.spring.test.mock.MockMvcRequest.appendHeadersMultipart; import static org.folio.spring.test.mock.MockMvcRequest.appendParameters; +import static org.folio.spring.test.mock.MockMvcRequest.appendParametersMultipart; import static org.folio.spring.test.mock.MockMvcRequest.buildArguments1; import static org.folio.spring.test.mock.MockMvcRequest.buildArguments2; import static org.folio.spring.test.mock.MockMvcRequest.invokeRequestBuilder; @@ -43,8 +46,6 @@ import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.log; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.databind.node.ObjectNode; import java.lang.reflect.Method; import java.util.List; import java.util.Map; @@ -65,7 +66,7 @@ import org.junit.jupiter.params.provider.MethodSource; import org.mockito.junit.jupiter.MockitoExtension; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; +import org.springframework.boot.webmvc.test.autoconfigure.WebMvcTest; import org.springframework.core.io.Resource; import org.springframework.http.HttpHeaders; import org.springframework.http.MediaType; @@ -74,9 +75,12 @@ import org.springframework.test.web.servlet.MockMvc; import org.springframework.test.web.servlet.MvcResult; import org.springframework.test.web.servlet.request.MockHttpServletRequestBuilder; +import org.springframework.test.web.servlet.request.MockMultipartHttpServletRequestBuilder; import org.springframework.test.web.servlet.setup.MockMvcBuilders; import org.springframework.util.CollectionUtils; import org.springframework.util.MultiValueMap; +import tools.jackson.databind.ObjectMapper; +import tools.jackson.databind.node.ObjectNode; @WebMvcTest(WorkflowController.class) @ExtendWith(MockitoExtension.class) @@ -391,10 +395,10 @@ void importWorkflowsTest(HttpHeaders headers, String contentType, String accept, lenient().when(workflowImportService.importFile(any(Resource.class))).thenReturn(workflow); - MockHttpServletRequestBuilder request = appendHeaders(multipart(PATH_IMPORT).file(exampleFwz), headers, contentType, accept); - request = appendParameters(request, parameters); + MockMultipartHttpServletRequestBuilder request = appendHeadersMultipart(multipart(PATH_IMPORT).file(exampleFwz), headers, contentType, accept); + request = appendParametersMultipart(request, parameters); - MvcResult result = mvc.perform(appendBody(request, body)) + MvcResult result = mvc.perform(appendBodyMultipart(request, body)) .andDo(log()).andExpect(status().is(status)).andReturn(); if (status == 200) { diff --git a/service/src/test/java/org/folio/rest/workflow/controller/advice/AbstractAdviceTest.java b/service/src/test/java/org/folio/rest/workflow/controller/advice/AbstractAdviceTest.java index 71c8443e..268c9803 100644 --- a/service/src/test/java/org/folio/rest/workflow/controller/advice/AbstractAdviceTest.java +++ b/service/src/test/java/org/folio/rest/workflow/controller/advice/AbstractAdviceTest.java @@ -4,30 +4,31 @@ import static org.mockito.ArgumentMatchers.any; import static org.mockito.Mockito.when; -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.databind.ObjectMapper; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; -import org.mockito.Mock; +import org.mockito.Mockito; import org.mockito.junit.jupiter.MockitoExtension; import org.springframework.http.HttpStatus; import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.ExceptionHandler; +import tools.jackson.core.JacksonException; +import tools.jackson.databind.ObjectMapper; +import tools.jackson.databind.json.JsonMapper; @ExtendWith(MockitoExtension.class) class AbstractAdviceTest { private static final RuntimeException runtimeException = new RuntimeException("A runtime failure."); - @Mock private ObjectMapper objectMapper; private MockAdvice abstractAdvice; @BeforeEach void beforeEach() { + objectMapper = Mockito.spy(JsonMapper.builder().build()); abstractAdvice = new MockAdvice(); } @@ -40,8 +41,8 @@ void handleBuildErrorWorksTest() { } @Test - void handleBuildErrorThrowsJsonProcessingExceptionTest() throws JsonProcessingException { - when(objectMapper.writeValueAsString(any())).thenThrow(new MockJsonProcessingException()); + void handleBuildErrorThrowsJsonProcessingExceptionTest() throws JacksonException { + when(objectMapper.writeValueAsString(any())).thenThrow(new MockJacksonException()); ResponseEntity response = abstractAdvice.handleException(runtimeException); @@ -69,15 +70,15 @@ public ResponseEntity handleException(RuntimeException ex) { } /** - * Provide a way to throw a type of JsonProcessingException. + * Provide a way to throw a type of JacksonException. * * The JsonProcessingException does not have a public initializer. */ - private class MockJsonProcessingException extends JsonProcessingException { + private class MockJacksonException extends JacksonException { private static final long serialVersionUID = 812355666324245L; - public MockJsonProcessingException() { + public MockJacksonException() { super("mock"); } diff --git a/service/src/test/java/org/folio/rest/workflow/controller/advice/EventControllerAdviceTest.java b/service/src/test/java/org/folio/rest/workflow/controller/advice/EventControllerAdviceTest.java index 398a8b2f..e63b4971 100644 --- a/service/src/test/java/org/folio/rest/workflow/controller/advice/EventControllerAdviceTest.java +++ b/service/src/test/java/org/folio/rest/workflow/controller/advice/EventControllerAdviceTest.java @@ -1,98 +1,82 @@ package org.folio.rest.workflow.controller.advice; -import static org.folio.spring.test.mock.MockMvcConstant.APP_JSON; -import static org.folio.spring.test.mock.MockMvcConstant.JSON_OBJECT; -import static org.folio.spring.test.mock.MockMvcConstant.OKAPI_HEAD; import static org.folio.spring.test.mock.MockMvcConstant.VALUE; -import static org.folio.spring.test.mock.MockMvcRequest.appendBody; -import static org.folio.spring.test.mock.MockMvcRequest.appendHeaders; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; import static org.junit.jupiter.api.Assertions.assertTrue; -import static org.mockito.ArgumentMatchers.any; -import static org.mockito.BDDMockito.given; -import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; -import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.log; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; import java.nio.file.FileSystemException; import java.util.regex.Matcher; import java.util.regex.Pattern; -import java.util.stream.Stream; -import org.folio.rest.workflow.controller.EventController; import org.folio.rest.workflow.exception.EventPublishException; import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; -import org.junit.jupiter.params.ParameterizedTest; -import org.junit.jupiter.params.provider.Arguments; -import org.junit.jupiter.params.provider.MethodSource; -import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; -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.boot.test.context.SpringBootTest.WebEnvironment; +import org.springframework.http.HttpStatus; +import org.springframework.http.MediaType; +import org.springframework.http.ResponseEntity; import org.springframework.test.context.ActiveProfiles; -import org.springframework.test.web.servlet.MockMvc; -import org.springframework.test.web.servlet.MvcResult; -import org.springframework.test.web.servlet.request.MockHttpServletRequestBuilder; -import org.springframework.test.web.servlet.setup.MockMvcBuilders; -@SpringBootTest(webEnvironment = WebEnvironment.MOCK) -@AutoConfigureMockMvc @ExtendWith(MockitoExtension.class) @ActiveProfiles("test") class EventControllerAdviceTest { - private static final String PATH = "/events"; + private static final Exception RUNTIME_EXC = new RuntimeException("Runtime failure."); - private static final String PATH_HANDLE = PATH + "/handle"; + private static final EventPublishException EP_EXC = new EventPublishException(VALUE, RUNTIME_EXC); - @Autowired - private EventControllerAdvice eventControllerAdvice; + private static final FileSystemException FS_EXC = new FileSystemException(VALUE); - @Autowired - @Mock - private EventController eventController; - - private MockMvc mvc; + private EventControllerAdvice advice; @BeforeEach void beforeEach() { - mvc = MockMvcBuilders.standaloneSetup(eventController) - .setControllerAdvice(eventControllerAdvice) - .build(); + advice = new EventControllerAdvice(); + } + + @Test + void handleEventPublishExceptionTest() { + + final String simpleName = EventPublishException.class.getSimpleName(); + final ResponseEntity response = advice.handleEventPublishException(EP_EXC); + + assertNotNull(response); + assertNotNull(response.getBody()); + + assertEquals(HttpStatus.INTERNAL_SERVER_ERROR, response.getStatusCode()); + assertEquals(MediaType.APPLICATION_JSON, response.getHeaders().getContentType()); + assertTrue(matchBody(response, simpleName)); } - @ParameterizedTest - @MethodSource("provideExceptionsToMatchForActivateWorkflow") - void exceptionsThrownForActivateWorkflowTest(Exception exception, String simpleName, int status) throws Exception { - given(eventController.postHandleEvents(any(), any())).willAnswer(invocation -> { throw exception; }); + @Test + void handleFileSystemExceptionTest() { - MockHttpServletRequestBuilder request = appendHeaders(post(PATH_HANDLE), OKAPI_HEAD, APP_JSON, APP_JSON); + final String simpleName = FileSystemException.class.getSimpleName(); + final ResponseEntity response = advice.handleFileSystemException(FS_EXC); - MvcResult result = mvc.perform(appendBody(request, JSON_OBJECT)) - .andDo(log()).andExpect(status().is(status)).andReturn(); + assertNotNull(response); + assertNotNull(response.getBody()); - Pattern pattern = Pattern.compile("\"type\":\"" + simpleName + "\""); - Matcher matcher = pattern.matcher(result.getResponse().getContentAsString()); - assertTrue(matcher.find()); + assertEquals(HttpStatus.BAD_REQUEST, response.getStatusCode()); + assertEquals(MediaType.APPLICATION_JSON, response.getHeaders().getContentType()); + assertTrue(matchBody(response, simpleName)); } /** - * Helper function for parameterized test providing the exceptions to be matched for activate workflow. + * Match the class simple name in the response. * - * @return - * The arguments array stream with the stream columns as: - * - Exception exception. - * - String simpleName (exception name to match). - * - int status (response HTTP status code for the exception). + * @param response The response to search. + * @param simpleName The class name to match. + * + * @return TRUE on match; FALSE otherwise. */ - private static Stream provideExceptionsToMatchForActivateWorkflow() { - Exception runtime = new RuntimeException("Runtime failure."); + private boolean matchBody(ResponseEntity response, String simpleName) { + + final Pattern pattern = Pattern.compile("\"type\":\"" + simpleName + "\""); + final Matcher matcher = pattern.matcher(response.getBody()); - return Stream.of( - Arguments.of(new EventPublishException(VALUE, runtime), EventPublishException.class.getSimpleName(), 500), - Arguments.of(new FileSystemException(VALUE), FileSystemException.class.getSimpleName(), 400) - ); + return matcher.find(); } } diff --git a/service/src/test/java/org/folio/rest/workflow/controller/advice/WorkflowControllerAdviceTest.java b/service/src/test/java/org/folio/rest/workflow/controller/advice/WorkflowControllerAdviceTest.java index bf761485..d620b9a0 100644 --- a/service/src/test/java/org/folio/rest/workflow/controller/advice/WorkflowControllerAdviceTest.java +++ b/service/src/test/java/org/folio/rest/workflow/controller/advice/WorkflowControllerAdviceTest.java @@ -1,24 +1,14 @@ package org.folio.rest.workflow.controller.advice; -import static org.folio.spring.test.mock.MockMvcConstant.APP_JSON; -import static org.folio.spring.test.mock.MockMvcConstant.JSON_OBJECT; -import static org.folio.spring.test.mock.MockMvcConstant.OKAPI_HEAD; -import static org.folio.spring.test.mock.MockMvcConstant.UUID; import static org.folio.spring.test.mock.MockMvcConstant.VALUE; -import static org.folio.spring.test.mock.MockMvcRequest.appendBody; -import static org.folio.spring.test.mock.MockMvcRequest.appendHeaders; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; import static org.junit.jupiter.api.Assertions.assertTrue; -import static org.mockito.ArgumentMatchers.any; -import static org.mockito.BDDMockito.given; -import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.put; -import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.log; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; import jakarta.persistence.EntityNotFoundException; import java.util.regex.Matcher; import java.util.regex.Pattern; import java.util.stream.Stream; -import org.folio.rest.workflow.controller.WorkflowController; import org.folio.rest.workflow.exception.WorkflowAlreadyActiveException; import org.folio.rest.workflow.exception.WorkflowDeploymentException; import org.folio.rest.workflow.exception.WorkflowEngineServiceException; @@ -29,85 +19,166 @@ import org.folio.rest.workflow.exception.WorkflowImportRequiredFileMissing; import org.folio.rest.workflow.exception.WorkflowNotFoundException; import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.Arguments; import org.junit.jupiter.params.provider.MethodSource; -import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; -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.boot.test.context.SpringBootTest.WebEnvironment; +import org.springframework.http.HttpStatus; +import org.springframework.http.MediaType; +import org.springframework.http.ResponseEntity; import org.springframework.test.context.ActiveProfiles; -import org.springframework.test.web.servlet.MockMvc; -import org.springframework.test.web.servlet.MvcResult; -import org.springframework.test.web.servlet.request.MockHttpServletRequestBuilder; -import org.springframework.test.web.servlet.setup.MockMvcBuilders; -@SpringBootTest(webEnvironment = WebEnvironment.MOCK) -@AutoConfigureMockMvc @ExtendWith(MockitoExtension.class) @ActiveProfiles("test") class WorkflowControllerAdviceTest { - private static final String PATH = "/workflows"; + private static final EntityNotFoundException ENF_EXC = new EntityNotFoundException(VALUE); - private static final String PATH_ACTIVATE = PATH + "/{id}/activate"; + private static final WorkflowNotFoundException WNF_EXC = new WorkflowNotFoundException(VALUE); - @Autowired - private WorkflowControllerAdvice workflowControllerAdvice; + private static final WorkflowAlreadyActiveException WAA_EXC = new WorkflowAlreadyActiveException(VALUE); - @Autowired - @Mock - private WorkflowController workflowController; + private static final WorkflowDeploymentException WD_EXC = new WorkflowDeploymentException(); - private MockMvc mvc; + private static final WorkflowEngineServiceException WES_EXC = new WorkflowEngineServiceException(VALUE); + + private static final WorkflowImportException WI_EXC = new WorkflowImportException(VALUE); + + private static final WorkflowImportAlreadyImported WIAI_EXC = new WorkflowImportAlreadyImported(VALUE); + + private static final WorkflowImportInvalidOrMissingProperty WIIOMP_EXC = new WorkflowImportInvalidOrMissingProperty(VALUE, VALUE); + + private static final WorkflowImportJsonFileIsDirectory WIJFID_EXC = new WorkflowImportJsonFileIsDirectory(VALUE); + + private static final WorkflowImportRequiredFileMissing WIRFM_EXC = new WorkflowImportRequiredFileMissing(VALUE); + + private WorkflowControllerAdvice advice; @BeforeEach void beforeEach() { - mvc = MockMvcBuilders.standaloneSetup(workflowController) - .setControllerAdvice(workflowControllerAdvice) - .build(); + advice = new WorkflowControllerAdvice(); + } + + @Test + void handleEntityNotFoundExceptionTest() { + + final String simpleName = EntityNotFoundException.class.getSimpleName(); + final ResponseEntity response = advice.handleEntityNotFoundException(ENF_EXC); + + assertNotNull(response); + assertNotNull(response.getBody()); + + assertEquals(HttpStatus.NOT_FOUND, response.getStatusCode()); + assertEquals(MediaType.APPLICATION_JSON, response.getHeaders().getContentType()); + + assertTrue(matchBody(response, simpleName)); + } + + @Test + void handleWorkflowNotFoundExceptionTest() { + + final String simpleName = WorkflowNotFoundException.class.getSimpleName(); + final ResponseEntity response = advice.handleWorkflowNotFoundException(WNF_EXC); + + assertNotNull(response); + assertNotNull(response.getBody()); + + assertEquals(HttpStatus.NOT_FOUND, response.getStatusCode()); + assertEquals(MediaType.APPLICATION_JSON, response.getHeaders().getContentType()); + assertTrue(matchBody(response, simpleName)); + } + + @Test + void handleWorkflowAlreadyActiveExceptionTest() { + + final String simpleName = WorkflowAlreadyActiveException.class.getSimpleName(); + final ResponseEntity response = advice.handleWorkflowAlreadyActiveException(WAA_EXC); + + assertNotNull(response); + assertNotNull(response.getBody()); + + assertEquals(HttpStatus.FORBIDDEN, response.getStatusCode()); + assertEquals(MediaType.APPLICATION_JSON, response.getHeaders().getContentType()); + assertTrue(matchBody(response, simpleName)); + } + + @Test + void handleWorkflowDeploymentExceptionTest() { + + final String simpleName = WorkflowDeploymentException.class.getSimpleName(); + final ResponseEntity response = advice.handleWorkflowDeploymentException(WD_EXC); + + assertNotNull(response); + assertNotNull(response.getBody()); + + assertEquals(HttpStatus.INTERNAL_SERVER_ERROR, response.getStatusCode()); + assertEquals(MediaType.APPLICATION_JSON, response.getHeaders().getContentType()); + assertTrue(matchBody(response, simpleName)); + } + + @Test + void handleWorkflowEngineServiceExceptionTest() { + + final String simpleName = WorkflowEngineServiceException.class.getSimpleName(); + final ResponseEntity response = advice.handleWorkflowEngineServiceException(WES_EXC); + + assertNotNull(response); + assertNotNull(response.getBody()); + + assertEquals(HttpStatus.INTERNAL_SERVER_ERROR, response.getStatusCode()); + assertEquals(MediaType.APPLICATION_JSON, response.getHeaders().getContentType()); + assertTrue(matchBody(response, simpleName)); } @ParameterizedTest - @MethodSource("provideExceptionsToMatchForActivateWorkflow") - void exceptionsThrownForActivateWorkflowTest(Exception exception, String simpleName, int status) throws Exception { - given(workflowController.activateWorkflow(any(), any(), any())).willAnswer(invocation -> { throw exception; }); + @MethodSource("provideWorkflowImportExceptions") + void handleWorkflowImportExceptionTest(WorkflowImportException exception, String simpleName) { - MockHttpServletRequestBuilder request = appendHeaders(put(PATH_ACTIVATE, UUID), OKAPI_HEAD, APP_JSON, APP_JSON); + final ResponseEntity response = advice.handleWorkflowImportException(exception); - MvcResult result = mvc.perform(appendBody(request, JSON_OBJECT)) - .andDo(log()).andExpect(status().is(status)).andReturn(); + assertNotNull(response); + assertNotNull(response.getBody()); - Pattern pattern = Pattern.compile("\"type\":\"" + simpleName + "\""); - Matcher matcher = pattern.matcher(result.getResponse().getContentAsString()); - assertTrue(matcher.find()); + assertEquals(HttpStatus.BAD_REQUEST, response.getStatusCode()); + assertEquals(MediaType.APPLICATION_JSON, response.getHeaders().getContentType()); + assertTrue(matchBody(response, simpleName)); } /** - * Helper function for parameterized test providing the exceptions to be matched for activate workflow. + * Match the class simple name in the response. + * + * @param response The response to search. + * @param simpleName The class name to match. + * + * @return TRUE on match; FALSE otherwise. + */ + private boolean matchBody(ResponseEntity response, String simpleName) { + + final Pattern pattern = Pattern.compile("\"type\":\"" + simpleName + "\""); + final Matcher matcher = pattern.matcher(response.getBody()); + + return matcher.find(); + } + + /** + * Helper function for parameterized test providing different types of WorkflowImportException. * * @return * The arguments array stream with the stream columns as: * - Exception exception. * - String simpleName (exception name to match). - * - int status (response HTTP status code for the exception). */ - private static Stream provideExceptionsToMatchForActivateWorkflow() { + private static Stream provideWorkflowImportExceptions() { + return Stream.of( - Arguments.of(new WorkflowNotFoundException(VALUE), WorkflowNotFoundException.class.getSimpleName(), 404), - Arguments.of(new EntityNotFoundException(), EntityNotFoundException.class.getSimpleName(), 404), - Arguments.of(new WorkflowAlreadyActiveException(VALUE), WorkflowAlreadyActiveException.class.getSimpleName(), 403), - Arguments.of(new WorkflowDeploymentException(), WorkflowDeploymentException.class.getSimpleName(), 500), - Arguments.of(new WorkflowEngineServiceException(VALUE), WorkflowEngineServiceException.class.getSimpleName(), 500), - Arguments.of(new WorkflowImportException(VALUE), WorkflowImportException.class.getSimpleName(), 400), - Arguments.of(new WorkflowImportAlreadyImported(VALUE), WorkflowImportAlreadyImported.class.getSimpleName(), 400), - Arguments.of(new WorkflowImportInvalidOrMissingProperty(VALUE, VALUE), WorkflowImportInvalidOrMissingProperty.class.getSimpleName(), 400), - Arguments.of(new WorkflowImportJsonFileIsDirectory(VALUE), WorkflowImportJsonFileIsDirectory.class.getSimpleName(), 400), - Arguments.of(new WorkflowImportRequiredFileMissing(VALUE), WorkflowImportRequiredFileMissing.class.getSimpleName(), 400) + Arguments.of(WIAI_EXC, WorkflowImportAlreadyImported.class.getSimpleName()), + Arguments.of(WIIOMP_EXC, WorkflowImportInvalidOrMissingProperty.class.getSimpleName()), + Arguments.of(WIJFID_EXC, WorkflowImportJsonFileIsDirectory.class.getSimpleName()), + Arguments.of(WIRFM_EXC, WorkflowImportRequiredFileMissing.class.getSimpleName()) ); } + } diff --git a/service/src/test/java/org/folio/rest/workflow/model/ExtractedWorkflowTest.java b/service/src/test/java/org/folio/rest/workflow/model/ExtractedWorkflowTest.java index e59255e9..08a1a0bb 100644 --- a/service/src/test/java/org/folio/rest/workflow/model/ExtractedWorkflowTest.java +++ b/service/src/test/java/org/folio/rest/workflow/model/ExtractedWorkflowTest.java @@ -4,7 +4,6 @@ import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertIterableEquals; -import com.fasterxml.jackson.databind.JsonNode; import java.util.ArrayList; import java.util.HashMap; import java.util.List; @@ -14,6 +13,7 @@ import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.Arguments; import org.junit.jupiter.params.provider.MethodSource; +import tools.jackson.databind.JsonNode; class ExtractedWorkflowTest { diff --git a/service/src/test/java/org/folio/rest/workflow/service/OkapiDiscoveryServiceWithCustomPropertiesTest.java b/service/src/test/java/org/folio/rest/workflow/service/OkapiDiscoveryServiceWithCustomPropertiesTest.java index 3a329b7f..2b063e16 100644 --- a/service/src/test/java/org/folio/rest/workflow/service/OkapiDiscoveryServiceWithCustomPropertiesTest.java +++ b/service/src/test/java/org/folio/rest/workflow/service/OkapiDiscoveryServiceWithCustomPropertiesTest.java @@ -3,19 +3,16 @@ import static org.folio.spring.test.mock.MockMvcConstant.VALUE; import static org.junit.jupiter.api.Assertions.assertEquals; -import com.fasterxml.jackson.databind.JsonNode; import org.junit.jupiter.api.Test; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.boot.test.context.SpringBootTest.WebEnvironment; import org.springframework.test.context.TestPropertySource; import org.springframework.test.util.ReflectionTestUtils; +import tools.jackson.databind.JsonNode; /** * This runs the OkapiDiscoveryService tests when special application.yml settings need to be tested. * * This is expected to be empty as the OkapiDiscoveryServiceWithDefaultConfigTest() contains all of the tests. */ -@SpringBootTest(webEnvironment = WebEnvironment.MOCK) @TestPropertySource(properties = { "logging.level.org.folio.rest.workflow.service.OkapiDiscoveryService = DEBUG", "tenant.headerName = X-Okapi-Tenant", diff --git a/service/src/test/java/org/folio/rest/workflow/service/OkapiDiscoveryServiceWithDefaultPropertiesTest.java b/service/src/test/java/org/folio/rest/workflow/service/OkapiDiscoveryServiceWithDefaultPropertiesTest.java index fbead70a..c297eab5 100644 --- a/service/src/test/java/org/folio/rest/workflow/service/OkapiDiscoveryServiceWithDefaultPropertiesTest.java +++ b/service/src/test/java/org/folio/rest/workflow/service/OkapiDiscoveryServiceWithDefaultPropertiesTest.java @@ -6,7 +6,6 @@ import static org.mockito.ArgumentMatchers.anyString; import static org.mockito.Mockito.when; -import com.fasterxml.jackson.databind.JsonNode; import java.io.IOException; import java.util.Iterator; import java.util.List; @@ -21,15 +20,23 @@ import org.springframework.http.HttpMethod; import org.springframework.http.HttpStatusCode; import org.springframework.http.ResponseEntity; +import org.springframework.test.context.ActiveProfiles; import org.springframework.test.context.bean.override.mockito.MockitoBean; -import org.springframework.test.context.junit.jupiter.SpringExtension; +import org.springframework.test.context.junit.jupiter.web.SpringJUnitWebConfig; +import tools.jackson.databind.JsonNode; +import tools.jackson.databind.ObjectMapper; /** * This runs the OkapiDiscoveryService tests for when there is no properly configuration application.yml. * * Do no add additional settings loading or alterations to this test (such as @TestPropertySource). */ -@ExtendWith(SpringExtension.class) +@ActiveProfiles("test") +@SpringJUnitWebConfig({ + ObjectMapper.class, + OkapiDiscoveryService.class, + HttpService.class +}) @ExtendWith(MockitoExtension.class) class OkapiDiscoveryServiceWithDefaultPropertiesTest { diff --git a/service/src/test/java/org/folio/rest/workflow/service/WorkflowCqlServiceTest.java b/service/src/test/java/org/folio/rest/workflow/service/WorkflowCqlServiceTest.java index 6a54dbba..5bc605dd 100644 --- a/service/src/test/java/org/folio/rest/workflow/service/WorkflowCqlServiceTest.java +++ b/service/src/test/java/org/folio/rest/workflow/service/WorkflowCqlServiceTest.java @@ -6,8 +6,6 @@ import static org.mockito.ArgumentMatchers.anyString; import static org.mockito.Mockito.when; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.databind.node.ObjectNode; import java.io.IOException; import java.util.ArrayList; import java.util.stream.Stream; @@ -28,6 +26,9 @@ import org.springframework.test.context.bean.override.mockito.MockitoBean; import org.springframework.test.context.bean.override.mockito.MockitoSpyBean; import org.springframework.test.context.junit.jupiter.SpringExtension; +import tools.jackson.databind.ObjectMapper; +import tools.jackson.databind.json.JsonMapper; +import tools.jackson.databind.node.ObjectNode; @ExtendWith(SpringExtension.class) @ExtendWith(MockitoExtension.class) @@ -56,7 +57,7 @@ static class Config { @Bean ObjectMapper objectMapper() { - return new ObjectMapper(); + return JsonMapper.builder().build(); } } diff --git a/service/src/test/java/org/folio/rest/workflow/service/WorkflowEngineServiceTest.java b/service/src/test/java/org/folio/rest/workflow/service/WorkflowEngineServiceTest.java index 8623013d..3a2d25dc 100644 --- a/service/src/test/java/org/folio/rest/workflow/service/WorkflowEngineServiceTest.java +++ b/service/src/test/java/org/folio/rest/workflow/service/WorkflowEngineServiceTest.java @@ -16,10 +16,6 @@ import static org.mockito.Mockito.when; import static org.springframework.test.util.ReflectionTestUtils.setField; -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.databind.node.ArrayNode; -import com.fasterxml.jackson.databind.node.ObjectNode; import java.util.concurrent.atomic.AtomicInteger; import org.folio.rest.workflow.dto.WorkflowDto; import org.folio.rest.workflow.dto.WorkflowOperationalDto; @@ -33,13 +29,18 @@ import org.mockito.ArgumentMatchers; import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; -import org.springframework.boot.web.client.RestTemplateBuilder; +import org.springframework.boot.restclient.RestTemplateBuilder; import org.springframework.http.HttpEntity; import org.springframework.http.HttpMethod; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.test.context.junit.jupiter.SpringExtension; import org.springframework.web.client.RestTemplate; +import tools.jackson.databind.JsonNode; +import tools.jackson.databind.ObjectMapper; +import tools.jackson.databind.json.JsonMapper; +import tools.jackson.databind.node.ArrayNode; +import tools.jackson.databind.node.ObjectNode; @ExtendWith(SpringExtension.class) @ExtendWith(MockitoExtension.class) @@ -62,7 +63,7 @@ class WorkflowEngineServiceTest { @BeforeEach void beforeEach() { workflowEngineService = new WorkflowEngineService(new RestTemplateBuilder()); - mapper = new ObjectMapper(); + mapper = JsonMapper.builder().build(); workflow = new WorkflowAsDto(); workflow.setId(UUID); diff --git a/service/src/test/java/org/folio/rest/workflow/service/WorkflowImportServiceTest.java b/service/src/test/java/org/folio/rest/workflow/service/WorkflowImportServiceTest.java index 1ca91f23..b51d5664 100644 --- a/service/src/test/java/org/folio/rest/workflow/service/WorkflowImportServiceTest.java +++ b/service/src/test/java/org/folio/rest/workflow/service/WorkflowImportServiceTest.java @@ -7,10 +7,10 @@ import static org.mockito.ArgumentMatchers.anyString; import static org.mockito.Mockito.when; -import com.fasterxml.jackson.databind.ObjectMapper; import java.io.IOException; import org.apache.commons.compress.archivers.ArchiveException; import org.apache.commons.compress.compressors.CompressorException; +import org.folio.rest.workflow.config.JunitHelperWebMvcConfig; import org.folio.rest.workflow.exception.WorkflowImportAlreadyImported; import org.folio.rest.workflow.exception.WorkflowImportException; import org.folio.rest.workflow.exception.WorkflowImportInvalidOrMissingProperty; @@ -26,17 +26,22 @@ import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; import org.springframework.beans.factory.annotation.Value; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.boot.test.context.SpringBootTest.WebEnvironment; import org.springframework.core.io.Resource; import org.springframework.data.domain.Page; import org.springframework.test.context.ActiveProfiles; import org.springframework.test.context.bean.override.mockito.MockitoBean; import org.springframework.test.context.bean.override.mockito.MockitoSpyBean; +import org.springframework.test.context.junit.jupiter.SpringExtension; +import org.springframework.test.context.junit.jupiter.web.SpringJUnitWebConfig; +import tools.jackson.databind.ObjectMapper; -@SpringBootTest(webEnvironment = WebEnvironment.MOCK) -@ExtendWith(MockitoExtension.class) @ActiveProfiles("test") +@SpringJUnitWebConfig({ + JunitHelperWebMvcConfig.class, + WorkflowImportService.class +}) +@ExtendWith(MockitoExtension.class) +@ExtendWith(SpringExtension.class) class WorkflowImportServiceTest { private static final String WORKFLOW_UUID = "7dcd302f-a438-4ca5-a7eb-21653610d46f"; diff --git a/service/src/test/resources/application.yaml b/service/src/test/resources/application.yaml index e664d61f..1e281087 100644 --- a/service/src/test/resources/application.yaml +++ b/service/src/test/resources/application.yaml @@ -19,9 +19,6 @@ server: port: 9101 servlet: context-path: / - encoding: - charset: UTF-8 - enabled: true spring: application.name: mod-workflow @@ -43,6 +40,11 @@ spring: banner-mode: console log-startup-info: true + servlet: + encoding: + charset: UTF-8 + enabled: true + sql: init: platform: h2