From c210a9629c61b89af3d1b81a72fef89874d02956 Mon Sep 17 00:00:00 2001 From: saba_zedginidze Date: Tue, 28 Oct 2025 15:25:02 +0400 Subject: [PATCH 01/21] [MODEXPS-296] Replace converters with simpler mappers --- ...ultExportConfigToModelConfigConverter.java | 43 ---------- ...ultModelConfigToExportConfigConverter.java | 37 --------- .../ExportConfigConverterResolver.java | 22 ----- ...imsExportConfigToModelConfigConverter.java | 45 ----------- .../des/mapper/BaseExportConfigMapper.java | 81 +++++++++++++++++++ .../mapper/ExportConfigMapperResolver.java | 19 +++++ .../aqcuisition/ClaimsExportConfigMapper.java | 33 ++++++++ .../EdifactExportConfigMapper.java} | 55 ++++++------- 8 files changed, 156 insertions(+), 179 deletions(-) delete mode 100644 src/main/java/org/folio/des/converter/DefaultExportConfigToModelConfigConverter.java delete mode 100644 src/main/java/org/folio/des/converter/DefaultModelConfigToExportConfigConverter.java delete mode 100644 src/main/java/org/folio/des/converter/ExportConfigConverterResolver.java delete mode 100644 src/main/java/org/folio/des/converter/aqcuisition/ClaimsExportConfigToModelConfigConverter.java create mode 100644 src/main/java/org/folio/des/mapper/BaseExportConfigMapper.java create mode 100644 src/main/java/org/folio/des/mapper/ExportConfigMapperResolver.java create mode 100644 src/main/java/org/folio/des/mapper/aqcuisition/ClaimsExportConfigMapper.java rename src/main/java/org/folio/des/{converter/aqcuisition/EdifactExportConfigToModelConfigConverter.java => mapper/aqcuisition/EdifactExportConfigMapper.java} (58%) diff --git a/src/main/java/org/folio/des/converter/DefaultExportConfigToModelConfigConverter.java b/src/main/java/org/folio/des/converter/DefaultExportConfigToModelConfigConverter.java deleted file mode 100644 index 381e6302..00000000 --- a/src/main/java/org/folio/des/converter/DefaultExportConfigToModelConfigConverter.java +++ /dev/null @@ -1,43 +0,0 @@ -package org.folio.des.converter; - -import static org.folio.des.service.config.ExportConfigConstants.DEFAULT_CONFIG_NAME; -import static org.folio.des.service.config.ExportConfigConstants.DEFAULT_MODULE_NAME; - -import org.folio.des.domain.dto.ExportConfig; -import org.folio.des.domain.dto.ExportType; -import org.folio.des.domain.dto.ModelConfiguration; -import org.springframework.core.convert.converter.Converter; -import org.springframework.stereotype.Service; - -import com.fasterxml.jackson.databind.ObjectMapper; - -import lombok.AllArgsConstructor; -import lombok.SneakyThrows; -import lombok.extern.log4j.Log4j2; - -@AllArgsConstructor -@Log4j2 -@Service -public final class DefaultExportConfigToModelConfigConverter implements Converter { - private static final String CONFIG_DESCRIPTION = "Data export configuration parameters"; - - private final ObjectMapper objectMapper; - - @SneakyThrows - @Override - public ModelConfiguration convert(ExportConfig source) { - var config = new ModelConfiguration(); - config.setId(source.getId()); - config.setModule(DEFAULT_MODULE_NAME); - if (source.getType() == null || ExportType.BURSAR_FEES_FINES.equals(source.getType())) { - config.setConfigName(DEFAULT_CONFIG_NAME); - } else { - config.setConfigName(source.getType().getValue()); - } - config.setDescription(CONFIG_DESCRIPTION); - config.setEnabled(true); - config.setDefault(true); - config.setValue(objectMapper.writeValueAsString(source)); - return config; - } -} diff --git a/src/main/java/org/folio/des/converter/DefaultModelConfigToExportConfigConverter.java b/src/main/java/org/folio/des/converter/DefaultModelConfigToExportConfigConverter.java deleted file mode 100644 index 55c25f61..00000000 --- a/src/main/java/org/folio/des/converter/DefaultModelConfigToExportConfigConverter.java +++ /dev/null @@ -1,37 +0,0 @@ -package org.folio.des.converter; - -import org.folio.des.domain.dto.ExportConfig; -import org.folio.des.domain.dto.ExportConfigWithLegacyBursar; -import org.folio.des.domain.dto.ModelConfiguration; -import org.springframework.core.convert.converter.Converter; -import org.springframework.stereotype.Service; - -import com.fasterxml.jackson.databind.ObjectMapper; - -import lombok.AllArgsConstructor; -import lombok.SneakyThrows; -import lombok.extern.log4j.Log4j2; - -@AllArgsConstructor -@Log4j2 -@Service -public final class DefaultModelConfigToExportConfigConverter implements Converter { - private final ObjectMapper objectMapper; - - @SneakyThrows - @Override - public ExportConfig convert(ModelConfiguration source) { - final String value = source.getValue(); - var config = objectMapper.readValue(value, ExportConfig.class); - config.setId(source.getId()); - return config; - } - - @SneakyThrows - public ExportConfigWithLegacyBursar convertLegacy(ModelConfiguration source) { - final String value = source.getValue(); - ExportConfigWithLegacyBursar config = objectMapper.readValue(value, ExportConfigWithLegacyBursar.class); - config.setId(source.getId()); - return config; - } -} diff --git a/src/main/java/org/folio/des/converter/ExportConfigConverterResolver.java b/src/main/java/org/folio/des/converter/ExportConfigConverterResolver.java deleted file mode 100644 index 1fcc3026..00000000 --- a/src/main/java/org/folio/des/converter/ExportConfigConverterResolver.java +++ /dev/null @@ -1,22 +0,0 @@ -package org.folio.des.converter; - -import java.util.Map; - -import org.folio.des.domain.dto.ExportConfig; -import org.folio.des.domain.dto.ExportType; -import org.folio.des.domain.dto.ModelConfiguration; -import org.springframework.core.convert.converter.Converter; - -import lombok.AllArgsConstructor; -import lombok.extern.log4j.Log4j2; - -@AllArgsConstructor -@Log4j2 -public class ExportConfigConverterResolver { - private final Map> converters; - private final Converter defaultConverter; - - public Converter resolve(ExportType exportType) { - return converters.getOrDefault(exportType, defaultConverter); - } -} diff --git a/src/main/java/org/folio/des/converter/aqcuisition/ClaimsExportConfigToModelConfigConverter.java b/src/main/java/org/folio/des/converter/aqcuisition/ClaimsExportConfigToModelConfigConverter.java deleted file mode 100644 index a604224f..00000000 --- a/src/main/java/org/folio/des/converter/aqcuisition/ClaimsExportConfigToModelConfigConverter.java +++ /dev/null @@ -1,45 +0,0 @@ -package org.folio.des.converter.aqcuisition; - -import com.fasterxml.jackson.databind.ObjectMapper; -import lombok.AllArgsConstructor; -import lombok.SneakyThrows; -import lombok.extern.log4j.Log4j2; -import org.folio.des.domain.dto.ExportConfig; -import org.folio.des.domain.dto.ModelConfiguration; -import org.folio.des.validator.acquisition.ClaimsExportParametersValidator; -import org.springframework.core.convert.converter.Converter; -import org.springframework.stereotype.Service; -import org.springframework.validation.BeanPropertyBindingResult; - -import static org.folio.des.service.config.ExportConfigConstants.DEFAULT_MODULE_NAME; - -@Log4j2 -@Service -@AllArgsConstructor -public final class ClaimsExportConfigToModelConfigConverter implements Converter { - - private static final String CONFIG_DESCRIPTION = "Claims export configuration parameters"; - - private final ObjectMapper objectMapper; - private ClaimsExportParametersValidator validator; - - @Override - @SneakyThrows - public ModelConfiguration convert(ExportConfig exportConfig) { - var errors = new BeanPropertyBindingResult(exportConfig.getExportTypeSpecificParameters(), "specificParameters"); - validator.validate(exportConfig.getExportTypeSpecificParameters(), errors); - - var config = new ModelConfiguration(); - config.setId(exportConfig.getId()); - config.setModule(DEFAULT_MODULE_NAME); - - var ediOrdersExportConfig = exportConfig.getExportTypeSpecificParameters().getVendorEdiOrdersExportConfig(); - config.setConfigName(exportConfig.getType().getValue() + "_" + ediOrdersExportConfig.getVendorId().toString() + "_" + exportConfig.getId()); - config.setDescription(CONFIG_DESCRIPTION); - config.setEnabled(true); - config.setDefault(true); - config.setValue(objectMapper.writeValueAsString(exportConfig)); - - return config; - } -} diff --git a/src/main/java/org/folio/des/mapper/BaseExportConfigMapper.java b/src/main/java/org/folio/des/mapper/BaseExportConfigMapper.java new file mode 100644 index 00000000..54af42e5 --- /dev/null +++ b/src/main/java/org/folio/des/mapper/BaseExportConfigMapper.java @@ -0,0 +1,81 @@ +package org.folio.des.mapper; + +import static org.folio.des.service.config.ExportConfigConstants.DEFAULT_CONFIG_NAME; + +import java.util.Optional; + +import org.folio.de.entity.ExportConfigEntity; +import org.folio.des.domain.dto.ExportConfig; +import org.folio.des.domain.dto.ExportConfigWithLegacyBursar; +import org.folio.des.domain.dto.ExportType; +import org.folio.des.domain.dto.ExportTypeSpecificParameters; +import org.folio.des.domain.dto.ExportTypeSpecificParametersWithLegacyBursar; +import org.folio.des.domain.dto.Metadata; +import org.folio.des.domain.dto.ModelConfiguration; +import org.folio.des.service.config.ExportConfigConstants; +import org.mapstruct.Mapper; +import org.mapstruct.Mapping; +import org.mapstruct.MappingTarget; +import org.springframework.beans.factory.annotation.Autowired; + +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; + +import lombok.SneakyThrows; + +@Mapper(imports = {ExportConfigConstants.class, ExportTypeSpecificParameters.class, ExportTypeSpecificParametersWithLegacyBursar.class}, implementationName = "DefaultExportConfigMapper") +public abstract class BaseExportConfigMapper { + + private static final String CONFIG_DESCRIPTION = "Data export configuration parameters"; + + @Autowired + protected ObjectMapper objectMapper; + + @Mapping(target = "createdDate", ignore = true) + @Mapping(target = "createdBy", ignore = true) + @Mapping(target = "updatedDate", ignore = true) + @Mapping(target = "updatedBy", ignore = true) + public abstract ExportConfigEntity toEntity(ExportConfig dto); + + @Mapping(target = "exportTypeSpecificParameters", expression = "java(objectMapper.convertValue(entity.getExportTypeSpecificParameters(), ExportTypeSpecificParameters.class))") + public abstract ExportConfig toDto(ExportConfigEntity entity); + + @Mapping(target = "exportTypeSpecificParameters", expression = "java(objectMapper.convertValue(entity.getExportTypeSpecificParameters(), ExportTypeSpecificParametersWithLegacyBursar.class))") + public abstract ExportConfigWithLegacyBursar toDtoLegacy(ExportConfigEntity entity); + + @Mapping(target = "module", expression = "java(ExportConfigConstants.DEFAULT_MODULE_NAME)") + @Mapping(target = "configName", expression = "java(getConfigName(dto))") + @Mapping(target = "description", expression = "java(getConfigDescription())") + @Mapping(target = "enabled", constant = "true") + @Mapping(target = "default", constant = "true") + @Mapping(target = "value", expression = "java(objectMapper.writeValueAsString(dto))") + @Mapping(target = "code", ignore = true) + @Mapping(target = "userId", ignore = true) + @Mapping(target = "_default", ignore = true) + @Mapping(target = "metadata", ignore = true) + public abstract ModelConfiguration toModelConfiguration(ExportConfig dto) throws JsonProcessingException; + + @SneakyThrows + public ModelConfiguration toModelConfiguration(ExportConfigEntity entity) { + var config = toModelConfiguration(toDto(entity)); + updateDtoMetadata(Optional.ofNullable(config.getMetadata()).orElseGet(() -> config.metadata(new Metadata()).getMetadata()), entity); + return config; + } + + @Mapping(target = "createdDate", source = "createdDate") + @Mapping(target = "createdByUserId", source = "createdBy") + @Mapping(target = "updatedDate", source = "updatedDate") + @Mapping(target = "updatedByUserId", source = "updatedBy") + public abstract void updateDtoMetadata(@MappingTarget Metadata configuration, ExportConfigEntity entity); + + protected String getConfigName(ExportConfig exportConfig) { + return exportConfig.getType() == null || ExportType.BURSAR_FEES_FINES.equals(exportConfig.getType()) + ? DEFAULT_CONFIG_NAME + : exportConfig.getType().getValue(); + } + + protected String getConfigDescription() { + return CONFIG_DESCRIPTION; + } + +} diff --git a/src/main/java/org/folio/des/mapper/ExportConfigMapperResolver.java b/src/main/java/org/folio/des/mapper/ExportConfigMapperResolver.java new file mode 100644 index 00000000..5265dd77 --- /dev/null +++ b/src/main/java/org/folio/des/mapper/ExportConfigMapperResolver.java @@ -0,0 +1,19 @@ +package org.folio.des.mapper; + +import java.util.Map; + +import org.folio.des.domain.dto.ExportType; + +import lombok.AllArgsConstructor; +import lombok.extern.log4j.Log4j2; + +@AllArgsConstructor +@Log4j2 +public class ExportConfigMapperResolver { + private final Map mappers; + private final DefaultExportConfigMapper defaultMapper; + + public BaseExportConfigMapper resolve(ExportType exportType) { + return mappers.getOrDefault(exportType, defaultMapper); + } +} diff --git a/src/main/java/org/folio/des/mapper/aqcuisition/ClaimsExportConfigMapper.java b/src/main/java/org/folio/des/mapper/aqcuisition/ClaimsExportConfigMapper.java new file mode 100644 index 00000000..cb67b1fb --- /dev/null +++ b/src/main/java/org/folio/des/mapper/aqcuisition/ClaimsExportConfigMapper.java @@ -0,0 +1,33 @@ +package org.folio.des.mapper.aqcuisition; + +import org.folio.des.domain.dto.ExportTypeSpecificParameters; +import org.folio.des.domain.dto.ExportTypeSpecificParametersWithLegacyBursar; +import org.folio.des.mapper.BaseExportConfigMapper; +import org.folio.des.domain.dto.ExportConfig; +import org.folio.des.service.config.ExportConfigConstants; +import org.folio.des.validator.acquisition.ClaimsExportParametersValidator; +import org.mapstruct.Mapper; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.validation.BeanPropertyBindingResult; + +@Mapper(imports = {ExportConfigConstants.class, ExportTypeSpecificParameters.class, ExportTypeSpecificParametersWithLegacyBursar.class}) +public abstract class ClaimsExportConfigMapper extends BaseExportConfigMapper { + + private static final String CONFIG_DESCRIPTION = "Claims export configuration parameters"; + + @Autowired + private ClaimsExportParametersValidator validator; + + protected String getConfigName(ExportConfig exportConfig) { + var errors = new BeanPropertyBindingResult(exportConfig.getExportTypeSpecificParameters(), "specificParameters"); + validator.validate(exportConfig.getExportTypeSpecificParameters(), errors); + + var ediOrdersExportConfig = exportConfig.getExportTypeSpecificParameters().getVendorEdiOrdersExportConfig(); + return exportConfig.getType().getValue() + "_" + ediOrdersExportConfig.getVendorId().toString() + "_" + exportConfig.getId(); + } + + protected String getConfigDescription() { + return CONFIG_DESCRIPTION; + } + +} diff --git a/src/main/java/org/folio/des/converter/aqcuisition/EdifactExportConfigToModelConfigConverter.java b/src/main/java/org/folio/des/mapper/aqcuisition/EdifactExportConfigMapper.java similarity index 58% rename from src/main/java/org/folio/des/converter/aqcuisition/EdifactExportConfigToModelConfigConverter.java rename to src/main/java/org/folio/des/mapper/aqcuisition/EdifactExportConfigMapper.java index 02381a22..769b8301 100644 --- a/src/main/java/org/folio/des/converter/aqcuisition/EdifactExportConfigToModelConfigConverter.java +++ b/src/main/java/org/folio/des/mapper/aqcuisition/EdifactExportConfigMapper.java @@ -1,50 +1,41 @@ -package org.folio.des.converter.aqcuisition; +package org.folio.des.mapper.aqcuisition; -import static org.folio.des.service.config.ExportConfigConstants.DEFAULT_MODULE_NAME; +import java.util.Objects; +import java.util.Optional; +import java.util.UUID; +import org.folio.des.domain.dto.ExportTypeSpecificParameters; +import org.folio.des.domain.dto.ExportTypeSpecificParametersWithLegacyBursar; +import org.folio.des.mapper.BaseExportConfigMapper; import org.folio.des.domain.dto.EdiSchedule; import org.folio.des.domain.dto.ExportConfig; -import org.folio.des.domain.dto.ModelConfiguration; import org.folio.des.domain.dto.ScheduleParameters; import org.folio.des.domain.dto.VendorEdiOrdersExportConfig; +import org.folio.des.service.config.ExportConfigConstants; import org.folio.des.validator.acquisition.EdifactOrdersExportParametersValidator; -import org.springframework.core.convert.converter.Converter; -import org.springframework.stereotype.Service; - -import com.fasterxml.jackson.databind.ObjectMapper; - -import lombok.AllArgsConstructor; -import lombok.SneakyThrows; -import lombok.extern.log4j.Log4j2; +import org.mapstruct.Mapper; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.validation.BeanPropertyBindingResult; import org.springframework.validation.Errors; -import java.util.Objects; -import java.util.Optional; -import java.util.UUID; +import lombok.extern.log4j.Log4j2; -@AllArgsConstructor @Log4j2 -@Service -public final class EdifactExportConfigToModelConfigConverter implements Converter { +@Mapper(imports = {ExportConfigConstants.class, ExportTypeSpecificParameters.class, ExportTypeSpecificParametersWithLegacyBursar.class}) +public abstract class EdifactExportConfigMapper extends BaseExportConfigMapper { + private static final String CONFIG_DESCRIPTION = "Edifact orders export configuration parameters"; private static final String INCORRECT_UUID_FOR_SCHEDULED_PARAMETER_MSG = "Incorrect UUID for scheduled parameter provided and will be replaced with : {}"; - private final ObjectMapper objectMapper; + @Autowired private EdifactOrdersExportParametersValidator validator; - @SneakyThrows - @Override - public ModelConfiguration convert(ExportConfig exportConfig) { + protected String getConfigName(ExportConfig exportConfig) { Errors errors = new BeanPropertyBindingResult(exportConfig.getExportTypeSpecificParameters(), "specificParameters"); validator.validate(exportConfig.getExportTypeSpecificParameters(), errors); - var config = new ModelConfiguration(); - config.setId(exportConfig.getId()); - config.setModule(DEFAULT_MODULE_NAME); VendorEdiOrdersExportConfig ediOrdersExportConfig = exportConfig.getExportTypeSpecificParameters().getVendorEdiOrdersExportConfig(); UUID vendorId = ediOrdersExportConfig.getVendorId(); - config.setConfigName(exportConfig.getType().getValue() + "_" + vendorId.toString() + "_" + exportConfig.getId()); Optional.ofNullable(ediOrdersExportConfig.getEdiSchedule()) .map(EdiSchedule::getScheduleParameters) .filter(scheduleParameters -> isScheduledParameterIdNotValid(exportConfig, scheduleParameters)) @@ -52,15 +43,15 @@ public ModelConfiguration convert(ExportConfig exportConfig) { log.warn(INCORRECT_UUID_FOR_SCHEDULED_PARAMETER_MSG, exportConfig.getId()); scheduleParameters.setId(UUID.fromString(exportConfig.getId())); }); - config.setDescription(CONFIG_DESCRIPTION); - config.setEnabled(true); - config.setDefault(true); - config.setValue(objectMapper.writeValueAsString(exportConfig)); - return config; + return exportConfig.getType().getValue() + "_" + vendorId.toString() + "_" + exportConfig.getId(); } private boolean isScheduledParameterIdNotValid(ExportConfig exportConfig, ScheduleParameters scheduleParameters) { - return Objects.isNull(scheduleParameters.getId()) || - !UUID.fromString(exportConfig.getId()).equals(scheduleParameters.getId()); + return Objects.isNull(scheduleParameters.getId()) || !UUID.fromString(exportConfig.getId()).equals(scheduleParameters.getId()); } + + protected String getConfigDescription() { + return CONFIG_DESCRIPTION; + } + } From 73704be435ee8a53568b13552b4bd95c70b46a93 Mon Sep 17 00:00:00 2001 From: saba_zedginidze Date: Tue, 28 Oct 2025 15:25:13 +0400 Subject: [PATCH 02/21] [MODEXPS-296] Update configuration --- .../folio/des/client/ConfigurationClient.java | 33 ------ .../folio/des/config/FolioAuditorAware.java | 28 +++++ .../des/config/ServiceConfiguration.java | 108 +++++++++--------- 3 files changed, 80 insertions(+), 89 deletions(-) delete mode 100644 src/main/java/org/folio/des/client/ConfigurationClient.java create mode 100644 src/main/java/org/folio/des/config/FolioAuditorAware.java diff --git a/src/main/java/org/folio/des/client/ConfigurationClient.java b/src/main/java/org/folio/des/client/ConfigurationClient.java deleted file mode 100644 index 2b04bdf6..00000000 --- a/src/main/java/org/folio/des/client/ConfigurationClient.java +++ /dev/null @@ -1,33 +0,0 @@ -package org.folio.des.client; - -import org.folio.des.config.feign.FeignClientConfiguration; -import org.folio.des.domain.dto.ConfigurationCollection; -import org.folio.des.domain.dto.ModelConfiguration; -import org.springframework.cloud.openfeign.FeignClient; -import org.springframework.http.MediaType; -import org.springframework.web.bind.annotation.DeleteMapping; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.PutMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestParam; - -@FeignClient(name = "configurations/entries", configuration = FeignClientConfiguration.class) -public interface ConfigurationClient { - - @GetMapping(produces = MediaType.APPLICATION_JSON_VALUE) - ConfigurationCollection getConfigurations(@RequestParam("query") String query, @RequestParam("limit") Integer limit); - - @PostMapping - ModelConfiguration postConfiguration(@RequestBody ModelConfiguration config); - - @PutMapping(path = "/{entryId}") - void putConfiguration(@RequestBody ModelConfiguration config, @PathVariable String entryId); - - @GetMapping(path = "/{entryId}") - ModelConfiguration getConfigById(@PathVariable String entryId); - - @DeleteMapping(path = "/{entryId}") - void deleteConfigById(@PathVariable String entryId); -} diff --git a/src/main/java/org/folio/des/config/FolioAuditorAware.java b/src/main/java/org/folio/des/config/FolioAuditorAware.java new file mode 100644 index 00000000..2ed0a74d --- /dev/null +++ b/src/main/java/org/folio/des/config/FolioAuditorAware.java @@ -0,0 +1,28 @@ +package org.folio.des.config; + +import java.util.Optional; +import java.util.UUID; + +import org.folio.spring.FolioExecutionContext; +import org.springframework.context.annotation.Configuration; +import org.springframework.data.domain.AuditorAware; +import org.springframework.data.jpa.repository.config.EnableJpaAuditing; + +import lombok.RequiredArgsConstructor; + +/** + * FolioAuditorAware class is being used for populating "createdBy" field automatically while performing any DB operation. + * getCurrentAuditor() is needed to get current logged in user. + */ +@Configuration +@EnableJpaAuditing +@RequiredArgsConstructor +public class FolioAuditorAware implements AuditorAware { + + private final FolioExecutionContext folioExecutionContext; + + @Override + public Optional getCurrentAuditor() { + return Optional.ofNullable(folioExecutionContext.getUserId()); + } +} diff --git a/src/main/java/org/folio/des/config/ServiceConfiguration.java b/src/main/java/org/folio/des/config/ServiceConfiguration.java index 6d8423a2..1d3eaa73 100644 --- a/src/main/java/org/folio/des/config/ServiceConfiguration.java +++ b/src/main/java/org/folio/des/config/ServiceConfiguration.java @@ -11,16 +11,14 @@ import org.folio.des.builder.job.EdifactOrdersJobCommandBuilder; import org.folio.des.builder.job.JobCommandBuilder; import org.folio.des.builder.job.JobCommandBuilderResolver; -import org.folio.des.client.ConfigurationClient; -import org.folio.des.converter.DefaultExportConfigToModelConfigConverter; -import org.folio.des.converter.DefaultModelConfigToExportConfigConverter; -import org.folio.des.converter.ExportConfigConverterResolver; -import org.folio.des.converter.aqcuisition.ClaimsExportConfigToModelConfigConverter; -import org.folio.des.converter.aqcuisition.EdifactExportConfigToModelConfigConverter; -import org.folio.des.domain.dto.ExportConfig; +import org.folio.des.mapper.BaseExportConfigMapper; +import org.folio.des.mapper.DefaultExportConfigMapper; +import org.folio.des.mapper.ExportConfigMapperResolver; +import org.folio.des.mapper.aqcuisition.ClaimsExportConfigMapper; +import org.folio.des.mapper.aqcuisition.EdifactExportConfigMapper; +import org.folio.des.repository.ExportConfigRepository; import org.folio.des.domain.dto.ExportType; import org.folio.des.domain.dto.ExportTypeSpecificParameters; -import org.folio.des.domain.dto.ModelConfiguration; import org.folio.des.scheduling.bursar.BursarExportScheduler; import org.folio.des.scheduling.ExportJobScheduler; import org.folio.des.scheduling.acquisition.EdifactScheduledJobInitializer; @@ -45,21 +43,21 @@ import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; -import org.springframework.core.convert.converter.Converter; import org.springframework.validation.Validator; @Configuration @ComponentScan("org.folio.des") public class ServiceConfiguration { + @Bean - ExportConfigConverterResolver exportConfigConverterResolver(DefaultExportConfigToModelConfigConverter defaultExportConfigToModelConfigConverter, - EdifactExportConfigToModelConfigConverter edifactExportConfigToModelConfigConverter, - ClaimsExportConfigToModelConfigConverter claimsExportConfigToModelConfigConverter) { - var converters = new HashMap>(); - converters.put(ExportType.BURSAR_FEES_FINES, defaultExportConfigToModelConfigConverter); - converters.put(ExportType.EDIFACT_ORDERS_EXPORT, edifactExportConfigToModelConfigConverter); - converters.put(ExportType.CLAIMS, claimsExportConfigToModelConfigConverter); - return new ExportConfigConverterResolver(converters, defaultExportConfigToModelConfigConverter); + ExportConfigMapperResolver exportConfigConverterResolver(DefaultExportConfigMapper defaultExportConfigMapper, + EdifactExportConfigMapper edifactExportConfigMapper, + ClaimsExportConfigMapper claimsExportConfigMapper) { + var converters = new HashMap(); + converters.put(ExportType.BURSAR_FEES_FINES, defaultExportConfigMapper); + converters.put(ExportType.EDIFACT_ORDERS_EXPORT, edifactExportConfigMapper); + converters.put(ExportType.CLAIMS, claimsExportConfigMapper); + return new ExportConfigMapperResolver(converters, defaultExportConfigMapper); } @Bean @@ -74,48 +72,45 @@ ExportConfigValidatorResolver exportConfigValidatorResolver(BursarFeesFinesExpor } @Bean - ExportTypeBasedConfigManager exportTypeBasedConfigManager(ConfigurationClient client, - ExportConfigServiceResolver exportConfigServiceResolver, - BaseExportConfigService baseExportConfigService, - DefaultModelConfigToExportConfigConverter defaultModelConfigToExportConfigConverter) { - return new ExportTypeBasedConfigManager(client, exportConfigServiceResolver, - baseExportConfigService, defaultModelConfigToExportConfigConverter); + ExportTypeBasedConfigManager exportTypeBasedConfigManager(ExportConfigServiceResolver exportConfigServiceResolver, + BaseExportConfigService defaultExportConfigService) { + return new ExportTypeBasedConfigManager(exportConfigServiceResolver, defaultExportConfigService); } @Bean - BursarFeesFinesExportConfigService bursarExportConfigService(ConfigurationClient client, ExportConfigValidatorResolver exportConfigValidatorResolver, - DefaultModelConfigToExportConfigConverter defaultModelConfigToExportConfigConverter, - ExportConfigConverterResolver exportConfigConverterResolver, BursarExportScheduler bursarExportScheduler) { - return new BursarFeesFinesExportConfigService(client, defaultModelConfigToExportConfigConverter, - exportConfigConverterResolver, exportConfigValidatorResolver, bursarExportScheduler); + BursarFeesFinesExportConfigService bursarExportConfigService(ExportConfigRepository repository, + DefaultExportConfigMapper defaultExportConfigMapper, + ExportConfigMapperResolver exportConfigMapperResolver, + ExportConfigValidatorResolver exportConfigValidatorResolver, + BursarExportScheduler bursarExportScheduler) { + return new BursarFeesFinesExportConfigService(repository, defaultExportConfigMapper, exportConfigMapperResolver, exportConfigValidatorResolver, bursarExportScheduler); } @Bean - EdifactOrdersExportService edifactOrdersExportService(ConfigurationClient client, ExportConfigValidatorResolver exportConfigValidatorResolver, - DefaultModelConfigToExportConfigConverter defaultModelConfigToExportConfigConverter, - ExportConfigConverterResolver exportConfigConverterResolver, - ExportJobScheduler exportJobScheduler) { - return new EdifactOrdersExportService(client, defaultModelConfigToExportConfigConverter, - exportConfigConverterResolver, exportConfigValidatorResolver, exportJobScheduler); + EdifactOrdersExportService edifactOrdersExportService(ExportConfigRepository repository, + DefaultExportConfigMapper defaultExportConfigMapper, + ExportConfigMapperResolver exportConfigMapperResolver, + ExportConfigValidatorResolver exportConfigValidatorResolver, + ExportJobScheduler exportJobScheduler) { + return new EdifactOrdersExportService(repository, defaultExportConfigMapper, exportConfigMapperResolver, exportConfigValidatorResolver, exportJobScheduler); } @Bean - ClaimsExportService claimsExportService(ConfigurationClient client, ExportConfigValidatorResolver exportConfigValidatorResolver, - DefaultModelConfigToExportConfigConverter defaultModelConfigToExportConfigConverter, - ExportConfigConverterResolver exportConfigConverterResolver) { - return new ClaimsExportService(client, defaultModelConfigToExportConfigConverter, - exportConfigConverterResolver, exportConfigValidatorResolver); + ClaimsExportService claimsExportService(ExportConfigRepository repository, + DefaultExportConfigMapper defaultExportConfigMapper, + ExportConfigMapperResolver exportConfigMapperResolver, + ExportConfigValidatorResolver exportConfigValidatorResolver) { + return new ClaimsExportService(repository, defaultExportConfigMapper, exportConfigMapperResolver, exportConfigValidatorResolver); } @Bean - BaseExportConfigService baseExportConfigService(ConfigurationClient client, ExportConfigValidatorResolver exportConfigValidatorResolver, - DefaultModelConfigToExportConfigConverter defaultModelConfigToExportConfigConverter, - ExportConfigConverterResolver exportConfigConverterResolver) { - return new BaseExportConfigService(client, defaultModelConfigToExportConfigConverter, - exportConfigConverterResolver, exportConfigValidatorResolver); + BaseExportConfigService defaultExportConfigService(ExportConfigRepository repository, + DefaultExportConfigMapper defaultExportConfigMapper, + ExportConfigMapperResolver exportConfigMapperResolver, + ExportConfigValidatorResolver exportConfigValidatorResolver) { + return new BaseExportConfigService(repository, defaultExportConfigMapper, exportConfigMapperResolver, exportConfigValidatorResolver); } - @Bean ExportConfigServiceResolver exportConfigServiceResolver(BursarFeesFinesExportConfigService bursarFeesFinesExportConfigService, EdifactOrdersExportService edifactOrdersExportService, @@ -127,11 +122,12 @@ ExportConfigServiceResolver exportConfigServiceResolver(BursarFeesFinesExportCon return new ExportConfigServiceResolver(exportConfigServiceMap); } - @Bean JobCommandBuilderResolver jobCommandBuilderResolver(BursarFeeFinesJobCommandBuilder bursarFeeFinesJobCommandBuilder, - CirculationLogJobCommandBuilder circulationLogJobCommandBuilder, - EdifactOrdersJobCommandBuilder edifactOrdersJobCommandBuilder, - EHoldingsJobCommandBuilder eHoldingsJobCommandBuilder, - AuthorityControlJobCommandBuilder authorityControlJobCommandBuilder) { + @Bean + JobCommandBuilderResolver jobCommandBuilderResolver(BursarFeeFinesJobCommandBuilder bursarFeeFinesJobCommandBuilder, + CirculationLogJobCommandBuilder circulationLogJobCommandBuilder, + EdifactOrdersJobCommandBuilder edifactOrdersJobCommandBuilder, + EHoldingsJobCommandBuilder eHoldingsJobCommandBuilder, + AuthorityControlJobCommandBuilder authorityControlJobCommandBuilder) { Map converters = new HashMap<>(); converters.put(ExportType.BURSAR_FEES_FINES, bursarFeeFinesJobCommandBuilder); converters.put(ExportType.CIRCULATION_LOG, circulationLogJobCommandBuilder); @@ -144,17 +140,16 @@ ExportConfigServiceResolver exportConfigServiceResolver(BursarFeesFinesExportCon @Bean EdifactScheduledJobInitializer edifactScheduledJobInitializer(ExportTypeBasedConfigManager exportTypeBasedConfigManager, - ExportJobScheduler exportJobScheduler) { + ExportJobScheduler exportJobScheduler) { return new EdifactScheduledJobInitializer(exportTypeBasedConfigManager, exportJobScheduler); } @Bean public ExportJobScheduler edifactOrdersExportJobScheduler(Scheduler scheduler, - ExportConfigToEdifactTriggerConverter edifactTriggerConverter, - ExportConfigToEdifactJobDetailConverter edifactJobDetailConverter, - EdifactJobKeyResolver edifactJobKeyResolver) { - return new QuartzExportJobScheduler(scheduler, edifactTriggerConverter, edifactJobDetailConverter, - edifactJobKeyResolver); + ExportConfigToEdifactTriggerConverter edifactTriggerConverter, + ExportConfigToEdifactJobDetailConverter edifactJobDetailConverter, + EdifactJobKeyResolver edifactJobKeyResolver) { + return new QuartzExportJobScheduler(scheduler, edifactTriggerConverter, edifactJobDetailConverter, edifactJobKeyResolver); } @Bean @@ -162,3 +157,4 @@ ScheduledJobsRemover scheduledJobsRemover(Scheduler scheduler) { return new ScheduledJobsRemover(scheduler, List.of(QuartzConstants.EDIFACT_ORDERS_EXPORT_GROUP_NAME, QuartzConstants.BURSAR_EXPORT_GROUP_NAME)); } } + From ad13b3fefdb4c5e63cc303d823f2d3a8b6e5db7f Mon Sep 17 00:00:00 2001 From: saba_zedginidze Date: Tue, 28 Oct 2025 15:25:30 +0400 Subject: [PATCH 03/21] [MODEXPS-296] Add export config entity --- .../folio/de/entity/ExportConfigEntity.java | 57 +++++++++++++++++++ .../folio/de/entity/base/AuditableEntity.java | 42 ++++++++++++++ .../repository/ExportConfigRepository.java | 16 ++++++ .../db/changelog/changelog-master.xml | 1 + .../23_10_2025_create_export_config_table.xml | 54 ++++++++++++++++++ 5 files changed, 170 insertions(+) create mode 100644 src/main/java/org/folio/de/entity/ExportConfigEntity.java create mode 100644 src/main/java/org/folio/de/entity/base/AuditableEntity.java create mode 100644 src/main/java/org/folio/des/repository/ExportConfigRepository.java create mode 100644 src/main/resources/db/changelog/changes/23_10_2025_create_export_config_table.xml diff --git a/src/main/java/org/folio/de/entity/ExportConfigEntity.java b/src/main/java/org/folio/de/entity/ExportConfigEntity.java new file mode 100644 index 00000000..b5ca130d --- /dev/null +++ b/src/main/java/org/folio/de/entity/ExportConfigEntity.java @@ -0,0 +1,57 @@ +package org.folio.de.entity; + +import java.util.List; +import java.util.UUID; + +import org.folio.de.entity.base.AuditableEntity; +import org.folio.des.domain.dto.ExportType; +import org.hibernate.annotations.Type; + +import io.hypersistence.utils.hibernate.type.json.JsonBinaryType; +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.EnumType; +import jakarta.persistence.Enumerated; +import jakarta.persistence.Id; +import jakarta.persistence.Table; +import lombok.Data; +import lombok.EqualsAndHashCode; + +@Entity +@Table(name = "export_config") +@Data +@EqualsAndHashCode(callSuper = true) +public class ExportConfigEntity extends AuditableEntity { + + @Id + @Column(name = "id", updatable = false, nullable = false) + private UUID id; + + @Column(name = "config_name", nullable = false, unique = true) + private String configName; + + @Enumerated(EnumType.STRING) + @Column(name = "type", nullable = false) + private ExportType type; + + @Column(name = "tenant", nullable = false) + private String tenant; + + @Type(JsonBinaryType.class) + @Column(name = "export_type_specific_parameters", columnDefinition = "jsonb", nullable = false) + private Object exportTypeSpecificParameters; + + @Column(name = "schedule_frequency") + private Integer scheduleFrequency; + + @Column(name = "schedule_period") + private String schedulePeriod; + + @Column(name = "schedule_time") + private String scheduleTime; + + @Type(JsonBinaryType.class) + @Column(name = "week_days", columnDefinition = "jsonb") + private List weekDays; + +} diff --git a/src/main/java/org/folio/de/entity/base/AuditableEntity.java b/src/main/java/org/folio/de/entity/base/AuditableEntity.java new file mode 100644 index 00000000..70530882 --- /dev/null +++ b/src/main/java/org/folio/de/entity/base/AuditableEntity.java @@ -0,0 +1,42 @@ +package org.folio.de.entity.base; + +import java.time.LocalDateTime; +import java.util.UUID; + +import org.springframework.data.annotation.CreatedBy; +import org.springframework.data.annotation.CreatedDate; +import org.springframework.data.annotation.LastModifiedBy; +import org.springframework.data.annotation.LastModifiedDate; +import org.springframework.data.jpa.domain.support.AuditingEntityListener; + +import jakarta.persistence.Column; +import jakarta.persistence.EntityListeners; +import jakarta.persistence.MappedSuperclass; +import lombok.Getter; +import lombok.Setter; +import lombok.ToString; + +@Getter +@Setter +@ToString +@MappedSuperclass +@EntityListeners(AuditingEntityListener.class) +public abstract class AuditableEntity { + + @CreatedDate + @Column(name = "created_date", nullable = false, updatable = false) + private LocalDateTime createdDate; + + @CreatedBy + @Column(name = "created_by", updatable = false) + private UUID createdBy; + + @LastModifiedDate + @Column(name = "updated_date", nullable = false) + private LocalDateTime updatedDate; + + @LastModifiedBy + @Column(name = "updated_by") + private UUID updatedBy; + +} diff --git a/src/main/java/org/folio/des/repository/ExportConfigRepository.java b/src/main/java/org/folio/des/repository/ExportConfigRepository.java new file mode 100644 index 00000000..b51a438c --- /dev/null +++ b/src/main/java/org/folio/des/repository/ExportConfigRepository.java @@ -0,0 +1,16 @@ +package org.folio.des.repository; + +import java.util.UUID; + +import org.folio.de.entity.ExportConfigEntity; +import org.folio.spring.cql.JpaCqlRepository; +import org.springframework.stereotype.Repository; + +/** + * Repository for ExportConfig entity to manage export configurations. + */ +@Repository +public interface ExportConfigRepository extends JpaCqlRepository { + +} + diff --git a/src/main/resources/db/changelog/changelog-master.xml b/src/main/resources/db/changelog/changelog-master.xml index 920fe660..4dd243b8 100644 --- a/src/main/resources/db/changelog/changelog-master.xml +++ b/src/main/resources/db/changelog/changelog-master.xml @@ -15,5 +15,6 @@ + diff --git a/src/main/resources/db/changelog/changes/23_10_2025_create_export_config_table.xml b/src/main/resources/db/changelog/changes/23_10_2025_create_export_config_table.xml new file mode 100644 index 00000000..e9154283 --- /dev/null +++ b/src/main/resources/db/changelog/changes/23_10_2025_create_export_config_table.xml @@ -0,0 +1,54 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + From 497710b2abd7c13093ffca83e8a3eb9d0fc21f9e Mon Sep 17 00:00:00 2001 From: saba_zedginidze Date: Tue, 28 Oct 2025 15:25:41 +0400 Subject: [PATCH 04/21] [MODEXPS-296] Update services --- .../des/service/JobExecutionService.java | 15 ++- .../service/config/ExportConfigConstants.java | 3 +- .../service/config/ExportConfigService.java | 6 ++ .../acquisition/ClaimsExportService.java | 15 ++- .../EdifactOrdersExportService.java | 15 ++- .../config/impl/BaseExportConfigService.java | 98 ++++++++++++------- .../BursarFeesFinesExportConfigService.java | 40 ++++---- .../impl/ExportTypeBasedConfigManager.java | 32 ++---- .../des/service/impl/JobServiceImpl.java | 6 +- 9 files changed, 115 insertions(+), 115 deletions(-) diff --git a/src/main/java/org/folio/des/service/JobExecutionService.java b/src/main/java/org/folio/des/service/JobExecutionService.java index 47b59182..80fc7726 100644 --- a/src/main/java/org/folio/des/service/JobExecutionService.java +++ b/src/main/java/org/folio/des/service/JobExecutionService.java @@ -13,14 +13,12 @@ import org.folio.de.entity.Job; import org.folio.de.entity.JobCommand; import org.folio.des.builder.job.JobCommandBuilderResolver; -import org.folio.des.client.ConfigurationClient; import org.folio.des.config.kafka.KafkaService; -import org.folio.des.converter.DefaultModelConfigToExportConfigConverter; import org.folio.des.domain.JobParameterNames; import org.folio.des.domain.dto.ExportConfig; import org.folio.des.domain.dto.ExportTypeSpecificParameters; -import org.folio.des.domain.dto.ModelConfiguration; import org.folio.des.domain.dto.VendorEdiOrdersExportConfig; +import org.folio.des.service.config.ExportConfigService; import org.folio.des.validator.ExportConfigValidatorResolver; import org.springframework.batch.core.JobParameter; import org.springframework.batch.core.JobParameters; @@ -38,14 +36,14 @@ @RequiredArgsConstructor public class JobExecutionService { + public static final String EDIFACT_ORDERS_EXPORT_KEY = "EDIFACT_ORDERS_EXPORT"; + public static final String FILE_NAME_KEY = "FILE_NAME"; + private final KafkaService kafka; private final ExportConfigValidatorResolver exportConfigValidatorResolver; private final JobCommandBuilderResolver jobCommandBuilderResolver; - private final DefaultModelConfigToExportConfigConverter defaultModelConfigToExportConfigConverter; - private final ConfigurationClient manager; + private final ExportConfigService defaultExportConfigService; private final ObjectMapper objectMapper; - public static final String EDIFACT_ORDERS_EXPORT_KEY = "EDIFACT_ORDERS_EXPORT"; - public static final String FILE_NAME_KEY = "FILE_NAME"; public JobCommand prepareStartJobCommand(Job job) { log.info("prepareStartJobCommand:: job={}.", job); @@ -72,8 +70,7 @@ public JobCommand prepareResendJobCommand(Job job) { .getVendorEdiOrdersExportConfig() .getExportConfigId().toString(); - ModelConfiguration modelConfiguration = manager.getConfigById(exportConfigId); - ExportConfig config = defaultModelConfigToExportConfigConverter.convert(modelConfiguration); + ExportConfig config = defaultExportConfigService.getConfigById(exportConfigId); Optional.ofNullable(config.getExportTypeSpecificParameters()). map(ExportTypeSpecificParameters::getVendorEdiOrdersExportConfig) .ifPresent(vendorEdiOrdersExportConfig -> addToParamsEdiExportConfig(paramsBuilder, vendorEdiOrdersExportConfig)); diff --git a/src/main/java/org/folio/des/service/config/ExportConfigConstants.java b/src/main/java/org/folio/des/service/config/ExportConfigConstants.java index d8873ce1..77b5881a 100644 --- a/src/main/java/org/folio/des/service/config/ExportConfigConstants.java +++ b/src/main/java/org/folio/des/service/config/ExportConfigConstants.java @@ -6,7 +6,6 @@ @NoArgsConstructor(access = AccessLevel.PRIVATE) public final class ExportConfigConstants { public static final String DEFAULT_MODULE_NAME = "mod-data-export-spring"; - public static final String DEFAULT_MODULE_QUERY = "module==" + DEFAULT_MODULE_NAME; - public static final String DEFAULT_CONFIG_QUERY = DEFAULT_MODULE_QUERY + " and configName==%s"; + public static final String DEFAULT_CONFIG_QUERY = "configName==%s"; public static final String DEFAULT_CONFIG_NAME = "export_config_parameters"; } diff --git a/src/main/java/org/folio/des/service/config/ExportConfigService.java b/src/main/java/org/folio/des/service/config/ExportConfigService.java index 14024fdf..06f52eb0 100644 --- a/src/main/java/org/folio/des/service/config/ExportConfigService.java +++ b/src/main/java/org/folio/des/service/config/ExportConfigService.java @@ -7,6 +7,7 @@ import org.folio.des.domain.dto.ModelConfiguration; public interface ExportConfigService { + void updateConfig(String configId, ExportConfig exportConfig); ModelConfiguration postConfig(ExportConfig exportConfig); @@ -14,4 +15,9 @@ public interface ExportConfigService { ExportConfigCollection getConfigCollection(String query, Integer limit); Optional getFirstConfig(); + + ExportConfig getConfigById(String configId); + + void deleteConfigById(String configId); + } diff --git a/src/main/java/org/folio/des/service/config/acquisition/ClaimsExportService.java b/src/main/java/org/folio/des/service/config/acquisition/ClaimsExportService.java index bc5d265f..d0f8c934 100644 --- a/src/main/java/org/folio/des/service/config/acquisition/ClaimsExportService.java +++ b/src/main/java/org/folio/des/service/config/acquisition/ClaimsExportService.java @@ -1,12 +1,13 @@ package org.folio.des.service.config.acquisition; import lombok.extern.log4j.Log4j2; -import org.folio.des.client.ConfigurationClient; -import org.folio.des.converter.DefaultModelConfigToExportConfigConverter; -import org.folio.des.converter.ExportConfigConverterResolver; +import org.folio.des.mapper.BaseExportConfigMapper; +import org.folio.des.mapper.DefaultExportConfigMapper; +import org.folio.des.mapper.ExportConfigMapperResolver; import org.folio.des.domain.dto.ExportConfig; import org.folio.des.domain.dto.ExportTypeSpecificParameters; import org.folio.des.domain.dto.ModelConfiguration; +import org.folio.des.repository.ExportConfigRepository; import org.folio.des.service.config.impl.BaseExportConfigService; import org.folio.des.validator.ExportConfigValidatorResolver; @@ -16,11 +17,9 @@ @Log4j2 public class ClaimsExportService extends BaseExportConfigService { - public ClaimsExportService(ConfigurationClient client, - DefaultModelConfigToExportConfigConverter defaultModelConfigToExportConfigConverter, - ExportConfigConverterResolver exportConfigConverterResolver, - ExportConfigValidatorResolver exportConfigValidatorResolver) { - super(client, defaultModelConfigToExportConfigConverter, exportConfigConverterResolver, exportConfigValidatorResolver); + public ClaimsExportService(ExportConfigRepository repository, DefaultExportConfigMapper defaultExportConfigMapper, + ExportConfigMapperResolver exportConfigMapperResolver, ExportConfigValidatorResolver exportConfigValidatorResolver) { + super(repository, defaultExportConfigMapper, exportConfigMapperResolver, exportConfigValidatorResolver); } @Override diff --git a/src/main/java/org/folio/des/service/config/acquisition/EdifactOrdersExportService.java b/src/main/java/org/folio/des/service/config/acquisition/EdifactOrdersExportService.java index bbabd3f3..06efeedf 100644 --- a/src/main/java/org/folio/des/service/config/acquisition/EdifactOrdersExportService.java +++ b/src/main/java/org/folio/des/service/config/acquisition/EdifactOrdersExportService.java @@ -3,12 +3,13 @@ import java.util.Optional; import java.util.UUID; -import org.folio.des.client.ConfigurationClient; -import org.folio.des.converter.DefaultModelConfigToExportConfigConverter; -import org.folio.des.converter.ExportConfigConverterResolver; +import org.folio.des.mapper.BaseExportConfigMapper; +import org.folio.des.mapper.DefaultExportConfigMapper; +import org.folio.des.mapper.ExportConfigMapperResolver; import org.folio.des.domain.dto.ExportConfig; import org.folio.des.domain.dto.ExportTypeSpecificParameters; import org.folio.des.domain.dto.ModelConfiguration; +import org.folio.des.repository.ExportConfigRepository; import org.folio.des.scheduling.ExportJobScheduler; import org.folio.des.service.config.impl.BaseExportConfigService; import org.folio.des.validator.ExportConfigValidatorResolver; @@ -20,12 +21,10 @@ public class EdifactOrdersExportService extends BaseExportConfigService { private final ExportJobScheduler exportJobScheduler; - public EdifactOrdersExportService(ConfigurationClient client, - DefaultModelConfigToExportConfigConverter defaultModelConfigToExportConfigConverter, - ExportConfigConverterResolver exportConfigConverterResolver, - ExportConfigValidatorResolver exportConfigValidatorResolver, + public EdifactOrdersExportService(ExportConfigRepository repository, DefaultExportConfigMapper defaultExportConfigMapper, + ExportConfigMapperResolver exportConfigMapperResolver, ExportConfigValidatorResolver exportConfigValidatorResolver, ExportJobScheduler exportJobScheduler) { - super(client, defaultModelConfigToExportConfigConverter, exportConfigConverterResolver, exportConfigValidatorResolver); + super(repository, defaultExportConfigMapper, exportConfigMapperResolver, exportConfigValidatorResolver); this.exportJobScheduler = exportJobScheduler; } diff --git a/src/main/java/org/folio/des/service/config/impl/BaseExportConfigService.java b/src/main/java/org/folio/des/service/config/impl/BaseExportConfigService.java index dbc7bdbe..d119da53 100644 --- a/src/main/java/org/folio/des/service/config/impl/BaseExportConfigService.java +++ b/src/main/java/org/folio/des/service/config/impl/BaseExportConfigService.java @@ -1,18 +1,23 @@ package org.folio.des.service.config.impl; +import static org.folio.des.service.config.impl.ExportTypeBasedConfigManager.EXPORT_CONFIGURATION_NOT_FOUND; + import java.util.Optional; +import java.util.UUID; -import org.apache.commons.lang3.StringUtils; -import org.folio.des.client.ConfigurationClient; -import org.folio.des.converter.DefaultModelConfigToExportConfigConverter; -import org.folio.des.converter.ExportConfigConverterResolver; -import org.folio.des.domain.dto.ConfigurationCollection; +import org.folio.de.entity.ExportConfigEntity; +import org.folio.des.mapper.DefaultExportConfigMapper; +import org.folio.des.mapper.ExportConfigMapperResolver; import org.folio.des.domain.dto.ExportConfig; import org.folio.des.domain.dto.ExportConfigCollection; import org.folio.des.domain.dto.ExportTypeSpecificParameters; import org.folio.des.domain.dto.ModelConfiguration; +import org.folio.des.repository.ExportConfigRepository; import org.folio.des.service.config.ExportConfigService; import org.folio.des.validator.ExportConfigValidatorResolver; +import org.folio.spring.exception.NotFoundException; +import org.springframework.data.domain.PageRequest; +import org.springframework.transaction.annotation.Transactional; import org.springframework.validation.BeanPropertyBindingResult; import org.springframework.validation.Errors; @@ -24,60 +29,71 @@ @RequiredArgsConstructor public class BaseExportConfigService implements ExportConfigService { - protected final ConfigurationClient client; - protected final DefaultModelConfigToExportConfigConverter defaultModelConfigToExportConfigConverter; - protected final ExportConfigConverterResolver exportConfigConverterResolver; + protected final ExportConfigRepository repository; + protected final DefaultExportConfigMapper defaultExportConfigMapper; + protected final ExportConfigMapperResolver exportConfigMapperResolver; protected final ExportConfigValidatorResolver exportConfigValidatorResolver; @Override + @Transactional public void updateConfig(String configId, ExportConfig exportConfig) { - log.info("Putting {} {}.", configId, exportConfig); + log.info("updateConfig:: configId={}, exportConfig={}", configId, exportConfig); validateIncomingExportConfig(exportConfig); - var config = createConfigModel(exportConfig); - client.putConfiguration(config, configId); - log.info("Put {} {}.", configId, config); + getExportConfigEntityOrThrow(configId); + + var entity = defaultExportConfigMapper.toEntity(exportConfig); + repository.save(entity); + log.info("updateConfig:: Successfully updated config with id={}", configId); } @Override + @Transactional public ModelConfiguration postConfig(ExportConfig exportConfig) { - log.info("Posting {}.", exportConfig); + log.info("postConfig:: exportConfig={}", exportConfig); validateIncomingExportConfig(exportConfig); - var preparedConfig = createConfigModel(exportConfig); - ModelConfiguration config = client.postConfiguration(preparedConfig); - log.info("Posted {}.", config); - return config; + + var entity = defaultExportConfigMapper.toEntity(exportConfig); + repository.save(entity); + log.info("postConfig:: Successfully created config with id={}", exportConfig.getId()); + + return createConfigModel(entity); } @Override public ExportConfigCollection getConfigCollection(String query, Integer limit) { - log.info("getConfigCollection:: by query={} with limit={}.", query, limit); - ConfigurationCollection configurationCollection = client.getConfigurations(query, limit); - if (configurationCollection.getTotalRecords() > 0) { - var exportConfigCollection = new ExportConfigCollection(); - configurationCollection.getConfigs().forEach(modelConfig -> exportConfigCollection - .addConfigsItem(defaultModelConfigToExportConfigConverter.convert(modelConfig)) - ); - ExportConfigCollection totalRecords = exportConfigCollection.totalRecords(exportConfigCollection.getConfigs().size()); - log.info("getConfigCollection:: totalRecords={}.", totalRecords); - return totalRecords; - } - log.debug("getConfigCollection:: returned empty result set."); - return new ExportConfigCollection().totalRecords(0); + log.info("getConfigCollection:: query={}, limit={}", query, limit); + var page = repository.findByCql(query, PageRequest.of(0, limit)); + return new ExportConfigCollection().totalRecords(page.getNumberOfElements()) + .configs(page.getContent().stream() + .map(defaultExportConfigMapper::toDto) + .toList()); } @Override public Optional getFirstConfig() { - var configurationCollection = getConfigCollection(StringUtils.EMPTY, 1); - if (configurationCollection.getTotalRecords() == 0) { - return Optional.empty(); - } - return Optional.of(configurationCollection.getConfigs().get(0)); + return repository.findAll(PageRequest.of(0, 1)) + .getContent().stream() + .map(defaultExportConfigMapper::toDto) + .findFirst(); + } + + @Override + public ExportConfig getConfigById(String configId) { + return repository.findById(UUID.fromString(configId)) + .map(defaultExportConfigMapper::toDto) + .orElseThrow(() -> new NotFoundException(EXPORT_CONFIGURATION_NOT_FOUND.formatted(configId))); + } + + @Override + public void deleteConfigById(String configId) { + var config = getExportConfigEntityOrThrow(configId); + repository.delete(config); + log.info("deleteConfigById:: Successfully deleted config with id={}", configId); } @SneakyThrows - protected ModelConfiguration createConfigModel(ExportConfig exportConfig) { - var converter = exportConfigConverterResolver.resolve(exportConfig.getType()); - return converter.convert(exportConfig); + protected ModelConfiguration createConfigModel(ExportConfigEntity exportConfigEntity) { + return exportConfigMapperResolver.resolve(exportConfigEntity.getType()).toModelConfiguration(exportConfigEntity); } protected void validateIncomingExportConfig(ExportConfig exportConfig) { @@ -86,4 +102,10 @@ protected void validateIncomingExportConfig(ExportConfig exportConfig) { validator.validate(exportConfig.getExportTypeSpecificParameters(), errors); }); } + + private ExportConfigEntity getExportConfigEntityOrThrow(String id) { + return repository.findById(UUID.fromString(id)) + .orElseThrow(() -> new NotFoundException(String.format(EXPORT_CONFIGURATION_NOT_FOUND, id))); + } + } diff --git a/src/main/java/org/folio/des/service/config/impl/BursarFeesFinesExportConfigService.java b/src/main/java/org/folio/des/service/config/impl/BursarFeesFinesExportConfigService.java index 3e34c51c..23bb0929 100644 --- a/src/main/java/org/folio/des/service/config/impl/BursarFeesFinesExportConfigService.java +++ b/src/main/java/org/folio/des/service/config/impl/BursarFeesFinesExportConfigService.java @@ -6,16 +6,18 @@ import java.util.Optional; import java.util.function.Function; -import org.folio.des.client.ConfigurationClient; -import org.folio.des.converter.DefaultModelConfigToExportConfigConverter; -import org.folio.des.converter.ExportConfigConverterResolver; -import org.folio.des.domain.dto.ConfigurationCollection; -import org.folio.des.domain.dto.ExportConfig; -import org.folio.des.domain.dto.ExportConfigCollection; +import org.folio.de.entity.ExportConfigEntity; +import org.folio.des.mapper.BaseExportConfigMapper; +import org.folio.des.mapper.DefaultExportConfigMapper; +import org.folio.des.mapper.ExportConfigMapperResolver; import org.folio.des.domain.dto.ExportConfigWithLegacyBursar; import org.folio.des.domain.dto.ModelConfiguration; +import org.folio.des.repository.ExportConfigRepository; +import org.folio.des.domain.dto.ExportConfig; +import org.folio.des.domain.dto.ExportConfigCollection; import org.folio.des.scheduling.bursar.BursarExportScheduler; import org.folio.des.validator.ExportConfigValidatorResolver; +import org.springframework.data.domain.PageRequest; import lombok.extern.log4j.Log4j2; @@ -24,11 +26,10 @@ public class BursarFeesFinesExportConfigService extends BaseExportConfigService private final BursarExportScheduler bursarExportScheduler; - public BursarFeesFinesExportConfigService(ConfigurationClient client, - DefaultModelConfigToExportConfigConverter defaultModelConfigToExportConfigConverter, - ExportConfigConverterResolver exportConfigConverterResolver, ExportConfigValidatorResolver exportConfigValidatorResolver, - BursarExportScheduler bursarExportScheduler) { - super(client, defaultModelConfigToExportConfigConverter, exportConfigConverterResolver, exportConfigValidatorResolver); + public BursarFeesFinesExportConfigService(ExportConfigRepository repository, DefaultExportConfigMapper defaultExportConfigMapper, + ExportConfigMapperResolver exportConfigMapperResolver, ExportConfigValidatorResolver exportConfigValidatorResolver, + BursarExportScheduler bursarExportScheduler) { + super(repository, defaultExportConfigMapper, exportConfigMapperResolver, exportConfigValidatorResolver); this.bursarExportScheduler = bursarExportScheduler; } @@ -56,22 +57,17 @@ public ExportConfigCollection getConfigCollection(String query, Integer limit) { @Override public Optional getFirstConfig() { - return getFirstConfigGeneric(defaultModelConfigToExportConfigConverter::convert); + return getFirstConfigGeneric(defaultExportConfigMapper::toDto); } public Optional getFirstConfigLegacy() { - return getFirstConfigGeneric(defaultModelConfigToExportConfigConverter::convertLegacy); + return getFirstConfigGeneric(defaultExportConfigMapper::toDtoLegacy); } - public Optional getFirstConfigGeneric(Function converter) { - ConfigurationCollection configurationCollection = client - .getConfigurations(String.format(DEFAULT_CONFIG_QUERY, DEFAULT_CONFIG_NAME), 1); - if (configurationCollection.getTotalRecords() == 0) { - return Optional.empty(); - } - T config = converter.apply(configurationCollection.getConfigs() - .get(0)); - return Optional.of(config); + private Optional getFirstConfigGeneric(Function converter) { + return repository.findByCql(DEFAULT_CONFIG_QUERY.formatted(DEFAULT_CONFIG_NAME), PageRequest.of(0, 1)) + .stream().findFirst() + .map(converter); } private ExportConfigCollection createExportConfigCollection(ExportConfig exportConfig) { diff --git a/src/main/java/org/folio/des/service/config/impl/ExportTypeBasedConfigManager.java b/src/main/java/org/folio/des/service/config/impl/ExportTypeBasedConfigManager.java index a737c596..9a9a8c0c 100644 --- a/src/main/java/org/folio/des/service/config/impl/ExportTypeBasedConfigManager.java +++ b/src/main/java/org/folio/des/service/config/impl/ExportTypeBasedConfigManager.java @@ -1,11 +1,8 @@ package org.folio.des.service.config.impl; -import static org.folio.des.domain.FilterOperator.AND_OPERATOR; import static org.folio.des.domain.FilterOperator.OR_OPERATOR; import static org.folio.des.domain.FilterPredicate.BY_TYPE_CONDITION; import static org.folio.des.domain.FilterPredicate.BY_VALUE_CONDITION; -import static org.folio.des.service.config.ExportConfigConstants.DEFAULT_MODULE_NAME; -import static org.folio.des.service.config.ExportConfigConstants.DEFAULT_MODULE_QUERY; import java.util.ArrayList; import java.util.EnumSet; @@ -19,8 +16,6 @@ import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.StringUtils; -import org.folio.des.client.ConfigurationClient; -import org.folio.des.converter.DefaultModelConfigToExportConfigConverter; import org.folio.des.domain.dto.ExportConfig; import org.folio.des.domain.dto.ExportConfigCollection; import org.folio.des.domain.dto.ExportType; @@ -28,7 +23,6 @@ import org.folio.des.domain.exception.ErrorCodes; import org.folio.des.domain.exception.RequestValidationException; import org.folio.des.service.config.ExportConfigService; -import org.folio.spring.exception.NotFoundException; import lombok.AllArgsConstructor; import lombok.extern.log4j.Log4j2; @@ -43,10 +37,8 @@ public class ExportTypeBasedConfigManager { private final Pattern exportTypePattern = Pattern.compile(EnumSet.allOf(ExportType.class).stream() .map(ExportType::toString).collect(Collectors.joining("|"))); - private final ConfigurationClient client; private final ExportConfigServiceResolver exportConfigServiceResolver; private final ExportConfigService defaultExportConfigService; - private final DefaultModelConfigToExportConfigConverter defaultModelConfigToExportConfigConverter; public void updateConfig(String configId, ExportConfig exportConfig) { log.info("updateConfig:: configId={}", configId); @@ -54,9 +46,9 @@ public void updateConfig(String configId, ExportConfig exportConfig) { log.error(ErrorCodes.MISMATCH_BETWEEN_ID_IN_PATH_AND_BODY.getDescription()); throw new RequestValidationException(ErrorCodes.MISMATCH_BETWEEN_ID_IN_PATH_AND_BODY); } - exportConfigServiceResolver.resolve(exportConfig.getType()) - .ifPresentOrElse(service -> service.updateConfig(configId, exportConfig), - () -> defaultExportConfigService.updateConfig(configId, exportConfig)); + exportConfigServiceResolver.resolve(exportConfig.getType()).ifPresentOrElse( + service -> service.updateConfig(configId, exportConfig), + () -> defaultExportConfigService.updateConfig(configId, exportConfig)); } public ModelConfiguration postConfig(ExportConfig exportConfig) { @@ -129,16 +121,10 @@ private List extractExportTypes(String query) { } private String normalizeQuery(ExportType exportType) { - return String.format("%s AND value==*%s*", DEFAULT_MODULE_QUERY, exportType); + return String.format("type==*%s*", exportType); } private String normalizeQuery(List exportTypes, String query) { - if (StringUtils.isEmpty(query)) { - return DEFAULT_MODULE_QUERY; - } - if (!query.contains(DEFAULT_MODULE_NAME)) { - query = DEFAULT_MODULE_QUERY + AND_OPERATOR.getValue() + query; - } if (isFilterByType(query) && CollectionUtils.isNotEmpty(exportTypes)) { query = query.replace(BY_TYPE_CONDITION.getValue(), BY_VALUE_CONDITION.getValue()); for (ExportType exportType : exportTypes) { @@ -149,17 +135,13 @@ private String normalizeQuery(List exportTypes, String query) { } public ExportConfig getConfigById(String exportConfigId) { - var configuration = client.getConfigById(exportConfigId); - if (configuration == null) { - log.error("Export configuration not found or parse error : {}}", exportConfigId); - throw new NotFoundException(String.format(EXPORT_CONFIGURATION_NOT_FOUND, exportConfigId)); - } - ExportConfig exportConfig = defaultModelConfigToExportConfigConverter.convert(configuration); + var exportConfig = defaultExportConfigService.getConfigById(exportConfigId); log.info("getConfigById:: result={}.", exportConfigId); return exportConfig; } public void deleteConfigById(String exportConfigId) { - client.deleteConfigById(exportConfigId); + defaultExportConfigService.deleteConfigById(exportConfigId); } + } diff --git a/src/main/java/org/folio/des/service/impl/JobServiceImpl.java b/src/main/java/org/folio/des/service/impl/JobServiceImpl.java index 69fa6249..aef73314 100644 --- a/src/main/java/org/folio/des/service/impl/JobServiceImpl.java +++ b/src/main/java/org/folio/des/service/impl/JobServiceImpl.java @@ -20,7 +20,6 @@ import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.StringUtils; import org.folio.de.entity.Job; -import org.folio.des.client.ConfigurationClient; import org.folio.des.client.ExportWorkerClient; import org.folio.des.domain.dto.ExportType; import org.folio.des.domain.dto.ExportTypeSpecificParameters; @@ -37,6 +36,7 @@ import org.folio.des.service.JobDeletionIntervalService; import org.folio.des.service.JobExecutionService; import org.folio.des.service.JobService; +import org.folio.des.service.config.ExportConfigService; import org.folio.des.service.util.JobMapperUtil; import org.folio.spring.FolioExecutionContext; import org.folio.spring.data.OffsetRequest; @@ -73,8 +73,8 @@ public class JobServiceImpl implements JobService { private final JobDataExportRepository repository; private final FolioExecutionContext context; private final CQLService cqlService; - private final ConfigurationClient client; private final JobDeletionIntervalService deletionIntervalService; + private final ExportConfigService defaultExportConfigService; @Transactional(readOnly = true) @Override @@ -128,7 +128,7 @@ public org.folio.des.domain.dto.Job upsertAndSendToKafka(org.folio.des.domain.dt .map(ExportTypeSpecificParameters::getVendorEdiOrdersExportConfig) .map(VendorEdiOrdersExportConfig::getExportConfigId).ifPresent(configId -> { try { - client.getConfigById(configId.toString()); + defaultExportConfigService.getConfigById(configId.toString()); } catch (NotFoundException e) { log.error("Config with id {} not found", configId.toString()); jobDto.getExportTypeSpecificParameters() From 548af9d949a2a1f5948de367939593b37a9c39be Mon Sep 17 00:00:00 2001 From: saba_zedginidze Date: Tue, 28 Oct 2025 15:25:59 +0400 Subject: [PATCH 05/21] [MODEXPS-296] Add mapstruct --- pom.xml | 36 ++++++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) diff --git a/pom.xml b/pom.xml index 496dbdc0..96f8982b 100644 --- a/pom.xml +++ b/pom.xml @@ -38,6 +38,8 @@ 4.1.1 1.0.0 3.9.2 + 1.6.3 + 0.2.0 4.4 6.2.1 @@ -167,6 +169,12 @@ true + + org.mapstruct + mapstruct + ${mapstruct.version} + + org.apache.logging.log4j log4j-web @@ -283,6 +291,34 @@ + + org.apache.maven.plugins + maven-compiler-plugin + + + + org.projectlombok + lombok + + + org.projectlombok + lombok-mapstruct-binding + ${mapstruct-binding.version} + + + org.mapstruct + mapstruct-processor + ${mapstruct.version} + + + + + -Amapstruct.defaultComponentModel=spring + + + + + org.codehaus.mojo versions-maven-plugin From 9af119a85910d2bda7a5296bbcf29d253a32d08c Mon Sep 17 00:00:00 2001 From: saba_zedginidze Date: Tue, 28 Oct 2025 15:57:37 +0400 Subject: [PATCH 06/21] [MODEXPS-296] Remove configuration schema usage --- .../folio/de/entity/ExportConfigEntity.java | 2 +- .../des/mapper/BaseExportConfigMapper.java | 39 ------------------- .../aqcuisition/ClaimsExportConfigMapper.java | 8 +--- .../EdifactExportConfigMapper.java | 17 +++----- .../service/config/ExportConfigService.java | 3 +- .../acquisition/ClaimsExportService.java | 9 ++--- .../EdifactOrdersExportService.java | 8 ++-- .../config/impl/BaseExportConfigService.java | 9 ++--- .../BursarFeesFinesExportConfigService.java | 8 ++-- .../impl/ExportTypeBasedConfigManager.java | 3 +- .../23_10_2025_create_export_config_table.xml | 2 +- src/main/resources/swagger.api/jobs.yaml | 2 - 12 files changed, 23 insertions(+), 87 deletions(-) diff --git a/src/main/java/org/folio/de/entity/ExportConfigEntity.java b/src/main/java/org/folio/de/entity/ExportConfigEntity.java index b5ca130d..67546f94 100644 --- a/src/main/java/org/folio/de/entity/ExportConfigEntity.java +++ b/src/main/java/org/folio/de/entity/ExportConfigEntity.java @@ -27,7 +27,7 @@ public class ExportConfigEntity extends AuditableEntity { @Column(name = "id", updatable = false, nullable = false) private UUID id; - @Column(name = "config_name", nullable = false, unique = true) + @Column(name = "config_name", nullable = false) private String configName; @Enumerated(EnumType.STRING) diff --git a/src/main/java/org/folio/des/mapper/BaseExportConfigMapper.java b/src/main/java/org/folio/des/mapper/BaseExportConfigMapper.java index 54af42e5..2c68d41f 100644 --- a/src/main/java/org/folio/des/mapper/BaseExportConfigMapper.java +++ b/src/main/java/org/folio/des/mapper/BaseExportConfigMapper.java @@ -2,32 +2,22 @@ import static org.folio.des.service.config.ExportConfigConstants.DEFAULT_CONFIG_NAME; -import java.util.Optional; - import org.folio.de.entity.ExportConfigEntity; import org.folio.des.domain.dto.ExportConfig; import org.folio.des.domain.dto.ExportConfigWithLegacyBursar; import org.folio.des.domain.dto.ExportType; import org.folio.des.domain.dto.ExportTypeSpecificParameters; import org.folio.des.domain.dto.ExportTypeSpecificParametersWithLegacyBursar; -import org.folio.des.domain.dto.Metadata; -import org.folio.des.domain.dto.ModelConfiguration; import org.folio.des.service.config.ExportConfigConstants; import org.mapstruct.Mapper; import org.mapstruct.Mapping; -import org.mapstruct.MappingTarget; import org.springframework.beans.factory.annotation.Autowired; -import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; -import lombok.SneakyThrows; - @Mapper(imports = {ExportConfigConstants.class, ExportTypeSpecificParameters.class, ExportTypeSpecificParametersWithLegacyBursar.class}, implementationName = "DefaultExportConfigMapper") public abstract class BaseExportConfigMapper { - private static final String CONFIG_DESCRIPTION = "Data export configuration parameters"; - @Autowired protected ObjectMapper objectMapper; @@ -43,39 +33,10 @@ public abstract class BaseExportConfigMapper { @Mapping(target = "exportTypeSpecificParameters", expression = "java(objectMapper.convertValue(entity.getExportTypeSpecificParameters(), ExportTypeSpecificParametersWithLegacyBursar.class))") public abstract ExportConfigWithLegacyBursar toDtoLegacy(ExportConfigEntity entity); - @Mapping(target = "module", expression = "java(ExportConfigConstants.DEFAULT_MODULE_NAME)") - @Mapping(target = "configName", expression = "java(getConfigName(dto))") - @Mapping(target = "description", expression = "java(getConfigDescription())") - @Mapping(target = "enabled", constant = "true") - @Mapping(target = "default", constant = "true") - @Mapping(target = "value", expression = "java(objectMapper.writeValueAsString(dto))") - @Mapping(target = "code", ignore = true) - @Mapping(target = "userId", ignore = true) - @Mapping(target = "_default", ignore = true) - @Mapping(target = "metadata", ignore = true) - public abstract ModelConfiguration toModelConfiguration(ExportConfig dto) throws JsonProcessingException; - - @SneakyThrows - public ModelConfiguration toModelConfiguration(ExportConfigEntity entity) { - var config = toModelConfiguration(toDto(entity)); - updateDtoMetadata(Optional.ofNullable(config.getMetadata()).orElseGet(() -> config.metadata(new Metadata()).getMetadata()), entity); - return config; - } - - @Mapping(target = "createdDate", source = "createdDate") - @Mapping(target = "createdByUserId", source = "createdBy") - @Mapping(target = "updatedDate", source = "updatedDate") - @Mapping(target = "updatedByUserId", source = "updatedBy") - public abstract void updateDtoMetadata(@MappingTarget Metadata configuration, ExportConfigEntity entity); - protected String getConfigName(ExportConfig exportConfig) { return exportConfig.getType() == null || ExportType.BURSAR_FEES_FINES.equals(exportConfig.getType()) ? DEFAULT_CONFIG_NAME : exportConfig.getType().getValue(); } - protected String getConfigDescription() { - return CONFIG_DESCRIPTION; - } - } diff --git a/src/main/java/org/folio/des/mapper/aqcuisition/ClaimsExportConfigMapper.java b/src/main/java/org/folio/des/mapper/aqcuisition/ClaimsExportConfigMapper.java index cb67b1fb..3636d209 100644 --- a/src/main/java/org/folio/des/mapper/aqcuisition/ClaimsExportConfigMapper.java +++ b/src/main/java/org/folio/des/mapper/aqcuisition/ClaimsExportConfigMapper.java @@ -1,9 +1,9 @@ package org.folio.des.mapper.aqcuisition; +import org.folio.des.domain.dto.ExportConfig; import org.folio.des.domain.dto.ExportTypeSpecificParameters; import org.folio.des.domain.dto.ExportTypeSpecificParametersWithLegacyBursar; import org.folio.des.mapper.BaseExportConfigMapper; -import org.folio.des.domain.dto.ExportConfig; import org.folio.des.service.config.ExportConfigConstants; import org.folio.des.validator.acquisition.ClaimsExportParametersValidator; import org.mapstruct.Mapper; @@ -13,8 +13,6 @@ @Mapper(imports = {ExportConfigConstants.class, ExportTypeSpecificParameters.class, ExportTypeSpecificParametersWithLegacyBursar.class}) public abstract class ClaimsExportConfigMapper extends BaseExportConfigMapper { - private static final String CONFIG_DESCRIPTION = "Claims export configuration parameters"; - @Autowired private ClaimsExportParametersValidator validator; @@ -26,8 +24,4 @@ protected String getConfigName(ExportConfig exportConfig) { return exportConfig.getType().getValue() + "_" + ediOrdersExportConfig.getVendorId().toString() + "_" + exportConfig.getId(); } - protected String getConfigDescription() { - return CONFIG_DESCRIPTION; - } - } diff --git a/src/main/java/org/folio/des/mapper/aqcuisition/EdifactExportConfigMapper.java b/src/main/java/org/folio/des/mapper/aqcuisition/EdifactExportConfigMapper.java index 769b8301..3a7350fd 100644 --- a/src/main/java/org/folio/des/mapper/aqcuisition/EdifactExportConfigMapper.java +++ b/src/main/java/org/folio/des/mapper/aqcuisition/EdifactExportConfigMapper.java @@ -4,13 +4,12 @@ import java.util.Optional; import java.util.UUID; -import org.folio.des.domain.dto.ExportTypeSpecificParameters; -import org.folio.des.domain.dto.ExportTypeSpecificParametersWithLegacyBursar; -import org.folio.des.mapper.BaseExportConfigMapper; import org.folio.des.domain.dto.EdiSchedule; import org.folio.des.domain.dto.ExportConfig; +import org.folio.des.domain.dto.ExportTypeSpecificParameters; +import org.folio.des.domain.dto.ExportTypeSpecificParametersWithLegacyBursar; import org.folio.des.domain.dto.ScheduleParameters; -import org.folio.des.domain.dto.VendorEdiOrdersExportConfig; +import org.folio.des.mapper.BaseExportConfigMapper; import org.folio.des.service.config.ExportConfigConstants; import org.folio.des.validator.acquisition.EdifactOrdersExportParametersValidator; import org.mapstruct.Mapper; @@ -24,7 +23,6 @@ @Mapper(imports = {ExportConfigConstants.class, ExportTypeSpecificParameters.class, ExportTypeSpecificParametersWithLegacyBursar.class}) public abstract class EdifactExportConfigMapper extends BaseExportConfigMapper { - private static final String CONFIG_DESCRIPTION = "Edifact orders export configuration parameters"; private static final String INCORRECT_UUID_FOR_SCHEDULED_PARAMETER_MSG = "Incorrect UUID for scheduled parameter provided and will be replaced with : {}"; @Autowired @@ -34,8 +32,7 @@ protected String getConfigName(ExportConfig exportConfig) { Errors errors = new BeanPropertyBindingResult(exportConfig.getExportTypeSpecificParameters(), "specificParameters"); validator.validate(exportConfig.getExportTypeSpecificParameters(), errors); - VendorEdiOrdersExportConfig ediOrdersExportConfig = exportConfig.getExportTypeSpecificParameters().getVendorEdiOrdersExportConfig(); - UUID vendorId = ediOrdersExportConfig.getVendorId(); + var ediOrdersExportConfig = exportConfig.getExportTypeSpecificParameters().getVendorEdiOrdersExportConfig(); Optional.ofNullable(ediOrdersExportConfig.getEdiSchedule()) .map(EdiSchedule::getScheduleParameters) .filter(scheduleParameters -> isScheduledParameterIdNotValid(exportConfig, scheduleParameters)) @@ -43,15 +40,11 @@ protected String getConfigName(ExportConfig exportConfig) { log.warn(INCORRECT_UUID_FOR_SCHEDULED_PARAMETER_MSG, exportConfig.getId()); scheduleParameters.setId(UUID.fromString(exportConfig.getId())); }); - return exportConfig.getType().getValue() + "_" + vendorId.toString() + "_" + exportConfig.getId(); + return exportConfig.getType().getValue() + "_" + ediOrdersExportConfig.getVendorId().toString() + "_" + exportConfig.getId(); } private boolean isScheduledParameterIdNotValid(ExportConfig exportConfig, ScheduleParameters scheduleParameters) { return Objects.isNull(scheduleParameters.getId()) || !UUID.fromString(exportConfig.getId()).equals(scheduleParameters.getId()); } - protected String getConfigDescription() { - return CONFIG_DESCRIPTION; - } - } diff --git a/src/main/java/org/folio/des/service/config/ExportConfigService.java b/src/main/java/org/folio/des/service/config/ExportConfigService.java index 06f52eb0..a87f739b 100644 --- a/src/main/java/org/folio/des/service/config/ExportConfigService.java +++ b/src/main/java/org/folio/des/service/config/ExportConfigService.java @@ -4,13 +4,12 @@ import org.folio.des.domain.dto.ExportConfig; import org.folio.des.domain.dto.ExportConfigCollection; -import org.folio.des.domain.dto.ModelConfiguration; public interface ExportConfigService { void updateConfig(String configId, ExportConfig exportConfig); - ModelConfiguration postConfig(ExportConfig exportConfig); + ExportConfig postConfig(ExportConfig exportConfig); ExportConfigCollection getConfigCollection(String query, Integer limit); diff --git a/src/main/java/org/folio/des/service/config/acquisition/ClaimsExportService.java b/src/main/java/org/folio/des/service/config/acquisition/ClaimsExportService.java index d0f8c934..047bba7f 100644 --- a/src/main/java/org/folio/des/service/config/acquisition/ClaimsExportService.java +++ b/src/main/java/org/folio/des/service/config/acquisition/ClaimsExportService.java @@ -1,12 +1,10 @@ package org.folio.des.service.config.acquisition; import lombok.extern.log4j.Log4j2; -import org.folio.des.mapper.BaseExportConfigMapper; import org.folio.des.mapper.DefaultExportConfigMapper; import org.folio.des.mapper.ExportConfigMapperResolver; import org.folio.des.domain.dto.ExportConfig; import org.folio.des.domain.dto.ExportTypeSpecificParameters; -import org.folio.des.domain.dto.ModelConfiguration; import org.folio.des.repository.ExportConfigRepository; import org.folio.des.service.config.impl.BaseExportConfigService; import org.folio.des.validator.ExportConfigValidatorResolver; @@ -30,13 +28,12 @@ public void updateConfig(String configId, ExportConfig exportConfig) { } @Override - public ModelConfiguration postConfig(ExportConfig exportConfig) { + public ExportConfig postConfig(ExportConfig exportConfig) { setExportConfigId(exportConfig); log.debug("postConfig:: by exportConfig={}", exportConfig); - ModelConfiguration result = super.postConfig(exportConfig); + exportConfig = super.postConfig(exportConfig); log.info("postConfig:: initial jobs prepared for export config id '{}'", exportConfig.getId()); - - return result; + return exportConfig; } private void setExportConfigId(ExportConfig exportConfig) { diff --git a/src/main/java/org/folio/des/service/config/acquisition/EdifactOrdersExportService.java b/src/main/java/org/folio/des/service/config/acquisition/EdifactOrdersExportService.java index 06efeedf..6276d2c9 100644 --- a/src/main/java/org/folio/des/service/config/acquisition/EdifactOrdersExportService.java +++ b/src/main/java/org/folio/des/service/config/acquisition/EdifactOrdersExportService.java @@ -3,12 +3,10 @@ import java.util.Optional; import java.util.UUID; -import org.folio.des.mapper.BaseExportConfigMapper; import org.folio.des.mapper.DefaultExportConfigMapper; import org.folio.des.mapper.ExportConfigMapperResolver; import org.folio.des.domain.dto.ExportConfig; import org.folio.des.domain.dto.ExportTypeSpecificParameters; -import org.folio.des.domain.dto.ModelConfiguration; import org.folio.des.repository.ExportConfigRepository; import org.folio.des.scheduling.ExportJobScheduler; import org.folio.des.service.config.impl.BaseExportConfigService; @@ -37,16 +35,16 @@ public void updateConfig(String configId, ExportConfig exportConfig) { } @Override - public ModelConfiguration postConfig(ExportConfig exportConfig) { + public ExportConfig postConfig(ExportConfig exportConfig) { if (exportConfig.getId() == null) { exportConfig.setId(UUID.randomUUID().toString()); } setExportConfigId(exportConfig); log.debug("postConfig:: by exportConfig={}", exportConfig); - ModelConfiguration result = super.postConfig(exportConfig); + exportConfig = super.postConfig(exportConfig); exportJobScheduler.scheduleExportJob(exportConfig); log.info("postConfig:: initial jobs prepared for export config id '{}'", exportConfig.getId()); - return result; + return exportConfig; } private void setExportConfigId(ExportConfig exportConfig) { diff --git a/src/main/java/org/folio/des/service/config/impl/BaseExportConfigService.java b/src/main/java/org/folio/des/service/config/impl/BaseExportConfigService.java index d119da53..d782a977 100644 --- a/src/main/java/org/folio/des/service/config/impl/BaseExportConfigService.java +++ b/src/main/java/org/folio/des/service/config/impl/BaseExportConfigService.java @@ -11,7 +11,6 @@ import org.folio.des.domain.dto.ExportConfig; import org.folio.des.domain.dto.ExportConfigCollection; import org.folio.des.domain.dto.ExportTypeSpecificParameters; -import org.folio.des.domain.dto.ModelConfiguration; import org.folio.des.repository.ExportConfigRepository; import org.folio.des.service.config.ExportConfigService; import org.folio.des.validator.ExportConfigValidatorResolver; @@ -48,7 +47,7 @@ public void updateConfig(String configId, ExportConfig exportConfig) { @Override @Transactional - public ModelConfiguration postConfig(ExportConfig exportConfig) { + public ExportConfig postConfig(ExportConfig exportConfig) { log.info("postConfig:: exportConfig={}", exportConfig); validateIncomingExportConfig(exportConfig); @@ -56,7 +55,7 @@ public ModelConfiguration postConfig(ExportConfig exportConfig) { repository.save(entity); log.info("postConfig:: Successfully created config with id={}", exportConfig.getId()); - return createConfigModel(entity); + return toDto(entity); } @Override @@ -92,8 +91,8 @@ public void deleteConfigById(String configId) { } @SneakyThrows - protected ModelConfiguration createConfigModel(ExportConfigEntity exportConfigEntity) { - return exportConfigMapperResolver.resolve(exportConfigEntity.getType()).toModelConfiguration(exportConfigEntity); + protected ExportConfig toDto(ExportConfigEntity exportConfigEntity) { + return exportConfigMapperResolver.resolve(exportConfigEntity.getType()).toDto(exportConfigEntity); } protected void validateIncomingExportConfig(ExportConfig exportConfig) { diff --git a/src/main/java/org/folio/des/service/config/impl/BursarFeesFinesExportConfigService.java b/src/main/java/org/folio/des/service/config/impl/BursarFeesFinesExportConfigService.java index 23bb0929..7df15856 100644 --- a/src/main/java/org/folio/des/service/config/impl/BursarFeesFinesExportConfigService.java +++ b/src/main/java/org/folio/des/service/config/impl/BursarFeesFinesExportConfigService.java @@ -7,11 +7,9 @@ import java.util.function.Function; import org.folio.de.entity.ExportConfigEntity; -import org.folio.des.mapper.BaseExportConfigMapper; import org.folio.des.mapper.DefaultExportConfigMapper; import org.folio.des.mapper.ExportConfigMapperResolver; import org.folio.des.domain.dto.ExportConfigWithLegacyBursar; -import org.folio.des.domain.dto.ModelConfiguration; import org.folio.des.repository.ExportConfigRepository; import org.folio.des.domain.dto.ExportConfig; import org.folio.des.domain.dto.ExportConfigCollection; @@ -41,11 +39,11 @@ public void updateConfig(String configId, ExportConfig exportConfig) { } @Override - public ModelConfiguration postConfig(ExportConfig exportConfig) { + public ExportConfig postConfig(ExportConfig exportConfig) { log.info("postConfig:: starting Bursar postConfig with configId:{}", exportConfig.getId()); - ModelConfiguration modelConfiguration = super.postConfig(exportConfig); + exportConfig = super.postConfig(exportConfig); bursarExportScheduler.scheduleBursarJob(exportConfig); - return modelConfiguration; + return exportConfig; } @Override diff --git a/src/main/java/org/folio/des/service/config/impl/ExportTypeBasedConfigManager.java b/src/main/java/org/folio/des/service/config/impl/ExportTypeBasedConfigManager.java index 9a9a8c0c..b7b4824c 100644 --- a/src/main/java/org/folio/des/service/config/impl/ExportTypeBasedConfigManager.java +++ b/src/main/java/org/folio/des/service/config/impl/ExportTypeBasedConfigManager.java @@ -19,7 +19,6 @@ import org.folio.des.domain.dto.ExportConfig; import org.folio.des.domain.dto.ExportConfigCollection; import org.folio.des.domain.dto.ExportType; -import org.folio.des.domain.dto.ModelConfiguration; import org.folio.des.domain.exception.ErrorCodes; import org.folio.des.domain.exception.RequestValidationException; import org.folio.des.service.config.ExportConfigService; @@ -51,7 +50,7 @@ public void updateConfig(String configId, ExportConfig exportConfig) { () -> defaultExportConfigService.updateConfig(configId, exportConfig)); } - public ModelConfiguration postConfig(ExportConfig exportConfig) { + public ExportConfig postConfig(ExportConfig exportConfig) { if (exportConfig.getId() == null) { exportConfig.setId(UUID.randomUUID().toString()); } diff --git a/src/main/resources/db/changelog/changes/23_10_2025_create_export_config_table.xml b/src/main/resources/db/changelog/changes/23_10_2025_create_export_config_table.xml index e9154283..ecf301e0 100644 --- a/src/main/resources/db/changelog/changes/23_10_2025_create_export_config_table.xml +++ b/src/main/resources/db/changelog/changes/23_10_2025_create_export_config_table.xml @@ -11,7 +11,7 @@ - + diff --git a/src/main/resources/swagger.api/jobs.yaml b/src/main/resources/swagger.api/jobs.yaml index d6479e34..df1fbcdc 100644 --- a/src/main/resources/swagger.api/jobs.yaml +++ b/src/main/resources/swagger.api/jobs.yaml @@ -236,8 +236,6 @@ components: $ref: '../../../../folio-export-common/schemas/jobCollection.json#/JobCollection' userdataCollection: $ref: '../../../../folio-export-common/schemas/user/userCollection.json#/UserCollection' - configurationdataCollection: - $ref: '../../../../folio-export-common/schemas/configuration/configurationCollection.json#/ConfigurationCollection' errors: $ref: '../../../../folio-export-common/schemas/common/errors.json#/Errors' identifierType: From 99ae8ca2277ddf88eb47643be53d0ca691689d81 Mon Sep 17 00:00:00 2001 From: saba_zedginidze Date: Tue, 28 Oct 2025 16:12:04 +0400 Subject: [PATCH 07/21] [MODEXPS-296] Improve mapper validations --- .../aqcuisition/ClaimsExportConfigMapper.java | 7 ++++++- .../aqcuisition/EdifactExportConfigMapper.java | 13 ++++++++++--- 2 files changed, 16 insertions(+), 4 deletions(-) diff --git a/src/main/java/org/folio/des/mapper/aqcuisition/ClaimsExportConfigMapper.java b/src/main/java/org/folio/des/mapper/aqcuisition/ClaimsExportConfigMapper.java index 3636d209..8b4f3ae9 100644 --- a/src/main/java/org/folio/des/mapper/aqcuisition/ClaimsExportConfigMapper.java +++ b/src/main/java/org/folio/des/mapper/aqcuisition/ClaimsExportConfigMapper.java @@ -6,6 +6,7 @@ import org.folio.des.mapper.BaseExportConfigMapper; import org.folio.des.service.config.ExportConfigConstants; import org.folio.des.validator.acquisition.ClaimsExportParametersValidator; +import org.mapstruct.BeforeMapping; import org.mapstruct.Mapper; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.validation.BeanPropertyBindingResult; @@ -16,10 +17,14 @@ public abstract class ClaimsExportConfigMapper extends BaseExportConfigMapper { @Autowired private ClaimsExportParametersValidator validator; - protected String getConfigName(ExportConfig exportConfig) { + @BeforeMapping + protected void validateConfig(ExportConfig exportConfig) { var errors = new BeanPropertyBindingResult(exportConfig.getExportTypeSpecificParameters(), "specificParameters"); validator.validate(exportConfig.getExportTypeSpecificParameters(), errors); + } + @Override + protected String getConfigName(ExportConfig exportConfig) { var ediOrdersExportConfig = exportConfig.getExportTypeSpecificParameters().getVendorEdiOrdersExportConfig(); return exportConfig.getType().getValue() + "_" + ediOrdersExportConfig.getVendorId().toString() + "_" + exportConfig.getId(); } diff --git a/src/main/java/org/folio/des/mapper/aqcuisition/EdifactExportConfigMapper.java b/src/main/java/org/folio/des/mapper/aqcuisition/EdifactExportConfigMapper.java index 3a7350fd..48c5e002 100644 --- a/src/main/java/org/folio/des/mapper/aqcuisition/EdifactExportConfigMapper.java +++ b/src/main/java/org/folio/des/mapper/aqcuisition/EdifactExportConfigMapper.java @@ -12,6 +12,7 @@ import org.folio.des.mapper.BaseExportConfigMapper; import org.folio.des.service.config.ExportConfigConstants; import org.folio.des.validator.acquisition.EdifactOrdersExportParametersValidator; +import org.mapstruct.BeforeMapping; import org.mapstruct.Mapper; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.validation.BeanPropertyBindingResult; @@ -28,8 +29,9 @@ public abstract class EdifactExportConfigMapper extends BaseExportConfigMapper { @Autowired private EdifactOrdersExportParametersValidator validator; - protected String getConfigName(ExportConfig exportConfig) { - Errors errors = new BeanPropertyBindingResult(exportConfig.getExportTypeSpecificParameters(), "specificParameters"); + @BeforeMapping + protected void validateConfig(ExportConfig exportConfig) { + var errors = new BeanPropertyBindingResult(exportConfig.getExportTypeSpecificParameters(), "specificParameters"); validator.validate(exportConfig.getExportTypeSpecificParameters(), errors); var ediOrdersExportConfig = exportConfig.getExportTypeSpecificParameters().getVendorEdiOrdersExportConfig(); @@ -40,11 +42,16 @@ protected String getConfigName(ExportConfig exportConfig) { log.warn(INCORRECT_UUID_FOR_SCHEDULED_PARAMETER_MSG, exportConfig.getId()); scheduleParameters.setId(UUID.fromString(exportConfig.getId())); }); - return exportConfig.getType().getValue() + "_" + ediOrdersExportConfig.getVendorId().toString() + "_" + exportConfig.getId(); } private boolean isScheduledParameterIdNotValid(ExportConfig exportConfig, ScheduleParameters scheduleParameters) { return Objects.isNull(scheduleParameters.getId()) || !UUID.fromString(exportConfig.getId()).equals(scheduleParameters.getId()); } + @Override + protected String getConfigName(ExportConfig exportConfig) { + var ediOrdersExportConfig = exportConfig.getExportTypeSpecificParameters().getVendorEdiOrdersExportConfig(); + return exportConfig.getType().getValue() + "_" + ediOrdersExportConfig.getVendorId().toString() + "_" + exportConfig.getId(); + } + } From 3bfecd396e157fadb6b62f83c6248b94466f5203 Mon Sep 17 00:00:00 2001 From: saba_zedginidze Date: Tue, 28 Oct 2025 16:41:12 +0400 Subject: [PATCH 08/21] [MODEXPS-296] Add mapper tests --- .../des/mapper/BaseExportConfigMapper.java | 1 + ...xportConfigToModelConfigConverterTest.java | 105 ---------- .../ExportConfigConverterResolverTest.java | 55 ------ ...xportConfigToModelConfigConverterTest.java | 92 --------- ...xportConfigToModelConfigConverterTest.java | 181 ----------------- .../mapper/DefaultExportConfigMapperTest.java | 127 ++++++++++++ .../ExportConfigMapperResolverTest.java | 182 ++++++++++++++++++ .../ClaimsExportConfigMapperTest.java | 155 +++++++++++++++ .../EdifactExportConfigMapperTest.java | 173 +++++++++++++++++ 9 files changed, 638 insertions(+), 433 deletions(-) delete mode 100644 src/test/java/org/folio/des/converter/DefaultExportConfigToModelConfigConverterTest.java delete mode 100644 src/test/java/org/folio/des/converter/ExportConfigConverterResolverTest.java delete mode 100644 src/test/java/org/folio/des/converter/acquisition/ClaimsExportConfigToModelConfigConverterTest.java delete mode 100644 src/test/java/org/folio/des/converter/acquisition/EdifactExportConfigToModelConfigConverterTest.java create mode 100644 src/test/java/org/folio/des/mapper/DefaultExportConfigMapperTest.java create mode 100644 src/test/java/org/folio/des/mapper/ExportConfigMapperResolverTest.java create mode 100644 src/test/java/org/folio/des/mapper/acquisition/ClaimsExportConfigMapperTest.java create mode 100644 src/test/java/org/folio/des/mapper/acquisition/EdifactExportConfigMapperTest.java diff --git a/src/main/java/org/folio/des/mapper/BaseExportConfigMapper.java b/src/main/java/org/folio/des/mapper/BaseExportConfigMapper.java index 2c68d41f..8cd69f52 100644 --- a/src/main/java/org/folio/des/mapper/BaseExportConfigMapper.java +++ b/src/main/java/org/folio/des/mapper/BaseExportConfigMapper.java @@ -21,6 +21,7 @@ public abstract class BaseExportConfigMapper { @Autowired protected ObjectMapper objectMapper; + @Mapping(target = "configName", expression = "java(getConfigName(dto))") @Mapping(target = "createdDate", ignore = true) @Mapping(target = "createdBy", ignore = true) @Mapping(target = "updatedDate", ignore = true) diff --git a/src/test/java/org/folio/des/converter/DefaultExportConfigToModelConfigConverterTest.java b/src/test/java/org/folio/des/converter/DefaultExportConfigToModelConfigConverterTest.java deleted file mode 100644 index 1debbfbb..00000000 --- a/src/test/java/org/folio/des/converter/DefaultExportConfigToModelConfigConverterTest.java +++ /dev/null @@ -1,105 +0,0 @@ -package org.folio.des.converter; - -import static org.folio.des.service.config.ExportConfigConstants.DEFAULT_CONFIG_NAME; -import static org.folio.des.service.config.ExportConfigConstants.DEFAULT_MODULE_NAME; -import static org.junit.jupiter.api.Assertions.assertEquals; - -import java.util.ArrayList; -import java.util.List; -import java.util.UUID; - -import org.folio.des.config.JacksonConfiguration; -import org.folio.des.domain.dto.BursarExportFilter; -import org.folio.des.domain.dto.BursarExportFilterAge; -import org.folio.des.domain.dto.BursarExportFilterCondition; -import org.folio.des.domain.dto.BursarExportFilterPatronGroup; -import org.folio.des.domain.dto.BursarExportJob; -import org.folio.des.domain.dto.ExportConfig; -import org.folio.des.domain.dto.ExportType; -import org.folio.des.domain.dto.ExportTypeSpecificParameters; -import org.folio.des.domain.dto.ModelConfiguration; -import org.folio.des.domain.dto.BursarExportFilterCondition.OperationEnum; -import org.junit.jupiter.api.Assertions; -import org.junit.jupiter.api.Test; -import org.junit.jupiter.params.ParameterizedTest; -import org.junit.jupiter.params.provider.CsvSource; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.context.SpringBootTest; - -@SpringBootTest(classes = { JacksonConfiguration.class, DefaultExportConfigToModelConfigConverter.class}) -class DefaultExportConfigToModelConfigConverterTest { - @Autowired - DefaultExportConfigToModelConfigConverter converter; - - @Test - void testConverterIfExportConfigIsValid() { - String expId = UUID.randomUUID().toString(); - ExportConfig bursarExportConfig = new ExportConfig(); - bursarExportConfig.setId(expId); - ExportTypeSpecificParameters parameters = new ExportTypeSpecificParameters(); - - BursarExportJob bursarFeeFines = new BursarExportJob(); - BursarExportFilterAge bursarExportFilterAge = new BursarExportFilterAge(); - bursarExportFilterAge.setNumDays(1); - BursarExportFilterPatronGroup bursarExportFilterPatronGroup = new BursarExportFilterPatronGroup(); - bursarExportFilterPatronGroup.setPatronGroupId(UUID.fromString("0000-00-00-00-000000")); - List bursarExportFilters = new ArrayList<>(); - bursarExportFilters.add(bursarExportFilterPatronGroup); - bursarExportFilters.add(bursarExportFilterAge); - BursarExportFilterCondition bursarExportFilterCondition = new BursarExportFilterCondition(); - bursarExportFilterCondition.setCriteria(bursarExportFilters); - bursarExportFilterCondition.setOperation(OperationEnum.AND); - bursarFeeFines.setFilter(bursarExportFilterCondition); - parameters.setBursarFeeFines(bursarFeeFines); - - bursarExportConfig.exportTypeSpecificParameters(parameters); - - ModelConfiguration actConfig = converter.convert(bursarExportConfig); - - Assertions.assertAll( - () -> assertEquals(expId, actConfig.getId()), - () -> assertEquals(DEFAULT_CONFIG_NAME, actConfig.getConfigName()), - () -> assertEquals(DEFAULT_MODULE_NAME, actConfig.getModule()), - () -> assertEquals(true, actConfig.getDefault()), - () -> assertEquals(true, actConfig.getEnabled()) - ); - } - - @ParameterizedTest - @CsvSource({ - "BATCH_VOUCHER_EXPORT, BATCH_VOUCHER_EXPORT", - "BURSAR_FEES_FINES, export_config_parameters" - }) - void testConverterIfExportConfigIsValidAndTypeIsProvided(ExportType exportType, String expConfigName) { - String expId = UUID.randomUUID().toString(); - ExportConfig bursarExportConfig = new ExportConfig(); - bursarExportConfig.setType(exportType); - bursarExportConfig.setId(expId); - ExportTypeSpecificParameters parameters = new ExportTypeSpecificParameters(); - - BursarExportJob bursarFeeFines = new BursarExportJob(); - BursarExportFilterAge bursarExportFilterAge = new BursarExportFilterAge(); - bursarExportFilterAge.setNumDays(1); - BursarExportFilterPatronGroup bursarExportFilterPatronGroup = new BursarExportFilterPatronGroup(); - bursarExportFilterPatronGroup.setPatronGroupId(UUID.fromString("0000-00-00-00-000000")); - List bursarExportFilters = new ArrayList<>(); - bursarExportFilters.add(bursarExportFilterPatronGroup); - bursarExportFilters.add(bursarExportFilterAge); - BursarExportFilterCondition bursarExportFilterCondition = new BursarExportFilterCondition(); - bursarExportFilterCondition.setCriteria(bursarExportFilters); - bursarExportFilterCondition.setOperation(OperationEnum.AND); - bursarFeeFines.setFilter(bursarExportFilterCondition); - parameters.setBursarFeeFines(bursarFeeFines); - bursarExportConfig.exportTypeSpecificParameters(parameters); - - ModelConfiguration actConfig = converter.convert(bursarExportConfig); - - Assertions.assertAll( - () -> assertEquals(expId, actConfig.getId()), - () -> assertEquals(expConfigName, actConfig.getConfigName()), - () -> assertEquals(DEFAULT_MODULE_NAME, actConfig.getModule()), - () -> assertEquals(true, actConfig.getDefault()), - () -> assertEquals(true, actConfig.getEnabled()) - ); - } -} diff --git a/src/test/java/org/folio/des/converter/ExportConfigConverterResolverTest.java b/src/test/java/org/folio/des/converter/ExportConfigConverterResolverTest.java deleted file mode 100644 index 99260e32..00000000 --- a/src/test/java/org/folio/des/converter/ExportConfigConverterResolverTest.java +++ /dev/null @@ -1,55 +0,0 @@ -package org.folio.des.converter; - -import static org.junit.jupiter.api.Assertions.assertSame; - -import org.folio.des.client.ConfigurationClient; -import org.folio.des.config.JacksonConfiguration; -import org.folio.des.config.ServiceConfiguration; -import org.folio.des.config.scheduling.QuartzSchemaInitializer; -import org.folio.des.domain.dto.ExportConfig; -import org.folio.des.domain.dto.ExportType; -import org.folio.des.domain.dto.ModelConfiguration; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; -import org.quartz.Scheduler; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.autoconfigure.EnableAutoConfiguration; -import org.springframework.boot.autoconfigure.batch.BatchAutoConfiguration; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.core.convert.converter.Converter; -import org.springframework.test.context.bean.override.mockito.MockitoBean; - -@SpringBootTest(classes = {JacksonConfiguration.class, ServiceConfiguration.class}) -@EnableAutoConfiguration(exclude = {BatchAutoConfiguration.class}) -class ExportConfigConverterResolverTest { - - @Autowired - private ExportConfigConverterResolver resolver; - @MockitoBean - private ConfigurationClient client; - @MockitoBean - private Scheduler scheduler; - @MockitoBean - private QuartzSchemaInitializer quartzSchemaInitializer; - - @Test - @DisplayName("Should retrieve converter for specific export type if converter is registered in the resolver") - void shouldRetrieveConverterForSpecifiedExportTypeIfConverterIsRegisteredInTheResolver() { - Converter converter = resolver.resolve(ExportType.BURSAR_FEES_FINES); - assertSame(DefaultExportConfigToModelConfigConverter.class, converter.getClass()); - } - - @Test - @DisplayName("Should retrieve default converter for specific export type if converter is not registered in the resolver") - void shouldRetrieveDefaultConverterForSpecifiedExportTypeIfConverterIsNotRegisteredInTheResolver() { - Converter converter = resolver.resolve(ExportType.CIRCULATION_LOG); - assertSame(DefaultExportConfigToModelConfigConverter.class, converter.getClass()); - } - - @Test - @DisplayName("Should retrieve default converter if export type is not provided") - void shouldRetrieveDefaultConverterIfExportTypeIsNotProvided() { - Converter converter = resolver.resolve(null); - assertSame(DefaultExportConfigToModelConfigConverter.class, converter.getClass()); - } -} diff --git a/src/test/java/org/folio/des/converter/acquisition/ClaimsExportConfigToModelConfigConverterTest.java b/src/test/java/org/folio/des/converter/acquisition/ClaimsExportConfigToModelConfigConverterTest.java deleted file mode 100644 index 95ef5d25..00000000 --- a/src/test/java/org/folio/des/converter/acquisition/ClaimsExportConfigToModelConfigConverterTest.java +++ /dev/null @@ -1,92 +0,0 @@ -package org.folio.des.converter.acquisition; - -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.databind.ObjectMapper; -import org.folio.des.config.JacksonConfiguration; -import org.folio.des.converter.aqcuisition.ClaimsExportConfigToModelConfigConverter; -import org.folio.des.domain.dto.ExportConfig; -import org.folio.des.domain.dto.ExportType; -import org.folio.des.domain.dto.ExportTypeSpecificParameters; -import org.folio.des.domain.dto.VendorEdiOrdersExportConfig; -import org.folio.des.validator.acquisition.ClaimsExportParametersValidator; -import org.junit.jupiter.api.Assertions; -import org.junit.jupiter.api.Test; -import org.junit.jupiter.params.ParameterizedTest; -import org.junit.jupiter.params.provider.CsvSource; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.context.SpringBootTest; - -import java.util.UUID; - -import static org.folio.des.service.config.ExportConfigConstants.DEFAULT_MODULE_NAME; -import static org.junit.jupiter.api.Assertions.assertEquals; - -@SpringBootTest(classes = { JacksonConfiguration.class, ClaimsExportConfigToModelConfigConverter.class, ClaimsExportParametersValidator.class, }) -class ClaimsExportConfigToModelConfigConverterTest { - - @Autowired - private ClaimsExportConfigToModelConfigConverter converter; - @Autowired - private ObjectMapper objectMapper; - - @Test - void testConverterIfExportConfigIsValid() throws JsonProcessingException { - var expId = UUID.randomUUID().toString(); - var vendorId = UUID.randomUUID(); - - var ediConfig = new ExportConfig(); - ediConfig.setId(expId); - ediConfig.setType(ExportType.CLAIMS); - - var vendorEdiOrdersExportConfig = new VendorEdiOrdersExportConfig(); - vendorEdiOrdersExportConfig.setVendorId(vendorId); - vendorEdiOrdersExportConfig.integrationType(VendorEdiOrdersExportConfig.IntegrationTypeEnum.CLAIMING); - vendorEdiOrdersExportConfig.transmissionMethod(VendorEdiOrdersExportConfig.TransmissionMethodEnum.FILE_DOWNLOAD); - vendorEdiOrdersExportConfig.fileFormat(VendorEdiOrdersExportConfig.FileFormatEnum.CSV); - - var parameters = new ExportTypeSpecificParameters(); - parameters.setVendorEdiOrdersExportConfig(vendorEdiOrdersExportConfig); - ediConfig.exportTypeSpecificParameters(parameters); - - var actConfig = converter.convert(ediConfig); - var actExportConfig = objectMapper.readValue(actConfig.getValue(), ExportConfig.class); - Assertions.assertAll( - () -> assertEquals(expId, actConfig.getId()), - () -> assertEquals(ExportType.CLAIMS + "_" + vendorId + "_" + expId, actConfig.getConfigName()), - () -> assertEquals(DEFAULT_MODULE_NAME, actConfig.getModule()), - () -> assertEquals(true, actConfig.getDefault()), - () -> assertEquals(true, actConfig.getEnabled()), - () -> assertEquals(expId, actExportConfig.getId()) - ); - } - - @ParameterizedTest - @CsvSource({ "CLAIMS, CLAIMS" }) - void testConverterIfExportConfigIsValidNoDuplicateError(ExportType exportType) { - var expId = UUID.randomUUID().toString(); - var vendorId = UUID.randomUUID(); - - var ediConfig = new ExportConfig(); - ediConfig.setType(exportType); - ediConfig.setId(expId); - - var vendorEdiOrdersExportConfig = new VendorEdiOrdersExportConfig(); - vendorEdiOrdersExportConfig.setVendorId(vendorId); - vendorEdiOrdersExportConfig.integrationType(VendorEdiOrdersExportConfig.IntegrationTypeEnum.CLAIMING); - vendorEdiOrdersExportConfig.transmissionMethod(VendorEdiOrdersExportConfig.TransmissionMethodEnum.FILE_DOWNLOAD); - vendorEdiOrdersExportConfig.fileFormat(VendorEdiOrdersExportConfig.FileFormatEnum.CSV); - - var parameters = new ExportTypeSpecificParameters(); - parameters.setVendorEdiOrdersExportConfig(vendorEdiOrdersExportConfig); - ediConfig.exportTypeSpecificParameters(parameters); - - var actConfig = converter.convert(ediConfig); - Assertions.assertAll( - () -> assertEquals(expId, actConfig.getId()), - () -> assertEquals(ExportType.CLAIMS + "_" + vendorId + "_" + expId, actConfig.getConfigName()), - () -> assertEquals(DEFAULT_MODULE_NAME, actConfig.getModule()), - () -> assertEquals(true, actConfig.getDefault()), - () -> assertEquals(true, actConfig.getEnabled()) - ); - } -} diff --git a/src/test/java/org/folio/des/converter/acquisition/EdifactExportConfigToModelConfigConverterTest.java b/src/test/java/org/folio/des/converter/acquisition/EdifactExportConfigToModelConfigConverterTest.java deleted file mode 100644 index 9c6550dd..00000000 --- a/src/test/java/org/folio/des/converter/acquisition/EdifactExportConfigToModelConfigConverterTest.java +++ /dev/null @@ -1,181 +0,0 @@ -package org.folio.des.converter.acquisition; - -import static org.folio.des.service.config.ExportConfigConstants.DEFAULT_MODULE_NAME; -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertThrows; - -import java.util.ArrayList; -import java.util.List; -import java.util.UUID; - -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.databind.ObjectMapper; -import org.folio.des.config.JacksonConfiguration; -import org.folio.des.converter.aqcuisition.EdifactExportConfigToModelConfigConverter; -import org.folio.des.domain.dto.BursarExportFilter; -import org.folio.des.domain.dto.BursarExportFilterAge; -import org.folio.des.domain.dto.BursarExportFilterCondition; -import org.folio.des.domain.dto.BursarExportFilterPatronGroup; -import org.folio.des.domain.dto.BursarExportJob; -import org.folio.des.domain.dto.EdiSchedule; -import org.folio.des.domain.dto.ExportConfig; -import org.folio.des.domain.dto.ExportType; -import org.folio.des.domain.dto.ExportTypeSpecificParameters; -import org.folio.des.domain.dto.ModelConfiguration; -import org.folio.des.domain.dto.ScheduleParameters; -import org.folio.des.domain.dto.VendorEdiOrdersExportConfig; -import org.folio.des.domain.dto.BursarExportFilterCondition.OperationEnum; -import org.folio.des.validator.acquisition.EdifactOrdersExportParametersValidator; -import org.folio.des.validator.acquisition.EdifactOrdersScheduledParamsValidator; -import org.junit.jupiter.api.Assertions; -import org.junit.jupiter.api.Test; -import org.junit.jupiter.params.ParameterizedTest; -import org.junit.jupiter.params.provider.CsvSource; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.context.SpringBootTest; - -@SpringBootTest(classes = { JacksonConfiguration.class, EdifactExportConfigToModelConfigConverter.class, - EdifactOrdersExportParametersValidator.class, EdifactOrdersScheduledParamsValidator.class}) -class EdifactExportConfigToModelConfigConverterTest { - @Autowired - private EdifactExportConfigToModelConfigConverter converter; - - @Autowired - private ObjectMapper objectMapper; - - @Test - void testConverterIfExportConfigIsValidAndScheduledIdIsNotProvided() throws JsonProcessingException { - String expId = UUID.randomUUID().toString(); - UUID vendorId = UUID.randomUUID(); - ExportConfig ediConfig = new ExportConfig(); - ediConfig.setId(expId); - ediConfig.setType(ExportType.EDIFACT_ORDERS_EXPORT); - ExportTypeSpecificParameters parameters = new ExportTypeSpecificParameters(); - VendorEdiOrdersExportConfig vendorEdiOrdersExportConfig = new VendorEdiOrdersExportConfig(); - vendorEdiOrdersExportConfig.setVendorId(vendorId); - - EdiSchedule accountEdiSchedule = new EdiSchedule(); - accountEdiSchedule.enableScheduledExport(true); - String accTime = "17:08:39"; - ScheduleParameters accScheduledParameters = new ScheduleParameters(); - accScheduledParameters.setSchedulePeriod(ScheduleParameters.SchedulePeriodEnum.WEEK); - accScheduledParameters.setScheduleFrequency(7); - accScheduledParameters.setScheduleTime(accTime); - accScheduledParameters.setTimeZone("Pacific/Midway"); - accountEdiSchedule.setScheduleParameters(accScheduledParameters); - vendorEdiOrdersExportConfig.setEdiSchedule(accountEdiSchedule); - - parameters.setVendorEdiOrdersExportConfig(vendorEdiOrdersExportConfig); - ediConfig.exportTypeSpecificParameters(parameters); - - ModelConfiguration actConfig = converter.convert(ediConfig); - var actExportConfig = objectMapper.readValue(actConfig.getValue(), ExportConfig.class); - Assertions.assertAll( - () -> assertEquals(expId, actConfig.getId()), - () -> assertEquals(ExportType.EDIFACT_ORDERS_EXPORT + "_" + vendorId + "_" + expId, actConfig.getConfigName()), - () -> assertEquals(DEFAULT_MODULE_NAME, actConfig.getModule()), - () -> assertEquals(true, actConfig.getDefault()), - () -> assertEquals(true, actConfig.getEnabled()), - () -> assertEquals(expId, actExportConfig.getId()) - ); - } - - @Test - void testConverterIfExportConfigIsValidAndScheduledIdIsProvidedButNotEqualToExportId() throws JsonProcessingException { - String expId = UUID.randomUUID().toString(); - UUID vendorId = UUID.randomUUID(); - ExportConfig ediConfig = new ExportConfig(); - ediConfig.setId(expId); - ediConfig.setType(ExportType.EDIFACT_ORDERS_EXPORT); - ExportTypeSpecificParameters parameters = new ExportTypeSpecificParameters(); - VendorEdiOrdersExportConfig vendorEdiOrdersExportConfig = new VendorEdiOrdersExportConfig(); - vendorEdiOrdersExportConfig.setVendorId(vendorId); - - EdiSchedule accountEdiSchedule = new EdiSchedule(); - accountEdiSchedule.enableScheduledExport(true); - String accTime = "17:08:39"; - ScheduleParameters accScheduledParameters = new ScheduleParameters(); - accScheduledParameters.setId(UUID.randomUUID()); - accScheduledParameters.setSchedulePeriod(ScheduleParameters.SchedulePeriodEnum.WEEK); - accScheduledParameters.setScheduleFrequency(7); - accScheduledParameters.setScheduleTime(accTime); - accScheduledParameters.setTimeZone("Pacific/Midway"); - accountEdiSchedule.scheduleParameters(accScheduledParameters); - vendorEdiOrdersExportConfig.setEdiSchedule(accountEdiSchedule); - - parameters.setVendorEdiOrdersExportConfig(vendorEdiOrdersExportConfig); - ediConfig.exportTypeSpecificParameters(parameters); - - ModelConfiguration actConfig = converter.convert(ediConfig); - var actExportConfig = objectMapper.readValue(actConfig.getValue(), ExportConfig.class); - Assertions.assertAll( - () -> assertEquals(expId, actConfig.getId()), - () -> assertEquals(ExportType.EDIFACT_ORDERS_EXPORT + "_" + vendorId + "_" + expId, actConfig.getConfigName()), - () -> assertEquals(DEFAULT_MODULE_NAME, actConfig.getModule()), - () -> assertEquals(true, actConfig.getDefault()), - () -> assertEquals(true, actConfig.getEnabled()), - () -> assertEquals(expId, actExportConfig.getId()) - ); - } - - @ParameterizedTest - @CsvSource({ - "EDIFACT_ORDERS_EXPORT, EDIFACT_ORDERS_EXPORT" - }) - void testConverterIfExportConfigIsValidAndTypeIsProvided(ExportType exportType) { - String expId = UUID.randomUUID().toString(); - UUID vendorId = UUID.randomUUID(); - ExportConfig ediConfig = new ExportConfig(); - ediConfig.setType(exportType); - ediConfig.setId(expId); - ExportTypeSpecificParameters parameters = new ExportTypeSpecificParameters(); - - VendorEdiOrdersExportConfig vendorEdiOrdersExportConfig = new VendorEdiOrdersExportConfig(); - vendorEdiOrdersExportConfig.setVendorId(vendorId); - parameters.setVendorEdiOrdersExportConfig(vendorEdiOrdersExportConfig); - ediConfig.exportTypeSpecificParameters(parameters); - - ediConfig.exportTypeSpecificParameters(parameters); - - ModelConfiguration actConfig = converter.convert(ediConfig); - - Assertions.assertAll( - () -> assertEquals(expId, actConfig.getId()), - () -> assertEquals(ExportType.EDIFACT_ORDERS_EXPORT + "_" + vendorId + "_" + expId, actConfig.getConfigName()), - () -> assertEquals(DEFAULT_MODULE_NAME, actConfig.getModule()), - () -> assertEquals(true, actConfig.getDefault()), - () -> assertEquals(true, actConfig.getEnabled()) - ); - } - - @ParameterizedTest - @CsvSource({ - "EDIFACT_ORDERS_EXPORT" - }) - void shouldThrowExceptionIfExportConfigIsNotValidAndTypeIsProvided(ExportType exportType) { - String expId = UUID.randomUUID().toString(); - ExportConfig ediConfig = new ExportConfig(); - ediConfig.setType(exportType); - ediConfig.setId(expId); - ExportTypeSpecificParameters parameters = new ExportTypeSpecificParameters(); - - BursarExportJob bursarFeeFines = new BursarExportJob(); - BursarExportFilterAge bursarExportFilterAge = new BursarExportFilterAge(); - bursarExportFilterAge.setNumDays(1); - BursarExportFilterPatronGroup bursarExportFilterPatronGroup = new BursarExportFilterPatronGroup(); - bursarExportFilterPatronGroup.setPatronGroupId(UUID.fromString("0000-00-00-00-000000")); - List bursarExportFilters = new ArrayList<>(); - bursarExportFilters.add(bursarExportFilterPatronGroup); - bursarExportFilters.add(bursarExportFilterAge); - BursarExportFilterCondition bursarExportFilterCondition = new BursarExportFilterCondition(); - bursarExportFilterCondition.setCriteria(bursarExportFilters); - bursarExportFilterCondition.setOperation(OperationEnum.AND); - bursarFeeFines.setFilter(bursarExportFilterCondition); - parameters.setBursarFeeFines(bursarFeeFines); - - ediConfig.exportTypeSpecificParameters(parameters); - - IllegalArgumentException exception = assertThrows(IllegalArgumentException.class, - () -> converter.convert(ediConfig)); - } -} diff --git a/src/test/java/org/folio/des/mapper/DefaultExportConfigMapperTest.java b/src/test/java/org/folio/des/mapper/DefaultExportConfigMapperTest.java new file mode 100644 index 00000000..7637369f --- /dev/null +++ b/src/test/java/org/folio/des/mapper/DefaultExportConfigMapperTest.java @@ -0,0 +1,127 @@ +package org.folio.des.mapper; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; + +import java.util.UUID; + +import org.folio.de.entity.ExportConfigEntity; +import org.folio.des.CopilotGenerated; +import org.folio.des.config.JacksonConfiguration; +import org.folio.des.domain.dto.ExportConfig; +import org.folio.des.domain.dto.ExportType; +import org.folio.des.domain.dto.ExportTypeSpecificParameters; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; + +import com.fasterxml.jackson.databind.ObjectMapper; + +@CopilotGenerated(model = "Claude Sonnet 4.5") +@SpringBootTest(classes = {JacksonConfiguration.class, DefaultExportConfigMapper.class}) +class DefaultExportConfigMapperTest { + + @Autowired + private DefaultExportConfigMapper mapper; + + @Autowired + private ObjectMapper objectMapper; + + @Test + @DisplayName("Should map ExportConfig DTO to Entity") + void testToEntity() { + // Given + String id = UUID.randomUUID().toString(); + ExportConfig dto = new ExportConfig(); + dto.setId(id); + dto.setType(ExportType.BURSAR_FEES_FINES); + dto.setTenant("test-tenant"); + dto.setScheduleFrequency(7); + dto.setSchedulePeriod(ExportConfig.SchedulePeriodEnum.WEEK); + dto.setScheduleTime("10:00:00"); + + ExportTypeSpecificParameters parameters = new ExportTypeSpecificParameters(); + dto.setExportTypeSpecificParameters(parameters); + + // When + ExportConfigEntity entity = mapper.toEntity(dto); + + // Then + assertNotNull(entity); + assertEquals(UUID.fromString(id), entity.getId()); + assertEquals(ExportType.BURSAR_FEES_FINES, entity.getType()); + assertEquals("test-tenant", entity.getTenant()); + assertEquals(7, entity.getScheduleFrequency()); + assertEquals("WEEK", entity.getSchedulePeriod()); + assertEquals("10:00:00", entity.getScheduleTime()); + assertEquals("export_config_parameters", entity.getConfigName()); // Default config name for BURSAR + } + + @Test + @DisplayName("Should map Entity to ExportConfig DTO") + void testToDto() { + // Given + UUID id = UUID.randomUUID(); + ExportConfigEntity entity = new ExportConfigEntity(); + entity.setId(id); + entity.setType(ExportType.BURSAR_FEES_FINES); + entity.setTenant("test-tenant"); + entity.setConfigName("test-config"); + entity.setScheduleFrequency(7); + entity.setSchedulePeriod("WEEK"); + entity.setScheduleTime("10:00:00"); + + ExportTypeSpecificParameters specificParams = new ExportTypeSpecificParameters(); + entity.setExportTypeSpecificParameters(specificParams); + + // When + ExportConfig dto = mapper.toDto(entity); + + // Then + assertNotNull(dto); + assertEquals(id.toString(), dto.getId()); + assertEquals(ExportType.BURSAR_FEES_FINES, dto.getType()); + assertEquals("test-tenant", dto.getTenant()); + assertEquals(7, dto.getScheduleFrequency()); + assertEquals(ExportConfig.SchedulePeriodEnum.WEEK, dto.getSchedulePeriod()); + assertEquals("10:00:00", dto.getScheduleTime()); + assertNotNull(dto.getExportTypeSpecificParameters()); + } + + @Test + @DisplayName("Should use default config name for BURSAR_FEES_FINES type") + void testGetConfigNameForBursarType() { + // Given + ExportConfig dto = new ExportConfig(); + dto.setId(UUID.randomUUID().toString()); + dto.setType(ExportType.BURSAR_FEES_FINES); + dto.setTenant("test-tenant"); + dto.setExportTypeSpecificParameters(new ExportTypeSpecificParameters()); + + // When + ExportConfigEntity entity = mapper.toEntity(dto); + + // Then + assertEquals("export_config_parameters", entity.getConfigName()); + } + + @Test + @DisplayName("Should use type value as config name for non-BURSAR types") + void testGetConfigNameForOtherTypes() { + // Given + ExportConfig dto = new ExportConfig(); + dto.setId(UUID.randomUUID().toString()); + dto.setType(ExportType.CIRCULATION_LOG); + dto.setTenant("test-tenant"); + dto.setExportTypeSpecificParameters(new ExportTypeSpecificParameters()); + + // When + ExportConfigEntity entity = mapper.toEntity(dto); + + // Then + assertEquals(ExportType.CIRCULATION_LOG.getValue(), entity.getConfigName()); + } + +} + diff --git a/src/test/java/org/folio/des/mapper/ExportConfigMapperResolverTest.java b/src/test/java/org/folio/des/mapper/ExportConfigMapperResolverTest.java new file mode 100644 index 00000000..fe6a2518 --- /dev/null +++ b/src/test/java/org/folio/des/mapper/ExportConfigMapperResolverTest.java @@ -0,0 +1,182 @@ +package org.folio.des.mapper; + +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertSame; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.verifyNoInteractions; + +import java.util.HashMap; +import java.util.Map; + +import org.folio.des.CopilotGenerated; +import org.folio.des.domain.dto.ExportType; +import org.folio.des.mapper.aqcuisition.ClaimsExportConfigMapper; +import org.folio.des.mapper.aqcuisition.EdifactExportConfigMapper; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.Mock; +import org.mockito.junit.jupiter.MockitoExtension; + +@CopilotGenerated(model = "Claude Sonnet 4.5") +@ExtendWith(MockitoExtension.class) +class ExportConfigMapperResolverTest { + + @Mock + private EdifactExportConfigMapper edifactMapper; + @Mock + private ClaimsExportConfigMapper claimsMapper; + @Mock + private DefaultExportConfigMapper defaultMapper; + + private ExportConfigMapperResolver resolver; + private Map mappers; + + @BeforeEach + void setUp() { + mappers = new HashMap<>(); + } + + @Test + @DisplayName("Should resolve default mapper when export type is not in map") + void testResolveDefaultMapperWhenTypeNotInMap() { + // Given + resolver = new ExportConfigMapperResolver(mappers, defaultMapper); + ExportType exportType = ExportType.BURSAR_FEES_FINES; + + // When + BaseExportConfigMapper result = resolver.resolve(exportType); + + // Then + assertNotNull(result); + assertSame(defaultMapper, result); + } + + @Test + @DisplayName("Should resolve specific mapper when export type is in map") + void testResolveSpecificMapperWhenTypeInMap() { + // Given + ExportType exportType = ExportType.EDIFACT_ORDERS_EXPORT; + mappers.put(exportType, edifactMapper); + resolver = new ExportConfigMapperResolver(mappers, defaultMapper); + + // When + BaseExportConfigMapper result = resolver.resolve(exportType); + + // Then + assertNotNull(result); + assertSame(edifactMapper, result); + } + + @Test + @DisplayName("Should resolve different mappers for different export types") + void testResolveDifferentMappersForDifferentTypes() { + // Given + mappers.put(ExportType.EDIFACT_ORDERS_EXPORT, edifactMapper); + mappers.put(ExportType.CIRCULATION_LOG, claimsMapper); + resolver = new ExportConfigMapperResolver(mappers, defaultMapper); + + // When + BaseExportConfigMapper edifactResult = resolver.resolve(ExportType.EDIFACT_ORDERS_EXPORT); + BaseExportConfigMapper claimsResult = resolver.resolve(ExportType.CIRCULATION_LOG); + BaseExportConfigMapper defaultResult = resolver.resolve(ExportType.BURSAR_FEES_FINES); + + // Then + assertSame(edifactMapper, edifactResult); + assertSame(claimsMapper, claimsResult); + assertSame(defaultMapper, defaultResult); + } + + @Test + @DisplayName("Should handle null export type gracefully and return default mapper") + void testHandleNullExportType() { + // Given + resolver = new ExportConfigMapperResolver(mappers, defaultMapper); + + // When + BaseExportConfigMapper result = resolver.resolve(null); + + // Then + assertNotNull(result); + assertSame(defaultMapper, result); + } + + @Test + @DisplayName("Should return default mapper when map is empty") + void testReturnDefaultMapperWhenMapIsEmpty() { + // Given + resolver = new ExportConfigMapperResolver(new HashMap<>(), defaultMapper); + + // When + BaseExportConfigMapper result = resolver.resolve(ExportType.EDIFACT_ORDERS_EXPORT); + + // Then + assertNotNull(result); + assertSame(defaultMapper, result); + } + + @Test + @DisplayName("Should consistently return same mapper for same export type") + void testConsistentlyReturnSameMapperForSameType() { + // Given + ExportType exportType = ExportType.EDIFACT_ORDERS_EXPORT; + mappers.put(exportType, edifactMapper); + resolver = new ExportConfigMapperResolver(mappers, defaultMapper); + + // When + BaseExportConfigMapper result1 = resolver.resolve(exportType); + BaseExportConfigMapper result2 = resolver.resolve(exportType); + BaseExportConfigMapper result3 = resolver.resolve(exportType); + + // Then + assertSame(result1, result2); + assertSame(result2, result3); + assertSame(edifactMapper, result1); + } + + @Test + @DisplayName("Should not invoke any methods on the mappers during resolution") + void testResolverDoesNotInvokeMapperMethods() { + // Given + mappers.put(ExportType.EDIFACT_ORDERS_EXPORT, edifactMapper); + resolver = new ExportConfigMapperResolver(mappers, defaultMapper); + + // When + resolver.resolve(ExportType.EDIFACT_ORDERS_EXPORT); + resolver.resolve(ExportType.BURSAR_FEES_FINES); + + // Then - no methods should be invoked on the mappers + verifyNoInteractions(edifactMapper); + verifyNoInteractions(defaultMapper); + } + + @Test + @DisplayName("Should handle multiple export types in resolver") + void testHandleMultipleExportTypesInResolver() { + // Given + BaseExportConfigMapper mapper1 = mock(BaseExportConfigMapper.class); + BaseExportConfigMapper mapper2 = mock(BaseExportConfigMapper.class); + BaseExportConfigMapper mapper3 = mock(BaseExportConfigMapper.class); + + mappers.put(ExportType.EDIFACT_ORDERS_EXPORT, mapper1); + mappers.put(ExportType.CIRCULATION_LOG, mapper2); + mappers.put(ExportType.BATCH_VOUCHER_EXPORT, mapper3); + + resolver = new ExportConfigMapperResolver(mappers, defaultMapper); + + // When + BaseExportConfigMapper resolvedMapper1 = resolver.resolve(ExportType.EDIFACT_ORDERS_EXPORT); + BaseExportConfigMapper resolvedMapper2 = resolver.resolve(ExportType.CIRCULATION_LOG); + BaseExportConfigMapper resolvedMapper3 = resolver.resolve(ExportType.BATCH_VOUCHER_EXPORT); + BaseExportConfigMapper resolvedDefault = resolver.resolve(ExportType.BURSAR_FEES_FINES); + + // Then + assertSame(mapper1, resolvedMapper1); + assertSame(mapper2, resolvedMapper2); + assertSame(mapper3, resolvedMapper3); + assertSame(defaultMapper, resolvedDefault); + } + +} + diff --git a/src/test/java/org/folio/des/mapper/acquisition/ClaimsExportConfigMapperTest.java b/src/test/java/org/folio/des/mapper/acquisition/ClaimsExportConfigMapperTest.java new file mode 100644 index 00000000..5beefc68 --- /dev/null +++ b/src/test/java/org/folio/des/mapper/acquisition/ClaimsExportConfigMapperTest.java @@ -0,0 +1,155 @@ +package org.folio.des.mapper.acquisition; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.doNothing; +import static org.mockito.Mockito.doThrow; +import static org.mockito.Mockito.times; +import static org.mockito.Mockito.verify; + +import java.util.UUID; + +import org.folio.de.entity.ExportConfigEntity; +import org.folio.des.CopilotGenerated; +import org.folio.des.config.JacksonConfiguration; +import org.folio.des.domain.dto.ExportConfig; +import org.folio.des.domain.dto.ExportType; +import org.folio.des.domain.dto.ExportTypeSpecificParameters; +import org.folio.des.domain.dto.VendorEdiOrdersExportConfig; +import org.folio.des.mapper.aqcuisition.ClaimsExportConfigMapper; +import org.folio.des.mapper.aqcuisition.ClaimsExportConfigMapperImpl; +import org.folio.des.validator.acquisition.ClaimsExportParametersValidator; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.bean.override.mockito.MockitoBean; + +@CopilotGenerated(model = "Claude Sonnet 4.5") +@SpringBootTest(classes = {JacksonConfiguration.class, ClaimsExportConfigMapperImpl.class, ClaimsExportParametersValidator.class}) +class ClaimsExportConfigMapperTest { + + @MockitoBean + private ClaimsExportParametersValidator validator; + @Autowired + private ClaimsExportConfigMapper mapper; + + @Test + @DisplayName("Should map ExportConfig DTO to Entity with vendor-specific config name") + void testToEntity() { + // Given + String exportId = UUID.randomUUID().toString(); + UUID vendorId = UUID.randomUUID(); + + ExportConfig dto = new ExportConfig(); + dto.setId(exportId); + dto.setType(ExportType.EDIFACT_ORDERS_EXPORT); + dto.setTenant("test-tenant"); + + VendorEdiOrdersExportConfig vendorConfig = new VendorEdiOrdersExportConfig(); + vendorConfig.setVendorId(vendorId); + vendorConfig.setIntegrationType(VendorEdiOrdersExportConfig.IntegrationTypeEnum.CLAIMING); + vendorConfig.setFileFormat(VendorEdiOrdersExportConfig.FileFormatEnum.EDI); + + ExportTypeSpecificParameters parameters = new ExportTypeSpecificParameters(); + parameters.setVendorEdiOrdersExportConfig(vendorConfig); + dto.setExportTypeSpecificParameters(parameters); + + doNothing().when(validator).validate(any(), any()); + + // When + ExportConfigEntity entity = mapper.toEntity(dto); + + // Then + assertNotNull(entity); + assertEquals(UUID.fromString(exportId), entity.getId()); + assertEquals(ExportType.EDIFACT_ORDERS_EXPORT, entity.getType()); + assertEquals("test-tenant", entity.getTenant()); + + // Verify config name format: TYPE_VENDORID_EXPORTID + String expectedConfigName = ExportType.EDIFACT_ORDERS_EXPORT.getValue() + "_" + vendorId + "_" + exportId; + assertEquals(expectedConfigName, entity.getConfigName()); + + verify(validator).validate(any(), any()); + } + + @Test + @DisplayName("Should map Entity to ExportConfig DTO") + void testToDto() { + // Given + UUID id = UUID.randomUUID(); + ExportConfigEntity entity = new ExportConfigEntity(); + entity.setId(id); + entity.setType(ExportType.EDIFACT_ORDERS_EXPORT); + entity.setTenant("test-tenant"); + entity.setConfigName("test-config"); + + ExportTypeSpecificParameters specificParams = new ExportTypeSpecificParameters(); + entity.setExportTypeSpecificParameters(specificParams); + + // When + ExportConfig dto = mapper.toDto(entity); + + // Then + assertNotNull(dto); + assertEquals(id.toString(), dto.getId()); + assertEquals(ExportType.EDIFACT_ORDERS_EXPORT, dto.getType()); + assertEquals("test-tenant", dto.getTenant()); + assertNotNull(dto.getExportTypeSpecificParameters()); + } + + @Test + @DisplayName("Should validate export config before mapping") + void testValidationIsCalled() { + // Given + String exportId = UUID.randomUUID().toString(); + UUID vendorId = UUID.randomUUID(); + + ExportConfig dto = new ExportConfig(); + dto.setId(exportId); + dto.setType(ExportType.EDIFACT_ORDERS_EXPORT); + dto.setTenant("test-tenant"); + + VendorEdiOrdersExportConfig vendorConfig = new VendorEdiOrdersExportConfig(); + vendorConfig.setVendorId(vendorId); + vendorConfig.setIntegrationType(VendorEdiOrdersExportConfig.IntegrationTypeEnum.CLAIMING); + + ExportTypeSpecificParameters parameters = new ExportTypeSpecificParameters(); + parameters.setVendorEdiOrdersExportConfig(vendorConfig); + dto.setExportTypeSpecificParameters(parameters); + + doNothing().when(validator).validate(any(), any()); + + // When + mapper.toEntity(dto); + + // Then - validator should be called with the parameters + verify(validator, times(1)).validate(any(), any()); + } + + @Test + @DisplayName("Should throw exception when validation fails") + void testValidationFailure() { + // Given + String exportId = UUID.randomUUID().toString(); + + ExportConfig dto = new ExportConfig(); + dto.setId(exportId); + dto.setType(ExportType.EDIFACT_ORDERS_EXPORT); + dto.setTenant("test-tenant"); + + ExportTypeSpecificParameters parameters = new ExportTypeSpecificParameters(); + parameters.setVendorEdiOrdersExportConfig(null); // Invalid - will cause validation error + dto.setExportTypeSpecificParameters(parameters); + + doThrow(new IllegalArgumentException("Export configuration is incomplete")) + .when(validator).validate(any(), any()); + + // When & Then + assertThrows(IllegalArgumentException.class, () -> mapper.toEntity(dto)); + verify(validator).validate(any(), any()); + } + +} diff --git a/src/test/java/org/folio/des/mapper/acquisition/EdifactExportConfigMapperTest.java b/src/test/java/org/folio/des/mapper/acquisition/EdifactExportConfigMapperTest.java new file mode 100644 index 00000000..fdfe66b0 --- /dev/null +++ b/src/test/java/org/folio/des/mapper/acquisition/EdifactExportConfigMapperTest.java @@ -0,0 +1,173 @@ +package org.folio.des.mapper.acquisition; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.doNothing; +import static org.mockito.Mockito.verify; + +import java.util.UUID; + +import org.folio.de.entity.ExportConfigEntity; +import org.folio.des.CopilotGenerated; +import org.folio.des.config.JacksonConfiguration; +import org.folio.des.domain.dto.EdiSchedule; +import org.folio.des.domain.dto.ExportConfig; +import org.folio.des.domain.dto.ExportType; +import org.folio.des.domain.dto.ExportTypeSpecificParameters; +import org.folio.des.domain.dto.ScheduleParameters; +import org.folio.des.domain.dto.VendorEdiOrdersExportConfig; +import org.folio.des.mapper.aqcuisition.EdifactExportConfigMapper; +import org.folio.des.mapper.aqcuisition.EdifactExportConfigMapperImpl; +import org.folio.des.validator.acquisition.EdifactOrdersExportParametersValidator; +import org.folio.des.validator.acquisition.EdifactOrdersScheduledParamsValidator; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.bean.override.mockito.MockitoBean; + +@CopilotGenerated(model = "Claude Sonnet 4.5") +@SpringBootTest(classes = {JacksonConfiguration.class, EdifactExportConfigMapperImpl.class, EdifactOrdersExportParametersValidator.class, EdifactOrdersScheduledParamsValidator.class}) +class EdifactExportConfigMapperTest { + + @MockitoBean + private EdifactOrdersExportParametersValidator validator; + @Autowired + private EdifactExportConfigMapper mapper; + + @Test + @DisplayName("Should map ExportConfig DTO to Entity with vendor-specific config name") + void testToEntity() { + // Given + String exportId = UUID.randomUUID().toString(); + UUID vendorId = UUID.randomUUID(); + + ExportConfig dto = new ExportConfig(); + dto.setId(exportId); + dto.setType(ExportType.EDIFACT_ORDERS_EXPORT); + dto.setTenant("test-tenant"); + + VendorEdiOrdersExportConfig vendorConfig = new VendorEdiOrdersExportConfig(); + vendorConfig.setVendorId(vendorId); + + ExportTypeSpecificParameters parameters = new ExportTypeSpecificParameters(); + parameters.setVendorEdiOrdersExportConfig(vendorConfig); + dto.setExportTypeSpecificParameters(parameters); + + doNothing().when(validator).validate(any(), any()); + + // When + ExportConfigEntity entity = mapper.toEntity(dto); + + // Then + assertNotNull(entity); + assertEquals(UUID.fromString(exportId), entity.getId()); + assertEquals(ExportType.EDIFACT_ORDERS_EXPORT, entity.getType()); + assertEquals("test-tenant", entity.getTenant()); + + // Verify config name format: TYPE_VENDORID_EXPORTID + String expectedConfigName = ExportType.EDIFACT_ORDERS_EXPORT.getValue() + "_" + vendorId + "_" + exportId; + assertEquals(expectedConfigName, entity.getConfigName()); + + verify(validator).validate(any(), any()); + } + + @Test + @DisplayName("Should map Entity to ExportConfig DTO") + void testToDto() { + // Given + UUID id = UUID.randomUUID(); + ExportConfigEntity entity = new ExportConfigEntity(); + entity.setId(id); + entity.setType(ExportType.EDIFACT_ORDERS_EXPORT); + entity.setTenant("test-tenant"); + entity.setConfigName("test-config"); + + ExportTypeSpecificParameters specificParams = new ExportTypeSpecificParameters(); + entity.setExportTypeSpecificParameters(specificParams); + + // When + ExportConfig dto = mapper.toDto(entity); + + // Then + assertNotNull(dto); + assertEquals(id.toString(), dto.getId()); + assertEquals(ExportType.EDIFACT_ORDERS_EXPORT, dto.getType()); + assertEquals("test-tenant", dto.getTenant()); + assertNotNull(dto.getExportTypeSpecificParameters()); + } + + @Test + @DisplayName("Should set schedule parameter ID when null during validation") + void testScheduleParameterIdSetWhenNull() { + // Given + String exportId = UUID.randomUUID().toString(); + UUID vendorId = UUID.randomUUID(); + + ExportConfig dto = new ExportConfig(); + dto.setId(exportId); + dto.setType(ExportType.EDIFACT_ORDERS_EXPORT); + dto.setTenant("test-tenant"); + + VendorEdiOrdersExportConfig vendorConfig = new VendorEdiOrdersExportConfig(); + vendorConfig.setVendorId(vendorId); + + ScheduleParameters scheduleParams = new ScheduleParameters(); + scheduleParams.setId(null); // ID is null + + EdiSchedule ediSchedule = new EdiSchedule(); + ediSchedule.setScheduleParameters(scheduleParams); + vendorConfig.setEdiSchedule(ediSchedule); + + ExportTypeSpecificParameters parameters = new ExportTypeSpecificParameters(); + parameters.setVendorEdiOrdersExportConfig(vendorConfig); + dto.setExportTypeSpecificParameters(parameters); + + doNothing().when(validator).validate(any(), any()); + + // When + mapper.toEntity(dto); + + // Then - schedule parameter ID should be set to export config ID + assertEquals(UUID.fromString(exportId), scheduleParams.getId()); + } + + @Test + @DisplayName("Should replace schedule parameter ID when it doesn't match export ID") + void testScheduleParameterIdReplacedWhenMismatch() { + // Given + String exportId = UUID.randomUUID().toString(); + UUID vendorId = UUID.randomUUID(); + UUID wrongScheduleId = UUID.randomUUID(); + + ExportConfig dto = new ExportConfig(); + dto.setId(exportId); + dto.setType(ExportType.EDIFACT_ORDERS_EXPORT); + dto.setTenant("test-tenant"); + + VendorEdiOrdersExportConfig vendorConfig = new VendorEdiOrdersExportConfig(); + vendorConfig.setVendorId(vendorId); + + ScheduleParameters scheduleParams = new ScheduleParameters(); + scheduleParams.setId(wrongScheduleId); // Wrong ID + + EdiSchedule ediSchedule = new EdiSchedule(); + ediSchedule.setScheduleParameters(scheduleParams); + vendorConfig.setEdiSchedule(ediSchedule); + + ExportTypeSpecificParameters parameters = new ExportTypeSpecificParameters(); + parameters.setVendorEdiOrdersExportConfig(vendorConfig); + dto.setExportTypeSpecificParameters(parameters); + + doNothing().when(validator).validate(any(), any()); + + // When + mapper.toEntity(dto); + + // Then - schedule parameter ID should be corrected to export config ID + assertEquals(UUID.fromString(exportId), scheduleParams.getId()); + } + +} + From 6c3de756856ac28a768bdebf3fc2648ac8d4a1a5 Mon Sep 17 00:00:00 2001 From: saba_zedginidze Date: Wed, 29 Oct 2025 16:54:45 +0400 Subject: [PATCH 09/21] [MODEXPS-296] Update services with own mappers --- .../folio/de/entity/ExportConfigEntity.java | 4 +++- .../des/config/JacksonConfiguration.java | 22 +++++++++++++++++-- .../des/config/ServiceConfiguration.java | 8 +++---- .../des/mapper/BaseExportConfigMapper.java | 11 +++++++++- .../acquisition/ClaimsExportService.java | 4 +++- .../EdifactOrdersExportService.java | 3 ++- .../config/impl/BaseExportConfigService.java | 16 +++++++------- .../BursarFeesFinesExportConfigService.java | 4 ++-- 8 files changed, 52 insertions(+), 20 deletions(-) diff --git a/src/main/java/org/folio/de/entity/ExportConfigEntity.java b/src/main/java/org/folio/de/entity/ExportConfigEntity.java index 67546f94..63bf19a2 100644 --- a/src/main/java/org/folio/de/entity/ExportConfigEntity.java +++ b/src/main/java/org/folio/de/entity/ExportConfigEntity.java @@ -16,10 +16,12 @@ import jakarta.persistence.Table; import lombok.Data; import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; @Entity -@Table(name = "export_config") +@Table(name = "export_configs") @Data +@Accessors(chain = true) @EqualsAndHashCode(callSuper = true) public class ExportConfigEntity extends AuditableEntity { diff --git a/src/main/java/org/folio/des/config/JacksonConfiguration.java b/src/main/java/org/folio/des/config/JacksonConfiguration.java index 1752683d..28496f2a 100644 --- a/src/main/java/org/folio/des/config/JacksonConfiguration.java +++ b/src/main/java/org/folio/des/config/JacksonConfiguration.java @@ -1,19 +1,25 @@ package org.folio.des.config; import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.core.JsonGenerator; import com.fasterxml.jackson.core.JsonParser; import com.fasterxml.jackson.databind.DeserializationContext; import com.fasterxml.jackson.databind.DeserializationFeature; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.SerializationFeature; +import com.fasterxml.jackson.databind.SerializerProvider; import com.fasterxml.jackson.databind.deser.std.StdDeserializer; import com.fasterxml.jackson.databind.module.SimpleModule; +import com.fasterxml.jackson.databind.ser.std.StdSerializer; + import io.hypersistence.utils.hibernate.type.util.ObjectMapperSupplier; import java.io.IOException; import java.sql.Date; import java.util.HashMap; import java.util.Map; +import java.util.UUID; + import org.springframework.batch.core.ExitStatus; import org.springframework.batch.core.JobParameter; import org.springframework.context.annotation.Bean; @@ -30,8 +36,9 @@ public class JacksonConfiguration implements ObjectMapperSupplier { .findAndRegisterModules() .registerModule( new SimpleModule() - .addDeserializer(ExitStatus.class, new ExitStatusDeserializer()) - .addDeserializer(JobParameter.class, new JobParameterDeserializer())) + .addDeserializer(ExitStatus.class, new ExitStatusDeserializer()) + .addDeserializer(JobParameter.class, new JobParameterDeserializer()) + .addSerializer(UUID.class, new UUIDSerializer(UUID.class))) .configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false) .configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false) .setSerializationInclusion(JsonInclude.Include.NON_EMPTY); @@ -92,6 +99,17 @@ public JobParameter deserialize(JsonParser jp, DeserializationContext ctxt) t } } + static class UUIDSerializer extends StdSerializer { + public UUIDSerializer(Class t) { + super(t); + } + + @Override + public void serialize(UUID value, JsonGenerator gen, SerializerProvider provider) throws IOException { + gen.writeString(value.toString()); + } + } + @Bean public ObjectMapper objectMapper() { return OBJECT_MAPPER; diff --git a/src/main/java/org/folio/des/config/ServiceConfiguration.java b/src/main/java/org/folio/des/config/ServiceConfiguration.java index 1d3eaa73..b3f44566 100644 --- a/src/main/java/org/folio/des/config/ServiceConfiguration.java +++ b/src/main/java/org/folio/des/config/ServiceConfiguration.java @@ -88,19 +88,19 @@ BursarFeesFinesExportConfigService bursarExportConfigService(ExportConfigReposit @Bean EdifactOrdersExportService edifactOrdersExportService(ExportConfigRepository repository, - DefaultExportConfigMapper defaultExportConfigMapper, + EdifactExportConfigMapper edifactExportConfigMapper, ExportConfigMapperResolver exportConfigMapperResolver, ExportConfigValidatorResolver exportConfigValidatorResolver, ExportJobScheduler exportJobScheduler) { - return new EdifactOrdersExportService(repository, defaultExportConfigMapper, exportConfigMapperResolver, exportConfigValidatorResolver, exportJobScheduler); + return new EdifactOrdersExportService(repository, edifactExportConfigMapper, exportConfigMapperResolver, exportConfigValidatorResolver, exportJobScheduler); } @Bean ClaimsExportService claimsExportService(ExportConfigRepository repository, - DefaultExportConfigMapper defaultExportConfigMapper, + ClaimsExportConfigMapper claimsExportConfigMapper, ExportConfigMapperResolver exportConfigMapperResolver, ExportConfigValidatorResolver exportConfigValidatorResolver) { - return new ClaimsExportService(repository, defaultExportConfigMapper, exportConfigMapperResolver, exportConfigValidatorResolver); + return new ClaimsExportService(repository, claimsExportConfigMapper, exportConfigMapperResolver, exportConfigValidatorResolver); } @Bean diff --git a/src/main/java/org/folio/des/mapper/BaseExportConfigMapper.java b/src/main/java/org/folio/des/mapper/BaseExportConfigMapper.java index 8cd69f52..beb73128 100644 --- a/src/main/java/org/folio/des/mapper/BaseExportConfigMapper.java +++ b/src/main/java/org/folio/des/mapper/BaseExportConfigMapper.java @@ -13,15 +13,24 @@ import org.mapstruct.Mapping; import org.springframework.beans.factory.annotation.Autowired; +import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.databind.ObjectMapper; -@Mapper(imports = {ExportConfigConstants.class, ExportTypeSpecificParameters.class, ExportTypeSpecificParametersWithLegacyBursar.class}, implementationName = "DefaultExportConfigMapper") +import jakarta.annotation.PostConstruct; + +@Mapper(implementationName = "DefaultExportConfigMapper", imports = {ExportConfigConstants.class, ExportTypeSpecificParameters.class, ExportTypeSpecificParametersWithLegacyBursar.class}) public abstract class BaseExportConfigMapper { @Autowired protected ObjectMapper objectMapper; + @PostConstruct + public void init() { + objectMapper = objectMapper.copy().setSerializationInclusion(JsonInclude.Include.ALWAYS); + } + @Mapping(target = "configName", expression = "java(getConfigName(dto))") + @Mapping(target = "exportTypeSpecificParameters", expression = "java(objectMapper.convertValue(dto.getExportTypeSpecificParameters(), ExportTypeSpecificParameters.class))") @Mapping(target = "createdDate", ignore = true) @Mapping(target = "createdBy", ignore = true) @Mapping(target = "updatedDate", ignore = true) diff --git a/src/main/java/org/folio/des/service/config/acquisition/ClaimsExportService.java b/src/main/java/org/folio/des/service/config/acquisition/ClaimsExportService.java index 047bba7f..c6acdf78 100644 --- a/src/main/java/org/folio/des/service/config/acquisition/ClaimsExportService.java +++ b/src/main/java/org/folio/des/service/config/acquisition/ClaimsExportService.java @@ -1,6 +1,8 @@ package org.folio.des.service.config.acquisition; import lombok.extern.log4j.Log4j2; + +import org.folio.des.mapper.BaseExportConfigMapper; import org.folio.des.mapper.DefaultExportConfigMapper; import org.folio.des.mapper.ExportConfigMapperResolver; import org.folio.des.domain.dto.ExportConfig; @@ -15,7 +17,7 @@ @Log4j2 public class ClaimsExportService extends BaseExportConfigService { - public ClaimsExportService(ExportConfigRepository repository, DefaultExportConfigMapper defaultExportConfigMapper, + public ClaimsExportService(ExportConfigRepository repository, BaseExportConfigMapper defaultExportConfigMapper, ExportConfigMapperResolver exportConfigMapperResolver, ExportConfigValidatorResolver exportConfigValidatorResolver) { super(repository, defaultExportConfigMapper, exportConfigMapperResolver, exportConfigValidatorResolver); } diff --git a/src/main/java/org/folio/des/service/config/acquisition/EdifactOrdersExportService.java b/src/main/java/org/folio/des/service/config/acquisition/EdifactOrdersExportService.java index 6276d2c9..93bd10b8 100644 --- a/src/main/java/org/folio/des/service/config/acquisition/EdifactOrdersExportService.java +++ b/src/main/java/org/folio/des/service/config/acquisition/EdifactOrdersExportService.java @@ -3,6 +3,7 @@ import java.util.Optional; import java.util.UUID; +import org.folio.des.mapper.BaseExportConfigMapper; import org.folio.des.mapper.DefaultExportConfigMapper; import org.folio.des.mapper.ExportConfigMapperResolver; import org.folio.des.domain.dto.ExportConfig; @@ -19,7 +20,7 @@ public class EdifactOrdersExportService extends BaseExportConfigService { private final ExportJobScheduler exportJobScheduler; - public EdifactOrdersExportService(ExportConfigRepository repository, DefaultExportConfigMapper defaultExportConfigMapper, + public EdifactOrdersExportService(ExportConfigRepository repository, BaseExportConfigMapper defaultExportConfigMapper, ExportConfigMapperResolver exportConfigMapperResolver, ExportConfigValidatorResolver exportConfigValidatorResolver, ExportJobScheduler exportJobScheduler) { super(repository, defaultExportConfigMapper, exportConfigMapperResolver, exportConfigValidatorResolver); diff --git a/src/main/java/org/folio/des/service/config/impl/BaseExportConfigService.java b/src/main/java/org/folio/des/service/config/impl/BaseExportConfigService.java index d782a977..aaf0fd96 100644 --- a/src/main/java/org/folio/des/service/config/impl/BaseExportConfigService.java +++ b/src/main/java/org/folio/des/service/config/impl/BaseExportConfigService.java @@ -6,7 +6,7 @@ import java.util.UUID; import org.folio.de.entity.ExportConfigEntity; -import org.folio.des.mapper.DefaultExportConfigMapper; +import org.folio.des.mapper.BaseExportConfigMapper; import org.folio.des.mapper.ExportConfigMapperResolver; import org.folio.des.domain.dto.ExportConfig; import org.folio.des.domain.dto.ExportConfigCollection; @@ -29,7 +29,7 @@ public class BaseExportConfigService implements ExportConfigService { protected final ExportConfigRepository repository; - protected final DefaultExportConfigMapper defaultExportConfigMapper; + protected final BaseExportConfigMapper exportConfigMapper; protected final ExportConfigMapperResolver exportConfigMapperResolver; protected final ExportConfigValidatorResolver exportConfigValidatorResolver; @@ -40,7 +40,7 @@ public void updateConfig(String configId, ExportConfig exportConfig) { validateIncomingExportConfig(exportConfig); getExportConfigEntityOrThrow(configId); - var entity = defaultExportConfigMapper.toEntity(exportConfig); + var entity = exportConfigMapper.toEntity(exportConfig); repository.save(entity); log.info("updateConfig:: Successfully updated config with id={}", configId); } @@ -51,8 +51,8 @@ public ExportConfig postConfig(ExportConfig exportConfig) { log.info("postConfig:: exportConfig={}", exportConfig); validateIncomingExportConfig(exportConfig); - var entity = defaultExportConfigMapper.toEntity(exportConfig); - repository.save(entity); + var entity = exportConfigMapper.toEntity(exportConfig); + entity = repository.save(entity); log.info("postConfig:: Successfully created config with id={}", exportConfig.getId()); return toDto(entity); @@ -64,7 +64,7 @@ public ExportConfigCollection getConfigCollection(String query, Integer limit) { var page = repository.findByCql(query, PageRequest.of(0, limit)); return new ExportConfigCollection().totalRecords(page.getNumberOfElements()) .configs(page.getContent().stream() - .map(defaultExportConfigMapper::toDto) + .map(exportConfigMapper::toDto) .toList()); } @@ -72,14 +72,14 @@ public ExportConfigCollection getConfigCollection(String query, Integer limit) { public Optional getFirstConfig() { return repository.findAll(PageRequest.of(0, 1)) .getContent().stream() - .map(defaultExportConfigMapper::toDto) + .map(exportConfigMapper::toDto) .findFirst(); } @Override public ExportConfig getConfigById(String configId) { return repository.findById(UUID.fromString(configId)) - .map(defaultExportConfigMapper::toDto) + .map(exportConfigMapper::toDto) .orElseThrow(() -> new NotFoundException(EXPORT_CONFIGURATION_NOT_FOUND.formatted(configId))); } diff --git a/src/main/java/org/folio/des/service/config/impl/BursarFeesFinesExportConfigService.java b/src/main/java/org/folio/des/service/config/impl/BursarFeesFinesExportConfigService.java index 7df15856..c160ad6d 100644 --- a/src/main/java/org/folio/des/service/config/impl/BursarFeesFinesExportConfigService.java +++ b/src/main/java/org/folio/des/service/config/impl/BursarFeesFinesExportConfigService.java @@ -55,11 +55,11 @@ public ExportConfigCollection getConfigCollection(String query, Integer limit) { @Override public Optional getFirstConfig() { - return getFirstConfigGeneric(defaultExportConfigMapper::toDto); + return getFirstConfigGeneric(exportConfigMapper::toDto); } public Optional getFirstConfigLegacy() { - return getFirstConfigGeneric(defaultExportConfigMapper::toDtoLegacy); + return getFirstConfigGeneric(exportConfigMapper::toDtoLegacy); } private Optional getFirstConfigGeneric(Function converter) { From 32216d974d587339bfa747e41ccee92e6a1c8acf Mon Sep 17 00:00:00 2001 From: saba_zedginidze Date: Wed, 29 Oct 2025 16:55:34 +0400 Subject: [PATCH 10/21] [MODEXPS-296] Update migration script --- .../23_10_2025_create_export_config_table.xml | 39 +++++++------------ 1 file changed, 13 insertions(+), 26 deletions(-) diff --git a/src/main/resources/db/changelog/changes/23_10_2025_create_export_config_table.xml b/src/main/resources/db/changelog/changes/23_10_2025_create_export_config_table.xml index ecf301e0..84d62557 100644 --- a/src/main/resources/db/changelog/changes/23_10_2025_create_export_config_table.xml +++ b/src/main/resources/db/changelog/changes/23_10_2025_create_export_config_table.xml @@ -4,12 +4,13 @@ xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.8.xsd"> - + - + + @@ -22,30 +23,16 @@ - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + From 9273e6c4deba5a6cf50a9f169b594510d6268e8e Mon Sep 17 00:00:00 2001 From: saba_zedginidze Date: Wed, 29 Oct 2025 16:56:30 +0400 Subject: [PATCH 11/21] [MODEXPS-296] Remove configuration client from tests --- .../job/JobCommandBuilderResolverTest.java | 3 --- .../org/folio/des/service/JobServiceTest.java | 21 +++++++------------ .../ExportConfigValidatorResolverTest.java | 3 --- 3 files changed, 7 insertions(+), 20 deletions(-) diff --git a/src/test/java/org/folio/des/builder/job/JobCommandBuilderResolverTest.java b/src/test/java/org/folio/des/builder/job/JobCommandBuilderResolverTest.java index d6350810..5010437d 100644 --- a/src/test/java/org/folio/des/builder/job/JobCommandBuilderResolverTest.java +++ b/src/test/java/org/folio/des/builder/job/JobCommandBuilderResolverTest.java @@ -11,7 +11,6 @@ import java.util.UUID; import org.folio.de.entity.Job; -import org.folio.des.client.ConfigurationClient; import org.folio.des.config.JacksonConfiguration; import org.folio.des.config.ServiceConfiguration; import org.folio.des.config.scheduling.QuartzSchemaInitializer; @@ -46,8 +45,6 @@ class JobCommandBuilderResolverTest { @Autowired private JobCommandBuilderResolver resolver; @MockitoBean - private ConfigurationClient client; - @MockitoBean private Scheduler scheduler; @MockitoBean private QuartzSchemaInitializer quartzSchemaInitializer; diff --git a/src/test/java/org/folio/des/service/JobServiceTest.java b/src/test/java/org/folio/des/service/JobServiceTest.java index 23a2d1c8..712a299d 100644 --- a/src/test/java/org/folio/des/service/JobServiceTest.java +++ b/src/test/java/org/folio/des/service/JobServiceTest.java @@ -23,10 +23,8 @@ import org.folio.de.entity.JobCommand; import org.folio.des.CopilotGenerated; import org.folio.des.builder.job.JobCommandBuilderResolver; -import org.folio.des.client.ConfigurationClient; import org.folio.des.client.ExportWorkerClient; import org.folio.des.config.kafka.KafkaService; -import org.folio.des.converter.DefaultModelConfigToExportConfigConverter; import org.folio.des.domain.dto.EdiFtp; import org.folio.des.domain.dto.ExportConfig; import org.folio.des.domain.dto.ExportType; @@ -35,6 +33,7 @@ import org.folio.des.domain.dto.delete_interval.JobDeletionInterval; import org.folio.des.domain.dto.delete_interval.JobDeletionIntervalCollection; import org.folio.des.repository.JobDataExportRepository; +import org.folio.des.service.config.impl.BaseExportConfigService; import org.folio.des.service.impl.JobServiceImpl; import org.folio.des.validator.ExportConfigValidatorResolver; import org.folio.spring.DefaultFolioExecutionContext; @@ -64,8 +63,6 @@ class JobServiceTest { @Mock private JobExecutionService jobExecutionService; @Mock - private ConfigurationClient client; - @Mock private ExportWorkerClient exportWorkerClient; @Mock private FolioModuleMetadata folioModuleMetadata; @@ -74,7 +71,7 @@ class JobServiceTest { @Mock private ExportConfigValidatorResolver exportConfigValidatorResolver; @Mock - private DefaultModelConfigToExportConfigConverter defaultModelConfigToExportConfigConverter; + private BaseExportConfigService defaultExportConfigService; @Mock private KafkaService kafka; @Mock @@ -113,8 +110,8 @@ void testResendJob() { Map> okapiHeaders = new HashMap<>(); okapiHeaders.put(XOkapiHeaders.TENANT, List.of("diku")); var folioExecutionContext = new DefaultFolioExecutionContext(folioModuleMetadata, okapiHeaders); - var jobExecutionService = new JobExecutionService(kafka, exportConfigValidatorResolver, jobCommandBuilderResolver, defaultModelConfigToExportConfigConverter, client, objectMapper); - var internalJobService = new JobServiceImpl(exportWorkerClient, jobExecutionService, repository, folioExecutionContext, null, client, deletionIntervalService); + var jobExecutionService = new JobExecutionService(kafka, exportConfigValidatorResolver, jobCommandBuilderResolver, defaultExportConfigService, objectMapper); + var internalJobService = new JobServiceImpl(exportWorkerClient, jobExecutionService, repository, folioExecutionContext, null, deletionIntervalService, defaultExportConfigService); var config = new ExportConfig(); config.setId(configId.toString()); org.folio.des.domain.dto.Job jobDto = new org.folio.des.domain.dto.Job(); @@ -122,13 +119,9 @@ void testResendJob() { jobDto.setId(UUID.randomUUID()); jobDto.setExportTypeSpecificParameters(exportTypeSpecificParameters); - when(defaultModelConfigToExportConfigConverter.convert(any())).then(invocationOnMock -> { - ExportConfig exportConfig = new ExportConfig(); - exportConfig.setType(ExportType.EDIFACT_ORDERS_EXPORT); - exportConfig.setExportTypeSpecificParameters(exportTypeSpecificParameters); - - return exportConfig; - }); + when(defaultExportConfigService.getConfigById(any())).then(invocationOnMock -> + new ExportConfig().type(ExportType.EDIFACT_ORDERS_EXPORT) + .exportTypeSpecificParameters(exportTypeSpecificParameters)); when(repository.findById(any())).thenReturn(java.util.Optional.of(job)); assertThrows(NotFoundException.class, () -> internalJobService.resendExportedFile(configId)); job.setFileNames(list); diff --git a/src/test/java/org/folio/des/validator/ExportConfigValidatorResolverTest.java b/src/test/java/org/folio/des/validator/ExportConfigValidatorResolverTest.java index aa4e6294..3eaedf2a 100644 --- a/src/test/java/org/folio/des/validator/ExportConfigValidatorResolverTest.java +++ b/src/test/java/org/folio/des/validator/ExportConfigValidatorResolverTest.java @@ -5,7 +5,6 @@ import java.util.Optional; -import org.folio.des.client.ConfigurationClient; import org.folio.des.config.JacksonConfiguration; import org.folio.des.config.ServiceConfiguration; import org.folio.des.config.scheduling.QuartzSchemaInitializer; @@ -28,8 +27,6 @@ class ExportConfigValidatorResolverTest { @Autowired private ExportConfigValidatorResolver resolver; @MockitoBean - private ConfigurationClient client; - @MockitoBean private Scheduler scheduler; @MockitoBean private QuartzSchemaInitializer quartzSchemaInitializer; From 8a1ec75f59f718478dfcc2cc1134280e334106fe Mon Sep 17 00:00:00 2001 From: saba_zedginidze Date: Wed, 29 Oct 2025 16:57:56 +0400 Subject: [PATCH 12/21] [MODEXPS-296] Update and simplify export service tests --- .../acquisition/ClaimsExportServiceTest.java | 174 ++++-------- .../EdifactOrdersExportServiceTest.java | 157 +++++------ .../impl/BaseExportConfigServiceTest.java | 266 +++++++----------- ...ursarFeesFinesExportConfigServiceTest.java | 258 ++++------------- .../java/org/folio/des/support/TestUtils.java | 55 ++++ 5 files changed, 321 insertions(+), 589 deletions(-) create mode 100644 src/test/java/org/folio/des/support/TestUtils.java diff --git a/src/test/java/org/folio/des/service/config/acquisition/ClaimsExportServiceTest.java b/src/test/java/org/folio/des/service/config/acquisition/ClaimsExportServiceTest.java index 72a5f5ca..fd89e199 100644 --- a/src/test/java/org/folio/des/service/config/acquisition/ClaimsExportServiceTest.java +++ b/src/test/java/org/folio/des/service/config/acquisition/ClaimsExportServiceTest.java @@ -1,143 +1,83 @@ package org.folio.des.service.config.acquisition; -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.databind.ObjectMapper; -import org.folio.des.client.ConfigurationClient; +import static org.folio.des.support.TestUtils.setInternalState; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.when; + +import java.util.Map; +import java.util.UUID; + +import org.folio.de.entity.ExportConfigEntity; import org.folio.des.config.JacksonConfiguration; -import org.folio.des.config.ServiceConfiguration; -import org.folio.des.config.scheduling.QuartzSchemaInitializer; -import org.folio.des.converter.DefaultModelConfigToExportConfigConverter; -import org.folio.des.domain.dto.ConfigurationCollection; import org.folio.des.domain.dto.ExportConfig; import org.folio.des.domain.dto.ExportType; import org.folio.des.domain.dto.ExportTypeSpecificParameters; -import org.folio.des.domain.dto.ModelConfiguration; import org.folio.des.domain.dto.VendorEdiOrdersExportConfig; -import org.junit.jupiter.api.Assertions; +import org.folio.des.mapper.DefaultExportConfigMapper; +import org.folio.des.mapper.ExportConfigMapperResolver; +import org.folio.des.mapper.aqcuisition.ClaimsExportConfigMapperImpl; +import org.folio.des.repository.ExportConfigRepository; +import org.folio.des.validator.ExportConfigValidatorResolver; +import org.folio.des.validator.acquisition.ClaimsExportParametersValidator; +import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.Mockito; -import org.quartz.Scheduler; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.autoconfigure.EnableAutoConfiguration; -import org.springframework.boot.autoconfigure.batch.BatchAutoConfiguration; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.test.context.bean.override.mockito.MockitoBean; - -import java.util.UUID; +import org.mockito.junit.jupiter.MockitoExtension; -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.ArgumentMatchers.eq; - -@SpringBootTest(classes = { DefaultModelConfigToExportConfigConverter.class, JacksonConfiguration.class, ServiceConfiguration.class }) -@EnableAutoConfiguration(exclude = { BatchAutoConfiguration.class }) +@ExtendWith(MockitoExtension.class) class ClaimsExportServiceTest { - public static final String EMPTY_CONFIG_RESPONSE = "{\"configs\": [], \"totalRecords\": 0}"; - - @Autowired + private static final ExportConfig CLAIMS_EXPORT_CONFIG = new ExportConfig() + .id(UUID.randomUUID().toString()) + .type(ExportType.CLAIMS) + .exportTypeSpecificParameters(new ExportTypeSpecificParameters() + .vendorEdiOrdersExportConfig(new VendorEdiOrdersExportConfig() + .configName("name") + .vendorId(UUID.randomUUID()) + .integrationType(VendorEdiOrdersExportConfig.IntegrationTypeEnum.CLAIMING) + .transmissionMethod(VendorEdiOrdersExportConfig.TransmissionMethodEnum.FILE_DOWNLOAD) + .fileFormat(VendorEdiOrdersExportConfig.FileFormatEnum.CSV))); + + private ExportConfigRepository repository; private ClaimsExportService service; - @MockitoBean - private ConfigurationClient client; - @Autowired - private ObjectMapper objectMapper; - @MockitoBean - private Scheduler scheduler; - @MockitoBean - private QuartzSchemaInitializer quartzSchemaInitializer; - @Test - @DisplayName("Set new configuration") - void addConfig() throws JsonProcessingException { - var edifactOrdersExportConfig = new ExportConfig(); - edifactOrdersExportConfig.setId(UUID.randomUUID().toString()); - - var vendorEdiOrdersExportConfig = new VendorEdiOrdersExportConfig(); - vendorEdiOrdersExportConfig.setConfigName("name"); - vendorEdiOrdersExportConfig.vendorId(UUID.randomUUID()); - vendorEdiOrdersExportConfig.integrationType(VendorEdiOrdersExportConfig.IntegrationTypeEnum.CLAIMING); - vendorEdiOrdersExportConfig.transmissionMethod(VendorEdiOrdersExportConfig.TransmissionMethodEnum.FILE_DOWNLOAD); - vendorEdiOrdersExportConfig.fileFormat(VendorEdiOrdersExportConfig.FileFormatEnum.CSV); - - var parameters = new ExportTypeSpecificParameters(); - parameters.vendorEdiOrdersExportConfig(vendorEdiOrdersExportConfig); - edifactOrdersExportConfig.setType(ExportType.CLAIMS); - edifactOrdersExportConfig.exportTypeSpecificParameters(parameters); - - var mockResponse = mockResponse(edifactOrdersExportConfig); - Mockito.when(client.postConfiguration(any())).thenReturn(mockResponse); - - var response = service.postConfig(edifactOrdersExportConfig); - Assertions.assertAll( - () -> assertNotNull(response.getId()), - () -> assertEquals(mockResponse.getConfigName(), response.getConfigName()), - () -> assertEquals(mockResponse.getModule(), response.getModule()), - () -> assertEquals(mockResponse.getDescription(), response.getDescription()), - () -> assertEquals(mockResponse.getDefault(), response.getDefault()), - () -> assertEquals(mockResponse.getEnabled(), response.getEnabled()) - ); + @BeforeEach + void setUp() { + var validatorKey = "%s-%s".formatted(ExportType.CLAIMS, ExportTypeSpecificParameters.class.getName()); + var validator = new ClaimsExportParametersValidator(); + var exportConfigValidatorResolver = new ExportConfigValidatorResolver(Map.of(validatorKey, validator)); + + var defaultExportConfigMapper = new DefaultExportConfigMapper(); + var claimsExportConfigMapper = new ClaimsExportConfigMapperImpl(); + var exportConfigMapperResolver = new ExportConfigMapperResolver(Map.of(ExportType.CLAIMS, claimsExportConfigMapper), defaultExportConfigMapper); + setInternalState(claimsExportConfigMapper, "objectMapper", new JacksonConfiguration().get()); + setInternalState(claimsExportConfigMapper, "validator", validator); + claimsExportConfigMapper.init(); + + repository = Mockito.mock(ExportConfigRepository.class); + service = new ClaimsExportService(repository, claimsExportConfigMapper, exportConfigMapperResolver, exportConfigValidatorResolver); } @Test - @DisplayName("Set existing configuration") - void updateConfig() throws JsonProcessingException { - var configId = UUID.randomUUID().toString(); - - var edifactOrdersExportConfig = new ExportConfig(); - edifactOrdersExportConfig.setId(configId); - - var vendorEdiOrdersExportConfig = new VendorEdiOrdersExportConfig(); - vendorEdiOrdersExportConfig.setConfigName("name"); - vendorEdiOrdersExportConfig.vendorId(UUID.randomUUID()); - vendorEdiOrdersExportConfig.integrationType(VendorEdiOrdersExportConfig.IntegrationTypeEnum.CLAIMING); - vendorEdiOrdersExportConfig.transmissionMethod(VendorEdiOrdersExportConfig.TransmissionMethodEnum.FILE_DOWNLOAD); - vendorEdiOrdersExportConfig.fileFormat(VendorEdiOrdersExportConfig.FileFormatEnum.CSV); - - var parameters = new ExportTypeSpecificParameters(); - parameters.vendorEdiOrdersExportConfig(vendorEdiOrdersExportConfig); - edifactOrdersExportConfig.setType(ExportType.CLAIMS); - edifactOrdersExportConfig.exportTypeSpecificParameters(parameters); - - var mockResponse = mockResponse(edifactOrdersExportConfig); - Mockito.when(client.postConfiguration(any())).thenReturn(mockResponse); - Mockito.doNothing().when(client).putConfiguration(any(), any()); + @DisplayName("Set new configuration") + void testPostConfig() { + when(repository.save(any())).thenAnswer(i -> i.getArguments()[0]); - var postResponse = service.postConfig(edifactOrdersExportConfig); - Assertions.assertAll( - () -> assertNotNull(postResponse.getId()), - () -> assertEquals(mockResponse.getConfigName(), postResponse.getConfigName()), - () -> assertEquals(mockResponse.getModule(), postResponse.getModule()), - () -> assertEquals(mockResponse.getDescription(), postResponse.getDescription()), - () -> assertEquals(mockResponse.getDefault(), postResponse.getDefault()), - () -> assertEquals(mockResponse.getEnabled(), postResponse.getEnabled()) - ); + var response = service.postConfig(CLAIMS_EXPORT_CONFIG); - vendorEdiOrdersExportConfig.setConfigName("test_claims_config_update"); - service.updateConfig(configId, edifactOrdersExportConfig); + assertEquals(CLAIMS_EXPORT_CONFIG, response); } @Test - @DisplayName("Config is not set") - void noConfig() throws JsonProcessingException { - final var mockedResponse = objectMapper.readValue(EMPTY_CONFIG_RESPONSE, ConfigurationCollection.class); - Mockito.when(client.getConfigurations(any(), eq(1))).thenReturn(mockedResponse); - var config = service.getFirstConfig(); - assertTrue(config.isEmpty()); - } - - private ModelConfiguration mockResponse(ExportConfig edifactOrdersExportConfig) throws JsonProcessingException { - var mockResponse = new ModelConfiguration(); - mockResponse.setId(UUID.randomUUID().toString()); - mockResponse.setModule("test_module"); - mockResponse.setConfigName("test_claims_config"); - mockResponse.setDescription("test description"); - mockResponse.setEnabled(true); - mockResponse.setDefault(true); - mockResponse.setValue(objectMapper.writeValueAsString(edifactOrdersExportConfig)); + @DisplayName("Update configuration") + void testUpdateConfig() { + when(repository.findById(UUID.fromString(CLAIMS_EXPORT_CONFIG.getId()))) + .thenReturn(java.util.Optional.of(new ExportConfigEntity())); - return mockResponse; + service.updateConfig(CLAIMS_EXPORT_CONFIG.getId(), CLAIMS_EXPORT_CONFIG); } + } diff --git a/src/test/java/org/folio/des/service/config/acquisition/EdifactOrdersExportServiceTest.java b/src/test/java/org/folio/des/service/config/acquisition/EdifactOrdersExportServiceTest.java index dda5fe1d..fc849695 100644 --- a/src/test/java/org/folio/des/service/config/acquisition/EdifactOrdersExportServiceTest.java +++ b/src/test/java/org/folio/des/service/config/acquisition/EdifactOrdersExportServiceTest.java @@ -1,126 +1,97 @@ package org.folio.des.service.config.acquisition; +import static org.folio.des.support.TestUtils.setInternalState; 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.ArgumentMatchers.eq; +import static org.mockito.Mockito.times; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; +import java.util.Map; import java.util.UUID; -import org.folio.des.client.ConfigurationClient; +import org.folio.de.entity.ExportConfigEntity; import org.folio.des.config.JacksonConfiguration; -import org.folio.des.config.ServiceConfiguration; -import org.folio.des.config.scheduling.QuartzSchemaInitializer; -import org.folio.des.converter.DefaultModelConfigToExportConfigConverter; -import org.folio.des.domain.dto.ConfigurationCollection; import org.folio.des.domain.dto.EdiSchedule; import org.folio.des.domain.dto.ExportConfig; import org.folio.des.domain.dto.ExportType; import org.folio.des.domain.dto.ExportTypeSpecificParameters; -import org.folio.des.domain.dto.ModelConfiguration; import org.folio.des.domain.dto.ScheduleParameters; import org.folio.des.domain.dto.VendorEdiOrdersExportConfig; +import org.folio.des.mapper.DefaultExportConfigMapper; +import org.folio.des.mapper.ExportConfigMapperResolver; +import org.folio.des.mapper.aqcuisition.EdifactExportConfigMapperImpl; +import org.folio.des.repository.ExportConfigRepository; import org.folio.des.scheduling.ExportJobScheduler; -import org.junit.jupiter.api.Assertions; +import org.folio.des.validator.ExportConfigValidatorResolver; +import org.folio.des.validator.acquisition.EdifactOrdersExportParametersValidator; +import org.folio.des.validator.acquisition.EdifactOrdersScheduledParamsValidator; +import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.Mockito; -import org.quartz.Scheduler; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Qualifier; -import org.springframework.boot.autoconfigure.EnableAutoConfiguration; -import org.springframework.boot.autoconfigure.batch.BatchAutoConfiguration; -import org.springframework.boot.test.context.SpringBootTest; - -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.databind.ObjectMapper; -import org.springframework.test.context.bean.override.mockito.MockitoBean; - -@SpringBootTest(classes = {DefaultModelConfigToExportConfigConverter.class, JacksonConfiguration.class, - ServiceConfiguration.class}) -@EnableAutoConfiguration(exclude = {BatchAutoConfiguration.class}) -class EdifactOrdersExportServiceTest { +import org.mockito.junit.jupiter.MockitoExtension; - public static final String EMPTY_CONFIG_RESPONSE = "{\"configs\": [], \"totalRecords\": 0}"; +@ExtendWith(MockitoExtension.class) +class EdifactOrdersExportServiceTest { - @Autowired + private static final ExportConfig EDIFACT_EXPORT_CONFIG = new ExportConfig() + .id(UUID.randomUUID().toString()) + .type(ExportType.EDIFACT_ORDERS_EXPORT) + .exportTypeSpecificParameters(new ExportTypeSpecificParameters() + .vendorEdiOrdersExportConfig(new VendorEdiOrdersExportConfig() + .configName("edi_test_config") + .vendorId(UUID.fromString("046b6c7f-0b8a-43b9-b35d-6489e6daee91")) + .ediSchedule(new EdiSchedule() + .enableScheduledExport(true) + .scheduleParameters(new ScheduleParameters() + .schedulePeriod(ScheduleParameters.SchedulePeriodEnum.HOUR) + .scheduleFrequency(1) + .scheduleTime("15:00:00"))))); + + private ExportConfigRepository repository; + private ExportJobScheduler edifactOrdersExportJobScheduler; private EdifactOrdersExportService service; - @MockitoBean - private ConfigurationClient client; - @Autowired - private ObjectMapper objectMapper; - @MockitoBean - @Qualifier("edifactOrdersExportJobScheduler") - private ExportJobScheduler exportJobScheduler; - @MockitoBean - private Scheduler scheduler; - @MockitoBean - private QuartzSchemaInitializer quartzSchemaInitializer; + @BeforeEach + void setUp() { + var validatorKey = "%s-%s".formatted(ExportType.EDIFACT_ORDERS_EXPORT, ExportTypeSpecificParameters.class.getName()); + var validator = new EdifactOrdersExportParametersValidator(new EdifactOrdersScheduledParamsValidator()); + var exportConfigValidatorResolver = new ExportConfigValidatorResolver(Map.of(validatorKey, validator)); + + var defaultExportConfigMapper = new DefaultExportConfigMapper(); + var edifactExportConfigMapper = new EdifactExportConfigMapperImpl(); + var exportConfigMapperResolver = new ExportConfigMapperResolver(Map.of(ExportType.EDIFACT_ORDERS_EXPORT, edifactExportConfigMapper), defaultExportConfigMapper); + setInternalState(edifactExportConfigMapper, "objectMapper", new JacksonConfiguration().get()); + setInternalState(edifactExportConfigMapper, "validator", validator); + edifactExportConfigMapper.init(); + + repository = Mockito.mock(ExportConfigRepository.class); + edifactOrdersExportJobScheduler = Mockito.mock(ExportJobScheduler.class); + service = new EdifactOrdersExportService(repository, edifactExportConfigMapper, exportConfigMapperResolver, exportConfigValidatorResolver, edifactOrdersExportJobScheduler); + } @Test @DisplayName("Set new configuration") - void addConfig() throws JsonProcessingException { - ExportConfig edifactOrdersExportConfig = new ExportConfig(); - edifactOrdersExportConfig.setId(UUID.randomUUID().toString()); - ExportTypeSpecificParameters parameters = new ExportTypeSpecificParameters(); - VendorEdiOrdersExportConfig vendorEdiOrdersExportConfig = new VendorEdiOrdersExportConfig(); - EdiSchedule ediSchedule = new EdiSchedule(); - ScheduleParameters scheduleParameters = new ScheduleParameters(); - - scheduleParameters.scheduleFrequency(1); - scheduleParameters.schedulePeriod(ScheduleParameters.SchedulePeriodEnum.HOUR); - scheduleParameters.scheduleTime("15:00:00"); - - ediSchedule.enableScheduledExport(true); - ediSchedule.scheduleParameters(scheduleParameters); - - vendorEdiOrdersExportConfig.setConfigName("edi_test_config"); - vendorEdiOrdersExportConfig.vendorId(UUID.fromString("046b6c7f-0b8a-43b9-b35d-6489e6daee91")); - vendorEdiOrdersExportConfig.ediSchedule(ediSchedule); - - - parameters.vendorEdiOrdersExportConfig(vendorEdiOrdersExportConfig); - edifactOrdersExportConfig.setType(ExportType.EDIFACT_ORDERS_EXPORT); - edifactOrdersExportConfig.exportTypeSpecificParameters(parameters); - ModelConfiguration mockResponse = mockResponse(edifactOrdersExportConfig); - Mockito.when(client.postConfiguration(any())).thenReturn(mockResponse); - - var response = service.postConfig(edifactOrdersExportConfig); - - Assertions.assertAll( - () -> assertNotNull(response.getId()), - () -> assertEquals(mockResponse.getConfigName(), response.getConfigName()), - () -> assertEquals(mockResponse.getModule(), response.getModule()), - () -> assertEquals(mockResponse.getDescription(), response.getDescription()), - () -> assertEquals(mockResponse.getDefault(), response.getDefault()), - () -> assertEquals(mockResponse.getEnabled(), response.getEnabled()) - ); + void testPostConfig() { + when(repository.save(any())).thenAnswer(i -> i.getArguments()[0]); + + var response = service.postConfig(EDIFACT_EXPORT_CONFIG); + + assertEquals(EDIFACT_EXPORT_CONFIG, response); + verify(edifactOrdersExportJobScheduler, times(1)).scheduleExportJob(EDIFACT_EXPORT_CONFIG); } @Test - @DisplayName("Config is not set") - void noConfig() throws JsonProcessingException { - final ConfigurationCollection mockedResponse = objectMapper.readValue(EMPTY_CONFIG_RESPONSE, ConfigurationCollection.class); - Mockito.when(client.getConfigurations(any(), eq(1))).thenReturn(mockedResponse); - - var config = service.getFirstConfig(); + @DisplayName("Update configuration") + void testUpdateConfig() { + when(repository.findById(UUID.fromString(EDIFACT_EXPORT_CONFIG.getId()))) + .thenReturn(java.util.Optional.of(new ExportConfigEntity())); - assertTrue(config.isEmpty()); - } + service.updateConfig(EDIFACT_EXPORT_CONFIG.getId(), EDIFACT_EXPORT_CONFIG); - private ModelConfiguration mockResponse(ExportConfig edifactOrdersExportConfig) - throws JsonProcessingException { - var mockResponse = new ModelConfiguration(); - mockResponse.setId(UUID.randomUUID().toString()); - mockResponse.setModule("test_module"); - mockResponse.setConfigName("edifact_orders_Config"); - mockResponse.setDescription("test description"); - mockResponse.setEnabled(true); - mockResponse.setDefault(true); - mockResponse.setValue(objectMapper.writeValueAsString(edifactOrdersExportConfig)); - return mockResponse; + verify(edifactOrdersExportJobScheduler, times(1)).scheduleExportJob(EDIFACT_EXPORT_CONFIG); } } diff --git a/src/test/java/org/folio/des/service/config/impl/BaseExportConfigServiceTest.java b/src/test/java/org/folio/des/service/config/impl/BaseExportConfigServiceTest.java index 5e679f08..74b1eb98 100644 --- a/src/test/java/org/folio/des/service/config/impl/BaseExportConfigServiceTest.java +++ b/src/test/java/org/folio/des/service/config/impl/BaseExportConfigServiceTest.java @@ -2,233 +2,163 @@ import static org.folio.des.service.config.ExportConfigConstants.DEFAULT_CONFIG_NAME; import static org.folio.des.service.config.ExportConfigConstants.DEFAULT_CONFIG_QUERY; +import static org.folio.des.support.TestUtils.getBursarExportConfig; +import static org.folio.des.support.TestUtils.setInternalState; import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertNotNull; import static org.junit.jupiter.api.Assertions.assertThrows; import static org.junit.jupiter.api.Assertions.assertTrue; import static org.mockito.ArgumentMatchers.any; -import static org.mockito.ArgumentMatchers.eq; -import static org.mockito.Mockito.doNothing; +import static org.mockito.Mockito.times; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.databind.ObjectMapper; -import java.util.ArrayList; import java.util.List; +import java.util.Map; import java.util.UUID; -import org.folio.des.client.ConfigurationClient; + +import org.folio.de.entity.ExportConfigEntity; import org.folio.des.config.JacksonConfiguration; -import org.folio.des.config.ServiceConfiguration; -import org.folio.des.config.scheduling.QuartzSchemaInitializer; -import org.folio.des.converter.DefaultModelConfigToExportConfigConverter; -import org.folio.des.domain.dto.BursarExportFilter; -import org.folio.des.domain.dto.BursarExportFilterAge; -import org.folio.des.domain.dto.BursarExportFilterCondition; -import org.folio.des.domain.dto.BursarExportFilterCondition.OperationEnum; -import org.folio.des.domain.dto.BursarExportFilterPatronGroup; -import org.folio.des.domain.dto.BursarExportJob; -import org.folio.des.domain.dto.ConfigurationCollection; import org.folio.des.domain.dto.ExportConfig; +import org.folio.des.domain.dto.ExportType; import org.folio.des.domain.dto.ExportTypeSpecificParameters; -import org.folio.des.domain.dto.ModelConfiguration; -import org.folio.des.scheduling.bursar.BursarExportScheduler; +import org.folio.des.mapper.DefaultExportConfigMapper; +import org.folio.des.mapper.ExportConfigMapperResolver; +import org.folio.des.repository.ExportConfigRepository; +import org.folio.des.validator.BursarFeesFinesExportParametersValidator; +import org.folio.des.validator.ExportConfigValidatorResolver; import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.Mockito; -import org.quartz.Scheduler; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.autoconfigure.EnableAutoConfiguration; -import org.springframework.boot.autoconfigure.batch.BatchAutoConfiguration; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.test.context.bean.override.mockito.MockitoBean; - -@SpringBootTest(classes = {DefaultModelConfigToExportConfigConverter.class, JacksonConfiguration.class, - ServiceConfiguration.class}) -@EnableAutoConfiguration(exclude = {BatchAutoConfiguration.class}) +import org.mockito.junit.jupiter.MockitoExtension; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.PageImpl; +import org.springframework.data.domain.Pageable; + +@ExtendWith(MockitoExtension.class) class BaseExportConfigServiceTest { - public static final String CONFIG_RESPONSE = - """ - { - "configs": [ - { - "id": "d855141f-aa62-40bb-a34b-da986b35d6d4", - "module": "mod-bursar-export", - "configName": "query_parameters", - "description": "for launch job", - "default": true, - "enabled": true, - "value": "{\\"id\\":\\"6c163f99-9df5-419d-9174-da638a1c76ed\\",\\"schedulePeriod\\":\\"DAY\\",\\"weekDays\\":[\\"FRIDAY\\",\\"MONDAY\\"]}", - "metadata": { - "createdDate": "2021-02-04T05:25:19.580+00:00", - "createdByUserId": "1d3b58cb-07b5-5fcd-8a2a-3ce06a0eb90f", - "updatedDate": "2021-02-04T06:06:18.875+00:00", - "updatedByUserId": "1d3b58cb-07b5-5fcd-8a2a-3ce06a0eb90f" - } - } - ], - "totalRecords": 1, - "resultInfo": { - "totalRecords": 1, - "facets": [], - "diagnostics": [] - } - } - """; - public static final String EMPTY_CONFIG_RESPONSE = "{\"configs\": [], \"totalRecords\": 0}"; - - @Autowired - private BursarFeesFinesExportConfigService service; - @Autowired - private DefaultModelConfigToExportConfigConverter defaultModelConfigToExportConfigConverter; - @Autowired - private ObjectMapper objectMapper; - @MockitoBean - private ConfigurationClient client; - @MockitoBean - private Scheduler scheduler; - @MockitoBean - private QuartzSchemaInitializer quartzSchemaInitializer; - @MockitoBean - private BursarExportScheduler bursarExportScheduler; + private static final ExportConfigEntity CONFIG_ENTITY = new ExportConfigEntity() + .setId(UUID.fromString("6c163f99-9df5-419d-9174-da638a1c76ed")) + .setSchedulePeriod("DAY") + .setWeekDays(List.of("FRIDAY", "MONDAY")); + + private ExportConfigRepository repository; + private BaseExportConfigService service; + + @BeforeEach + void setUp() { + var validatorKey = "%s-%s".formatted(ExportType.BURSAR_FEES_FINES, ExportTypeSpecificParameters.class.getName()); + var exportConfigValidatorResolver = new ExportConfigValidatorResolver(Map.of(validatorKey, new BursarFeesFinesExportParametersValidator())); + + var defaultExportConfigMapper = new DefaultExportConfigMapper(); + var exportConfigMapperResolver = new ExportConfigMapperResolver(Map.of(), defaultExportConfigMapper); + setInternalState(defaultExportConfigMapper, "objectMapper", new JacksonConfiguration().get()); + defaultExportConfigMapper.init(); + + repository = Mockito.mock(ExportConfigRepository.class); + service = new BaseExportConfigService(repository, defaultExportConfigMapper, exportConfigMapperResolver, exportConfigValidatorResolver); + } @Test @DisplayName("Set new configuration") - void addConfig() throws JsonProcessingException { - ExportConfig bursarExportConfig = new ExportConfig(); - ExportTypeSpecificParameters parameters = new ExportTypeSpecificParameters(); - - BursarExportJob bursarFeeFines = new BursarExportJob(); - BursarExportFilterAge bursarExportFilterAge = new BursarExportFilterAge(); - bursarExportFilterAge.setNumDays(1); - BursarExportFilterPatronGroup bursarExportFilterPatronGroup = new BursarExportFilterPatronGroup(); - bursarExportFilterPatronGroup.setPatronGroupId(UUID.fromString("0000-00-00-00-000000")); - List bursarExportFilters = new ArrayList<>(); - bursarExportFilters.add(bursarExportFilterPatronGroup); - bursarExportFilters.add(bursarExportFilterAge); - BursarExportFilterCondition bursarExportFilterCondition = new BursarExportFilterCondition(); - bursarExportFilterCondition.setCriteria(bursarExportFilters); - bursarExportFilterCondition.setOperation(OperationEnum.AND); - bursarFeeFines.setFilter(bursarExportFilterCondition); - parameters.setBursarFeeFines(bursarFeeFines); - bursarExportConfig.exportTypeSpecificParameters(parameters); - ModelConfiguration mockResponse = mockResponse(bursarExportConfig); - Mockito.when(client.postConfiguration(any())).thenReturn(mockResponse); - doNothing().when(bursarExportScheduler).scheduleBursarJob(any()); - - var response = service.postConfig(bursarExportConfig); + void testPostConfig() { + var exportConfig = getBursarExportConfig(); + when(repository.save(any())).thenAnswer(i -> i.getArguments()[0]); - Assertions.assertAll( - () -> assertNotNull(response.getId()), - () -> assertEquals(mockResponse.getConfigName(), response.getConfigName()), - () -> assertEquals(mockResponse.getModule(), response.getModule()), - () -> assertEquals(mockResponse.getDescription(), response.getDescription()), - () -> assertEquals(mockResponse.getDefault(), response.getDefault()), - () -> assertEquals(mockResponse.getEnabled(), response.getEnabled()) - ); + var response = service.postConfig(exportConfig); + + assertEquals(exportConfig, response); } @Test @DisplayName("Should not create new configuration without specific parameters") - void shouldNorCreateConfigurationAndThroughExceptionIfSpecificParametersIsNotSet() throws JsonProcessingException { - ExportConfig bursarExportConfig = new ExportConfig(); - ModelConfiguration mockResponse = mockResponse(bursarExportConfig); - Mockito.when(client.postConfiguration(any())).thenReturn(mockResponse); + void testPostConfigWithoutSpecificParameters() { + var bursarExportConfig = new ExportConfig(); + + assertThrows(IllegalStateException.class, () -> service.postConfig(bursarExportConfig)); - assertThrows(IllegalStateException.class, () -> service.postConfig(bursarExportConfig)); - Mockito.verify(client, Mockito.times(0)).postConfiguration(any()); + verify(repository, times(0)).save(any()); } @Test - @DisplayName("Should not create new configuration without bur sar parameters") - void shouldNorCreateConfigurationAndThroughExceptionIfBursarConfigIsNotSet() throws JsonProcessingException { - ExportConfig bursarExportConfig = new ExportConfig(); - ExportTypeSpecificParameters parameters = new ExportTypeSpecificParameters(); - bursarExportConfig.setExportTypeSpecificParameters(parameters); - ModelConfiguration mockResponse = mockResponse(bursarExportConfig); - Mockito.when(client.postConfiguration(any())).thenReturn(mockResponse); + @DisplayName("Should not create new configuration without bursar parameters") + void testPostConfigWithoutBursarParameters() { + var bursarExportConfig = new ExportConfig().exportTypeSpecificParameters(new ExportTypeSpecificParameters()); assertThrows(IllegalArgumentException.class, () -> service.postConfig(bursarExportConfig)); - Mockito.verify(client, Mockito.times(0)).postConfiguration(any()); + + verify(repository, times(0)).save(any()); } - private ModelConfiguration mockResponse(ExportConfig bursarExportConfig) - throws JsonProcessingException { - var mockResponse = new ModelConfiguration(); - mockResponse.setId(UUID.randomUUID().toString()); - mockResponse.setModule("test_module"); - mockResponse.setConfigName("bursar_config"); - mockResponse.setDescription("test description"); - mockResponse.setEnabled(true); - mockResponse.setDefault(true); - mockResponse.setValue(objectMapper.writeValueAsString(bursarExportConfig)); - return mockResponse; + @Test + @DisplayName("Update configuration") + void testUpdateConfig() { + var exportConfig = getBursarExportConfig(); + + when(repository.findById(UUID.fromString(exportConfig.getId()))) + .thenReturn(java.util.Optional.of(new ExportConfigEntity())); + + service.updateConfig(exportConfig.getId(), exportConfig); } @Test - @DisplayName("Config is not set") - void noConfig() throws JsonProcessingException { - final ConfigurationCollection mockedResponse = objectMapper.readValue(EMPTY_CONFIG_RESPONSE, ConfigurationCollection.class); - Mockito.when(client.getConfigurations(any(), eq(1))).thenReturn(mockedResponse); + @DisplayName("Config exists and parsed correctly") + void testGetFirstConfig() { + when(repository.findAll(any(Pageable.class))).thenReturn(new PageImpl<>(List.of(CONFIG_ENTITY))); var config = service.getFirstConfig(); - assertTrue(config.isEmpty()); + assertTrue(config.isPresent()); + var exportConfig = config.get(); + Assertions.assertAll( + () -> assertEquals("6c163f99-9df5-419d-9174-da638a1c76ed", exportConfig.getId()), + () -> assertEquals(ExportConfig.SchedulePeriodEnum.DAY, exportConfig.getSchedulePeriod()), + () -> assertEquals(List.of(ExportConfig.WeekDaysEnum.FRIDAY, ExportConfig.WeekDaysEnum.MONDAY), exportConfig.getWeekDays())); } @Test - @DisplayName("Fetch empty config collection") - void fetchEmptyConfigCollection() throws JsonProcessingException { - final ConfigurationCollection mockedResponse = objectMapper.readValue(EMPTY_CONFIG_RESPONSE, ConfigurationCollection.class); - Mockito.when(client.getConfigurations(any(), eq(1))).thenReturn(mockedResponse); + @DisplayName("Config is not set") + void testGetFirstConfigEmpty() { + when(repository.findAll(any(Pageable.class))).thenReturn(Page.empty()); - var query = String.format(DEFAULT_CONFIG_QUERY, DEFAULT_CONFIG_NAME); - var config = service.getConfigCollection(query, 1); + var config = service.getFirstConfig(); - Assertions.assertAll( - () -> assertEquals(0, config.getTotalRecords()), - () -> assertTrue(config.getConfigs().isEmpty())); + assertTrue(config.isEmpty()); } @Test @DisplayName("Fetch config collection") - void fetchConfigCollection() throws JsonProcessingException { - final ConfigurationCollection mockedResponse = objectMapper.readValue(CONFIG_RESPONSE, ConfigurationCollection.class); - Mockito.when(client.getConfigurations(any(), eq(1))).thenReturn(mockedResponse); + void testGetConfigCollection() { + when(repository.findByCql(any(), any())).thenReturn(new PageImpl<>(List.of(CONFIG_ENTITY))); var query = String.format(DEFAULT_CONFIG_QUERY, DEFAULT_CONFIG_NAME); var config = service.getConfigCollection(query, 1); Assertions.assertAll( - () -> assertEquals(1, config.getTotalRecords()), - () -> assertEquals(1, config.getConfigs().size())); + () -> assertEquals(1, config.getTotalRecords()), + () -> assertEquals(1, config.getConfigs().size())); - var exportConfig = config.getConfigs().get(0); + var exportConfig = config.getConfigs().getFirst(); Assertions.assertAll( - () -> assertEquals("d855141f-aa62-40bb-a34b-da986b35d6d4", exportConfig.getId()), - () -> assertEquals(ExportConfig.SchedulePeriodEnum.DAY, exportConfig.getSchedulePeriod()), - () -> - assertEquals( - List.of(ExportConfig.WeekDaysEnum.FRIDAY, ExportConfig.WeekDaysEnum.MONDAY), exportConfig.getWeekDays())); + () -> assertEquals("6c163f99-9df5-419d-9174-da638a1c76ed", exportConfig.getId()), + () -> assertEquals(ExportConfig.SchedulePeriodEnum.DAY, exportConfig.getSchedulePeriod()), + () -> assertEquals(List.of(ExportConfig.WeekDaysEnum.FRIDAY, ExportConfig.WeekDaysEnum.MONDAY), exportConfig.getWeekDays())); } @Test - @DisplayName("Config exists and parsed correctly") - void getConfig() throws JsonProcessingException { - final ConfigurationCollection mockedResponse = objectMapper.readValue(CONFIG_RESPONSE, ConfigurationCollection.class); - Mockito.when(client.getConfigurations(any(), eq(1))).thenReturn(mockedResponse); - - var config = service.getFirstConfig(); - - assertTrue(config.isPresent()); + @DisplayName("Fetch empty config collection") + void testGetConfigCollectionEmpty() { + when(repository.findByCql(any(), any())).thenReturn(Page.empty()); - final ExportConfig exportConfig = config.get(); + var query = String.format(DEFAULT_CONFIG_QUERY, DEFAULT_CONFIG_NAME); + var config = service.getConfigCollection(query, 1); Assertions.assertAll( - () -> assertEquals("d855141f-aa62-40bb-a34b-da986b35d6d4", exportConfig.getId()), - () -> assertEquals(ExportConfig.SchedulePeriodEnum.DAY, exportConfig.getSchedulePeriod()), - () -> - assertEquals( - List.of(ExportConfig.WeekDaysEnum.FRIDAY, ExportConfig.WeekDaysEnum.MONDAY), exportConfig.getWeekDays())); + () -> assertEquals(0, config.getTotalRecords()), + () -> assertTrue(config.getConfigs().isEmpty())); } + } diff --git a/src/test/java/org/folio/des/service/config/impl/BursarFeesFinesExportConfigServiceTest.java b/src/test/java/org/folio/des/service/config/impl/BursarFeesFinesExportConfigServiceTest.java index 2ea5b321..205217f5 100644 --- a/src/test/java/org/folio/des/service/config/impl/BursarFeesFinesExportConfigServiceTest.java +++ b/src/test/java/org/folio/des/service/config/impl/BursarFeesFinesExportConfigServiceTest.java @@ -1,243 +1,79 @@ package org.folio.des.service.config.impl; -import static org.folio.des.service.config.ExportConfigConstants.DEFAULT_CONFIG_NAME; -import static org.folio.des.service.config.ExportConfigConstants.DEFAULT_CONFIG_QUERY; +import static org.folio.des.support.TestUtils.getBursarExportConfig; +import static org.folio.des.support.TestUtils.setInternalState; import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertNotNull; -import static org.junit.jupiter.api.Assertions.assertThrows; -import static org.junit.jupiter.api.Assertions.assertTrue; import static org.mockito.ArgumentMatchers.any; -import static org.mockito.ArgumentMatchers.eq; -import static org.mockito.Mockito.doNothing; +import static org.mockito.Mockito.times; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.databind.ObjectMapper; -import java.util.ArrayList; -import java.util.List; +import java.util.Map; import java.util.UUID; -import org.folio.des.client.ConfigurationClient; + +import org.folio.de.entity.ExportConfigEntity; import org.folio.des.config.JacksonConfiguration; -import org.folio.des.config.ServiceConfiguration; -import org.folio.des.config.scheduling.QuartzSchemaInitializer; -import org.folio.des.converter.DefaultModelConfigToExportConfigConverter; -import org.folio.des.domain.dto.BursarExportFilter; -import org.folio.des.domain.dto.BursarExportFilterAge; -import org.folio.des.domain.dto.BursarExportFilterCondition; -import org.folio.des.domain.dto.BursarExportFilterCondition.OperationEnum; -import org.folio.des.domain.dto.BursarExportFilterPatronGroup; -import org.folio.des.domain.dto.BursarExportJob; -import org.folio.des.domain.dto.ConfigurationCollection; -import org.folio.des.domain.dto.ExportConfig; +import org.folio.des.domain.dto.ExportType; import org.folio.des.domain.dto.ExportTypeSpecificParameters; -import org.folio.des.domain.dto.ModelConfiguration; +import org.folio.des.mapper.DefaultExportConfigMapper; +import org.folio.des.mapper.ExportConfigMapperResolver; +import org.folio.des.repository.ExportConfigRepository; import org.folio.des.scheduling.bursar.BursarExportScheduler; -import org.junit.jupiter.api.Assertions; +import org.folio.des.validator.BursarFeesFinesExportParametersValidator; +import org.folio.des.validator.ExportConfigValidatorResolver; +import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.Mockito; -import org.quartz.Scheduler; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.autoconfigure.EnableAutoConfiguration; -import org.springframework.boot.autoconfigure.batch.BatchAutoConfiguration; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.test.context.bean.override.mockito.MockitoBean; - -@SpringBootTest(classes = {DefaultModelConfigToExportConfigConverter.class, JacksonConfiguration.class, - ServiceConfiguration.class}) -@EnableAutoConfiguration(exclude = {BatchAutoConfiguration.class}) +import org.mockito.junit.jupiter.MockitoExtension; + +@ExtendWith(MockitoExtension.class) class BursarFeesFinesExportConfigServiceTest { - public static final String CONFIG_RESPONSE = - """ - { - "configs": [ - { - "id": "d855141f-aa62-40bb-a34b-da986b35d6d4", - "module": "mod-bursar-export", - "configName": "query_parameters", - "description": "for launch job", - "default": true, - "enabled": true, - "value": "{\\"id\\":\\"6c163f99-9df5-419d-9174-da638a1c76ed\\",\\"schedulePeriod\\":\\"DAY\\",\\"weekDays\\":[\\"FRIDAY\\",\\"MONDAY\\"]}", - "metadata": { - "createdDate": "2021-02-04T05:25:19.580+00:00", - "createdByUserId": "1d3b58cb-07b5-5fcd-8a2a-3ce06a0eb90f", - "updatedDate": "2021-02-04T06:06:18.875+00:00", - "updatedByUserId": "1d3b58cb-07b5-5fcd-8a2a-3ce06a0eb90f" - } - } - ], - "totalRecords": 1, - "resultInfo": { - "totalRecords": 1, - "facets": [], - "diagnostics": [] - } - }\ - """; - public static final String EMPTY_CONFIG_RESPONSE = "{\"configs\": [], \"totalRecords\": 0}"; - - @Autowired - private BursarFeesFinesExportConfigService service; - @Autowired - private DefaultModelConfigToExportConfigConverter defaultModelConfigToExportConfigConverter; - @Autowired - private ObjectMapper objectMapper; - @MockitoBean - private ConfigurationClient client; - @MockitoBean - private Scheduler scheduler; - @MockitoBean - private QuartzSchemaInitializer quartzSchemaInitializer; - @MockitoBean + private ExportConfigRepository repository; private BursarExportScheduler bursarExportScheduler; + private BursarFeesFinesExportConfigService service; - @Test - @DisplayName("Set new configuration") - void addConfig() throws JsonProcessingException { - ExportConfig bursarExportConfig = new ExportConfig(); - - bursarExportConfig.setId("0000-00-00-00-000000"); - - ExportTypeSpecificParameters parameters = new ExportTypeSpecificParameters(); - - BursarExportJob bursarFeeFines = new BursarExportJob(); - BursarExportFilterAge bursarExportFilterAge = new BursarExportFilterAge(); - bursarExportFilterAge.setNumDays(1); - BursarExportFilterPatronGroup bursarExportFilterPatronGroup = new BursarExportFilterPatronGroup(); - bursarExportFilterPatronGroup.setPatronGroupId( - UUID.fromString("0000-00-00-00-000000") - ); - List bursarExportFilters = new ArrayList<>(); - bursarExportFilters.add(bursarExportFilterPatronGroup); - bursarExportFilters.add(bursarExportFilterAge); - BursarExportFilterCondition bursarExportFilterCondition = new BursarExportFilterCondition(); - bursarExportFilterCondition.setCriteria(bursarExportFilters); - bursarExportFilterCondition.setOperation(OperationEnum.AND); - bursarFeeFines.setFilter(bursarExportFilterCondition); - parameters.setBursarFeeFines(bursarFeeFines); - bursarExportConfig.exportTypeSpecificParameters(parameters); - ModelConfiguration mockResponse = mockResponse(bursarExportConfig); - Mockito.when(client.postConfiguration(any())).thenReturn(mockResponse); - doNothing().when(bursarExportScheduler).scheduleBursarJob(any()); - - var response = service.postConfig(bursarExportConfig); - - Assertions.assertAll( - () -> assertNotNull(response.getId()), - () -> assertEquals(mockResponse.getId(), response.getId()), - () -> assertEquals(mockResponse.getConfigName(), response.getConfigName()), - () -> assertEquals(mockResponse.getModule(), response.getModule()), - () -> assertEquals(mockResponse.getDescription(), response.getDescription()), - () -> assertEquals(mockResponse.getDefault(), response.getDefault()), - () -> assertEquals(mockResponse.getEnabled(), response.getEnabled()) - ); - } - - @Test - @DisplayName( - "Should not create new configuration without specific parameters" - ) - void shouldNorCreateConfigurationAndThroughExceptionIfSpecificParametersIsNotSet() - throws JsonProcessingException { - ExportConfig bursarExportConfig = new ExportConfig(); - ModelConfiguration mockResponse = mockResponse(bursarExportConfig); - Mockito.when(client.postConfiguration(any())).thenReturn(mockResponse); - - assertThrows(IllegalStateException.class, () -> service.postConfig(bursarExportConfig)); - Mockito.verify(client, Mockito.times(0)).postConfiguration(any()); - } - - @Test - @DisplayName("Should not create new configuration without bur sar parameters") - void shouldNorCreateConfigurationAndThroughExceptionIfBursarConfigIsNotSet() throws JsonProcessingException { - ExportConfig bursarExportConfig = new ExportConfig(); - ExportTypeSpecificParameters parameters = new ExportTypeSpecificParameters(); - bursarExportConfig.setExportTypeSpecificParameters(parameters); - ModelConfiguration mockResponse = mockResponse(bursarExportConfig); - Mockito.when(client.postConfiguration(any())).thenReturn(mockResponse); - - assertThrows(IllegalArgumentException.class, () -> service.postConfig(bursarExportConfig)); - Mockito.verify(client, Mockito.times(0)).postConfiguration(any()); - } - - private ModelConfiguration mockResponse(ExportConfig bursarExportConfig) - throws JsonProcessingException { - var mockResponse = new ModelConfiguration(); - mockResponse.setId(UUID.randomUUID().toString()); - mockResponse.setModule("test_module"); - mockResponse.setConfigName("bursar_config"); - mockResponse.setDescription("test description"); - mockResponse.setEnabled(true); - mockResponse.setDefault(true); - mockResponse.setValue(objectMapper.writeValueAsString(bursarExportConfig)); - return mockResponse; - } - - @Test - @DisplayName("Config is not set") - void noConfig() throws JsonProcessingException { - final ConfigurationCollection mockedResponse = objectMapper.readValue(EMPTY_CONFIG_RESPONSE, ConfigurationCollection.class); - Mockito.when(client.getConfigurations(any(), eq(1))).thenReturn(mockedResponse); + @BeforeEach + void setUp() { + var validatorKey = "%s-%s".formatted(ExportType.BURSAR_FEES_FINES, ExportTypeSpecificParameters.class.getName()); + var exportConfigValidatorResolver = new ExportConfigValidatorResolver(Map.of(validatorKey, new BursarFeesFinesExportParametersValidator())); - var config = service.getFirstConfig(); + var defaultExportConfigMapper = new DefaultExportConfigMapper(); + var exportConfigMapperResolver = new ExportConfigMapperResolver(Map.of(), defaultExportConfigMapper); + setInternalState(defaultExportConfigMapper, "objectMapper", new JacksonConfiguration().get()); + defaultExportConfigMapper.init(); - assertTrue(config.isEmpty()); + repository = Mockito.mock(ExportConfigRepository.class); + bursarExportScheduler = Mockito.mock(BursarExportScheduler.class); + service = new BursarFeesFinesExportConfigService(repository, defaultExportConfigMapper, exportConfigMapperResolver, exportConfigValidatorResolver, bursarExportScheduler); } @Test - @DisplayName("Fetch empty config collection") - void fetchEmptyConfigCollection() throws JsonProcessingException { - final ConfigurationCollection mockedResponse = objectMapper.readValue(EMPTY_CONFIG_RESPONSE, ConfigurationCollection.class); - Mockito.when(client.getConfigurations(any(), eq(1))).thenReturn(mockedResponse); + @DisplayName("Set new configuration") + void testPostConfig() { + var exportConfig = getBursarExportConfig(); - var query = String.format(DEFAULT_CONFIG_QUERY, DEFAULT_CONFIG_NAME); - var config = service.getConfigCollection(query, 1); + when(repository.save(any())).thenAnswer(i -> i.getArguments()[0]); - Assertions.assertAll( - () -> assertEquals(0, config.getTotalRecords()), - () -> assertTrue(config.getConfigs().isEmpty())); - } + var response = service.postConfig(exportConfig); - @Test - @DisplayName("Fetch config collection") - void fetchConfigCollection() throws JsonProcessingException { - final ConfigurationCollection mockedResponse = objectMapper.readValue(CONFIG_RESPONSE, ConfigurationCollection.class); - Mockito.when(client.getConfigurations(any(), eq(1))).thenReturn(mockedResponse); - - var query = String.format(DEFAULT_CONFIG_QUERY, DEFAULT_CONFIG_NAME); - var config = service.getConfigCollection(query, 1); - - Assertions.assertAll( - () -> assertEquals(1, config.getTotalRecords()), - () -> assertEquals(1, config.getConfigs().size())); - - var exportConfig = config.getConfigs().get(0); - Assertions.assertAll( - () -> assertEquals("d855141f-aa62-40bb-a34b-da986b35d6d4", exportConfig.getId()), - () -> assertEquals(ExportConfig.SchedulePeriodEnum.DAY, exportConfig.getSchedulePeriod()), - () -> - assertEquals( - List.of(ExportConfig.WeekDaysEnum.FRIDAY, ExportConfig.WeekDaysEnum.MONDAY), exportConfig.getWeekDays())); + assertEquals(exportConfig, response); + verify(bursarExportScheduler, times(1)).scheduleBursarJob(exportConfig); } @Test - @DisplayName("Config exists and parsed correctly") - void getConfig() throws JsonProcessingException { - final ConfigurationCollection mockedResponse = objectMapper.readValue(CONFIG_RESPONSE, ConfigurationCollection.class); - Mockito.when(client.getConfigurations(any(), eq(1))).thenReturn(mockedResponse); + @DisplayName("Update configuration") + void testUpdateConfig() { + var exportConfig = getBursarExportConfig(); - var config = service.getFirstConfig(); + when(repository.findById(UUID.fromString(exportConfig.getId()))) + .thenReturn(java.util.Optional.of(new ExportConfigEntity())); - assertTrue(config.isPresent()); + service.updateConfig(exportConfig.getId(), exportConfig); - final ExportConfig exportConfig = config.get(); - - Assertions.assertAll( - () -> assertEquals("d855141f-aa62-40bb-a34b-da986b35d6d4", exportConfig.getId()), - () -> assertEquals(ExportConfig.SchedulePeriodEnum.DAY, exportConfig.getSchedulePeriod()), - () -> - assertEquals( - List.of(ExportConfig.WeekDaysEnum.FRIDAY, ExportConfig.WeekDaysEnum.MONDAY), exportConfig.getWeekDays())); + verify(bursarExportScheduler, times(1)).scheduleBursarJob(exportConfig); } + } diff --git a/src/test/java/org/folio/des/support/TestUtils.java b/src/test/java/org/folio/des/support/TestUtils.java new file mode 100644 index 00000000..f7121eae --- /dev/null +++ b/src/test/java/org/folio/des/support/TestUtils.java @@ -0,0 +1,55 @@ +package org.folio.des.support; + +import java.lang.reflect.Field; +import java.util.ArrayList; +import java.util.List; +import java.util.UUID; + +import org.folio.des.domain.dto.BursarExportFilterAge; +import org.folio.des.domain.dto.BursarExportFilterCondition; +import org.folio.des.domain.dto.BursarExportFilterPatronGroup; +import org.folio.des.domain.dto.BursarExportJob; +import org.folio.des.domain.dto.ExportConfig; +import org.folio.des.domain.dto.ExportTypeSpecificParameters; + +import lombok.experimental.UtilityClass; + +@UtilityClass +public class TestUtils { + + public static ExportConfig getBursarExportConfig() { + return new ExportConfig() + .id(UUID.randomUUID().toString()) + .exportTypeSpecificParameters(new ExportTypeSpecificParameters() + .bursarFeeFines(new BursarExportJob() + .filter(new BursarExportFilterCondition() + .criteria(new ArrayList<>(List.of( + new BursarExportFilterAge().numDays(1), + new BursarExportFilterPatronGroup().patronGroupId(UUID.fromString("0000-00-00-00-000000"))))) + .operation(BursarExportFilterCondition.OperationEnum.AND)))); + } + + public static void setInternalState(Object target, String field, Object value) { + Class c = target.getClass(); + try { + var f = getDeclaredFieldRecursive(field, c); + f.setAccessible(true); + f.set(target, value); + } catch (Exception e) { + throw new RuntimeException( + "Unable to set internal state on a private field. [...]", e); + } + } + + private static Field getDeclaredFieldRecursive(String field, Class cls) { + try { + return cls.getDeclaredField(field); + } catch (NoSuchFieldException e) { + if (cls.getSuperclass() != null) { + return getDeclaredFieldRecursive(field, cls.getSuperclass()); + } + throw new RuntimeException(String.format("Unable to find field: %s for class: %s", field, cls.getName()), e); + } + } + +} From 74cff15e93c9f3779fcd88bd113dbefb4ea250ad Mon Sep 17 00:00:00 2001 From: saba_zedginidze Date: Wed, 29 Oct 2025 16:58:30 +0400 Subject: [PATCH 13/21] [MODEXPS-296] Update export config manager test to use DB --- .../ExportTypeBasedConfigManagerTest.java | 247 +++++------------- 1 file changed, 61 insertions(+), 186 deletions(-) diff --git a/src/test/java/org/folio/des/service/config/impl/ExportTypeBasedConfigManagerTest.java b/src/test/java/org/folio/des/service/config/impl/ExportTypeBasedConfigManagerTest.java index 8ec02991..5f7ee83b 100644 --- a/src/test/java/org/folio/des/service/config/impl/ExportTypeBasedConfigManagerTest.java +++ b/src/test/java/org/folio/des/service/config/impl/ExportTypeBasedConfigManagerTest.java @@ -2,252 +2,127 @@ import static org.folio.des.service.config.ExportConfigConstants.DEFAULT_CONFIG_NAME; import static org.folio.des.service.config.ExportConfigConstants.DEFAULT_CONFIG_QUERY; +import static org.folio.des.support.TestUtils.getBursarExportConfig; import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertNotNull; import static org.junit.jupiter.api.Assertions.assertThrows; import static org.junit.jupiter.api.Assertions.assertTrue; import static org.mockito.ArgumentMatchers.any; -import static org.mockito.ArgumentMatchers.eq; -import static org.mockito.Mockito.doNothing; +import static org.mockito.Mockito.never; +import static org.mockito.Mockito.times; +import static org.mockito.Mockito.verify; -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.databind.ObjectMapper; -import java.util.ArrayList; import java.util.List; import java.util.UUID; -import org.folio.des.client.ConfigurationClient; -import org.folio.des.config.ServiceConfiguration; -import org.folio.des.config.scheduling.QuartzSchemaInitializer; -import org.folio.des.domain.dto.BursarExportFilter; -import org.folio.des.domain.dto.BursarExportFilterAge; -import org.folio.des.domain.dto.BursarExportFilterCondition; -import org.folio.des.domain.dto.BursarExportFilterCondition.OperationEnum; -import org.folio.des.domain.dto.BursarExportFilterPatronGroup; -import org.folio.des.domain.dto.BursarExportJob; -import org.folio.des.domain.dto.ConfigurationCollection; + import org.folio.des.domain.dto.ExportConfig; -import org.folio.des.domain.dto.ExportConfig.SchedulePeriodEnum; -import org.folio.des.domain.dto.ExportConfig.WeekDaysEnum; import org.folio.des.domain.dto.ExportType; import org.folio.des.domain.dto.ExportTypeSpecificParameters; -import org.folio.des.domain.dto.ModelConfiguration; import org.folio.des.domain.exception.RequestValidationException; +import org.folio.des.repository.ExportConfigRepository; import org.folio.des.scheduling.bursar.BursarExportScheduler; +import org.folio.des.support.BaseTest; +import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; -import org.junit.jupiter.params.provider.CsvSource; -import org.mockito.Mockito; -import org.quartz.Scheduler; +import org.junit.jupiter.params.provider.ValueSource; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.autoconfigure.EnableAutoConfiguration; -import org.springframework.boot.autoconfigure.batch.BatchAutoConfiguration; -import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.TestPropertySource; import org.springframework.test.context.bean.override.mockito.MockitoBean; +import org.springframework.test.context.bean.override.mockito.MockitoSpyBean; -@SpringBootTest(classes = { ServiceConfiguration.class }) -@EnableAutoConfiguration(exclude = { BatchAutoConfiguration.class }) -class ExportTypeBasedConfigManagerTest { - - public static final String CONFIG_RESPONSE = - """ - { - "configs": [ - { - "id": "d855141f-aa62-40bb-a34b-da986b35d6d4", - "module": "mod-bursar-export", - "configName": "query_parameters", - "description": "for launch job", - "default": true, - "enabled": true, - "value": "{\\"id\\":\\"6c163f99-9df5-419d-9174-da638a1c76ed\\",\\"schedulePeriod\\":\\"DAY\\",\\"weekDays\\":[\\"FRIDAY\\",\\"MONDAY\\"]}", - "metadata": { - "createdDate": "2021-02-04T05:25:19.580+00:00", - "createdByUserId": "1d3b58cb-07b5-5fcd-8a2a-3ce06a0eb90f", - "updatedDate": "2021-02-04T06:06:18.875+00:00", - "updatedByUserId": "1d3b58cb-07b5-5fcd-8a2a-3ce06a0eb90f" - } - } - ], - "totalRecords": 1, - "resultInfo": { - "totalRecords": 1, - "facets": [], - "diagnostics": [] - } - }\ - """; - public static final String EMPTY_CONFIG_RESPONSE = "{\"configs\": [], \"totalRecords\": 0}"; +@TestPropertySource(properties = "spring.jpa.properties.hibernate.default_schema=diku_mod_data_export_spring") +class ExportTypeBasedConfigManagerTest extends BaseTest { + @MockitoSpyBean + private ExportConfigRepository repository; @Autowired private ExportTypeBasedConfigManager service; - @Autowired - private ObjectMapper objectMapper; - @MockitoBean - private ConfigurationClient client; - @MockitoBean - private Scheduler scheduler; - @MockitoBean - private QuartzSchemaInitializer quartzSchemaInitializer; @MockitoBean private BursarExportScheduler bursarExportScheduler; + @AfterEach + void tearDown() { + repository.deleteAll(); + } + @ParameterizedTest - @CsvSource({ - "BATCH_VOUCHER_EXPORT, BATCH_VOUCHER_EXPORT", - "BURSAR_FEES_FINES, export_config_parameters" - }) + @ValueSource(strings = {"BATCH_VOUCHER_EXPORT", "BURSAR_FEES_FINES"}) @DisplayName("Set new configuration") - void addConfig(ExportType exportType, String exportName) throws JsonProcessingException { - ExportConfig bursarExportConfig = new ExportConfig(); - bursarExportConfig.setType(exportType); - ExportTypeSpecificParameters parameters = new ExportTypeSpecificParameters(); - - BursarExportJob bursarFeeFines = new BursarExportJob(); - BursarExportFilterAge bursarExportFilterAge = new BursarExportFilterAge(); - bursarExportFilterAge.setNumDays(1); - BursarExportFilterPatronGroup bursarExportFilterPatronGroup = new BursarExportFilterPatronGroup(); - bursarExportFilterPatronGroup.setPatronGroupId(UUID.fromString("0000-00-00-00-000000")); - List bursarExportFilters = new ArrayList<>(); - bursarExportFilters.add(bursarExportFilterPatronGroup); - bursarExportFilters.add(bursarExportFilterAge); - BursarExportFilterCondition bursarExportFilterCondition = new BursarExportFilterCondition(); - bursarExportFilterCondition.setCriteria(bursarExportFilters); - bursarExportFilterCondition.setOperation(OperationEnum.AND); - bursarFeeFines.setFilter(bursarExportFilterCondition); - parameters.setBursarFeeFines(bursarFeeFines); - bursarExportConfig.exportTypeSpecificParameters(parameters); - ModelConfiguration mockResponse = mockResponse(bursarExportConfig, exportName); - Mockito.when(client.postConfiguration(any())).thenReturn(mockResponse); - doNothing().when(bursarExportScheduler).scheduleBursarJob(any()); - - var response = service.postConfig(bursarExportConfig); + void testPostConfig(ExportType exportType) { + var exportConfig = getBursarExportConfig().tenant("diku").type(exportType); - Assertions.assertAll( - () -> assertNotNull(response.getId()), - () -> assertEquals(mockResponse.getConfigName(), exportName), - () -> assertEquals(mockResponse.getModule(), response.getModule()), - () -> assertEquals(mockResponse.getDescription(), response.getDescription()), - () -> assertEquals(mockResponse.getDefault(), response.getDefault()), - () -> assertEquals(mockResponse.getEnabled(), response.getEnabled()) - ); - Mockito.verify(client, Mockito.times(1)).postConfiguration(any()); + var response = service.postConfig(exportConfig); + + assertEquals(exportConfig, response); + verify(repository).save(any()); } @Test @DisplayName("Should not create new configuration without specific parameters") - void shouldNorCreateConfigurationAndThroughExceptionIfSpecificParametersIsNotSet() throws JsonProcessingException { - ExportConfig bursarExportConfig = new ExportConfig(); - ModelConfiguration mockResponse = mockResponse(bursarExportConfig, "export_config_parameters"); - Mockito.when(client.postConfiguration(any())).thenReturn(mockResponse); + void testPostConfigWithoutSpecificParameters() { + var exportConfig = new ExportConfig(); + + assertThrows(IllegalStateException.class, () -> service.postConfig(exportConfig)); - assertThrows(IllegalStateException.class, () -> service.postConfig(bursarExportConfig)); - Mockito.verify(client, Mockito.times(0)).postConfiguration(any()); + verify(repository, never()).save(any()); } @Test @DisplayName("Should throw RequestValidationException") - void shouldThrowRequestValidationException() { - ExportConfig exportConfig = new ExportConfig(); - Exception exception = assertThrows(RequestValidationException.class, () -> service.updateConfig(null, exportConfig)); + void testPostConfigThrowRequestValidationException() { + var exportConfig = new ExportConfig(); + var expectedMessage = "Mismatch between id in path and request body"; - String expectedMessage = "Mismatch between id in path and request body"; - String actualMessage = exception.getMessage(); + var exception = assertThrows(RequestValidationException.class, () -> service.updateConfig(null, exportConfig)); - assertTrue(actualMessage.contains(expectedMessage)); + assertTrue(exception.getMessage().contains(expectedMessage)); } @Test - @DisplayName("Should not create new configuration without bur sar parameters") - void shouldNorCreateConfigurationAndThroughExceptionIfBursarConfigIsNotSet() throws JsonProcessingException { - ExportConfig bursarExportConfig = new ExportConfig(); - ExportTypeSpecificParameters parameters = new ExportTypeSpecificParameters(); - bursarExportConfig.setExportTypeSpecificParameters(parameters); - ModelConfiguration mockResponse = mockResponse(bursarExportConfig, "export_config_parameters"); - Mockito.when(client.postConfiguration(any())).thenReturn(mockResponse); + @DisplayName("Should not create new configuration without bursar parameters") + void testPostConfigWithoutBursarParameters() { + var bursarExportConfig = new ExportConfig().exportTypeSpecificParameters(new ExportTypeSpecificParameters()); assertThrows(IllegalArgumentException.class, () -> service.postConfig(bursarExportConfig)); - Mockito.verify(client, Mockito.times(0)).postConfiguration(any()); - } - - private ModelConfiguration mockResponse(ExportConfig bursarExportConfig, String configName) - throws JsonProcessingException { - var mockResponse = new ModelConfiguration(); - mockResponse.setId(UUID.randomUUID().toString()); - mockResponse.setModule("test_module"); - mockResponse.setConfigName(configName); - mockResponse.setDescription("test description"); - mockResponse.setEnabled(true); - mockResponse.setDefault(true); - mockResponse.setValue(objectMapper.writeValueAsString(bursarExportConfig)); - return mockResponse; - } - - @Test - @DisplayName("Config is not set") - void noConfig() throws JsonProcessingException { - final ConfigurationCollection mockedResponse = objectMapper.readValue(EMPTY_CONFIG_RESPONSE, ConfigurationCollection.class); - Mockito.when(client.getConfigurations(any(), any())).thenReturn(mockedResponse); - - var configs = service.getConfigCollection(null, 10); - assertTrue(configs.getConfigs().isEmpty()); - } - - @Test - @DisplayName("Fetch empty config collection") - void fetchEmptyConfigCollection() throws JsonProcessingException { - final ConfigurationCollection mockedResponse = objectMapper.readValue(EMPTY_CONFIG_RESPONSE, ConfigurationCollection.class); - Mockito.when(client.getConfigurations(any(), eq(10))).thenReturn(mockedResponse); - - var query = String.format(DEFAULT_CONFIG_QUERY, DEFAULT_CONFIG_NAME); - var config = service.getConfigCollection(query, 10); - - Assertions.assertAll( - () -> assertEquals(0, config.getTotalRecords()), - () -> assertTrue(config.getConfigs().isEmpty())); + verify(repository, times(0)).save(any()); } @Test @DisplayName("Fetch config collection") - void fetchConfigCollection() throws JsonProcessingException { - final ConfigurationCollection mockedResponse = objectMapper.readValue(CONFIG_RESPONSE, ConfigurationCollection.class); - Mockito.when(client.getConfigurations(any(), eq(10))).thenReturn(mockedResponse); + void testGetConfigCollection() { + var id = UUID.randomUUID().toString(); + var bursarConfig = getBursarExportConfig().id(id) + .tenant("diku") + .schedulePeriod(ExportConfig.SchedulePeriodEnum.DAY) + .weekDays(List.of(ExportConfig.WeekDaysEnum.FRIDAY, ExportConfig.WeekDaysEnum.MONDAY)); + service.postConfig(bursarConfig); var query = String.format(DEFAULT_CONFIG_QUERY, DEFAULT_CONFIG_NAME); var config = service.getConfigCollection(query, 10); Assertions.assertAll( - () -> assertEquals(1, config.getTotalRecords()), - () -> assertEquals(1, config.getConfigs().size())); + () -> assertEquals(1, config.getTotalRecords()), + () -> assertEquals(1, config.getConfigs().size())); - var exportConfig = config.getConfigs().get(0); + var exportConfig = config.getConfigs().getFirst(); Assertions.assertAll( - () -> assertEquals("d855141f-aa62-40bb-a34b-da986b35d6d4", exportConfig.getId()), - () -> assertEquals(SchedulePeriodEnum.DAY, exportConfig.getSchedulePeriod()), - () -> - assertEquals( - List.of(WeekDaysEnum.FRIDAY, WeekDaysEnum.MONDAY), exportConfig.getWeekDays())); + () -> assertEquals(id, exportConfig.getId()), + () -> assertEquals(ExportConfig.SchedulePeriodEnum.DAY, exportConfig.getSchedulePeriod()), + () -> assertEquals(List.of(ExportConfig.WeekDaysEnum.FRIDAY, ExportConfig.WeekDaysEnum.MONDAY), exportConfig.getWeekDays())); } @Test - @DisplayName("Config exists and parsed correctly") - void getConfig() throws JsonProcessingException { - final ConfigurationCollection mockedResponse = objectMapper.readValue(CONFIG_RESPONSE, ConfigurationCollection.class); - Mockito.when(client.getConfigurations(any(), eq(10))).thenReturn(mockedResponse); - - var configs = service.getConfigCollection(null, 10); - - assertEquals(1, configs.getTotalRecords()); - - final ExportConfig exportConfig = configs.getConfigs().get(0); + @DisplayName("Fetch empty config collection") + void testGetConfigCollectionEmpty() { + var query = String.format(DEFAULT_CONFIG_QUERY, DEFAULT_CONFIG_NAME); + var config = service.getConfigCollection(query, 10); Assertions.assertAll( - () -> assertEquals("d855141f-aa62-40bb-a34b-da986b35d6d4", exportConfig.getId()), - () -> assertEquals(SchedulePeriodEnum.DAY, exportConfig.getSchedulePeriod()), - () -> - assertEquals( - List.of(WeekDaysEnum.FRIDAY, WeekDaysEnum.MONDAY), exportConfig.getWeekDays())); + () -> assertEquals(0, config.getTotalRecords()), + () -> assertTrue(config.getConfigs().isEmpty())); } + } From 70c0df22aadffd96cedefe72287228e6c541202f Mon Sep 17 00:00:00 2001 From: saba_zedginidze Date: Wed, 29 Oct 2025 16:58:42 +0400 Subject: [PATCH 14/21] [MODEXPS-296] Update configs controller test --- .../des/controller/ConfigsControllerTest.java | 159 +++++------------- 1 file changed, 45 insertions(+), 114 deletions(-) diff --git a/src/test/java/org/folio/des/controller/ConfigsControllerTest.java b/src/test/java/org/folio/des/controller/ConfigsControllerTest.java index 66e1f10f..9f841698 100644 --- a/src/test/java/org/folio/des/controller/ConfigsControllerTest.java +++ b/src/test/java/org/folio/des/controller/ConfigsControllerTest.java @@ -1,17 +1,10 @@ package org.folio.des.controller; -import static com.github.tomakehurst.wiremock.client.WireMock.aResponse; -import static com.github.tomakehurst.wiremock.client.WireMock.anyUrl; -import static com.github.tomakehurst.wiremock.client.WireMock.noContent; -import static com.github.tomakehurst.wiremock.client.WireMock.urlEqualTo; -import static org.apache.http.protocol.HTTP.CONTENT_TYPE; -import static org.folio.des.service.config.ExportConfigConstants.DEFAULT_MODULE_NAME; import static org.hamcrest.Matchers.is; import static org.hamcrest.Matchers.startsWith; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.reset; -import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.delete; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; @@ -21,10 +14,10 @@ import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; -import org.folio.des.client.ConfigurationClient; -import org.folio.des.domain.dto.ConfigurationCollection; +import java.util.Objects; + import org.folio.des.domain.dto.ExportConfig; -import org.folio.des.domain.dto.ModelConfiguration; +import org.folio.des.repository.ExportConfigRepository; import org.folio.des.scheduling.bursar.BursarExportScheduler; import org.folio.des.support.BaseTest; import org.junit.jupiter.api.AfterEach; @@ -34,13 +27,11 @@ import org.junit.jupiter.params.provider.CsvSource; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.MediaType; +import org.springframework.test.context.TestPropertySource; import org.springframework.test.context.bean.override.mockito.MockitoSpyBean; import org.springframework.test.web.servlet.MockMvc; -import com.github.tomakehurst.wiremock.client.WireMock; - -import java.util.Objects; - +@TestPropertySource(properties = "spring.jpa.properties.hibernate.default_schema=diku_mod_data_export_spring") class ConfigsControllerTest extends BaseTest { private static final String NEW_CONFIG_REQUEST = @@ -54,41 +45,35 @@ class ConfigsControllerTest extends BaseTest { private static final String CLAIMS_REQUEST = "{\"id\":\"30ad9c6d-f2e7-425f-a171-b4e0cbce7204\",\"type\":\"CLAIMS\",\"tenant\":\"diku\",\"exportTypeSpecificParameters\":{\"vendorEdiOrdersExportConfig\":{\"exportConfigId\":\"30ad9c6d-f2e7-425f-a171-b4e0cbce7204\",\"vendorId\":\"1e958895-82a6-4fa1-b6fe-763063381946\",\"configName\":\"Test 1-3\",\"ediConfig\":{\"accountNoList\":[\"3\"],\"ediNamingConvention\":\"{organizationCode}-{integrationName}-{exportJobEndDate}\",\"libEdiType\":\"31B/US-SAN\",\"vendorEdiType\":\"31B/US-SAN\",\"sendAccountNumber\":false,\"supportOrder\":false,\"supportInvoice\":false},\"ediFtp\":{\"ftpConnMode\":\"Active\",\"ftpFormat\":\"SFTP\",\"ftpMode\":\"ASCII\"},\"isDefaultConfig\":false,\"integrationType\":\"Claiming\",\"transmissionMethod\":\"File download\",\"fileFormat\":\"CSV\"}},\"schedulePeriod\":\"NONE\"}"; - @Autowired private MockMvc mockMvc; - + @Autowired + private MockMvc mockMvc; + @MockitoSpyBean + private ExportConfigRepository repository; @MockitoSpyBean private BursarExportScheduler bursarExportScheduler; - @MockitoSpyBean private ConfigurationClient configurationClient; @AfterEach void clear(){ - reset(bursarExportScheduler, configurationClient); + reset(bursarExportScheduler); + repository.deleteAll(); } @ParameterizedTest @CsvSource({ - "/data-export-spring/configs, module==mod-data-export-spring,", - "/data-export-spring/configs?query=type==BURSAR_FEES_FINES, module==mod-data-export-spring and configName==export_config_parameters,", - "/data-export-spring/configs?query=type==BATCH_VOUCHER_EXPORT, module==mod-data-export-spring AND value==*BATCH_VOUCHER_EXPORT*,", - "/data-export-spring/configs?query=type==EDIFACT_ORDERS_EXPORT, module==mod-data-export-spring AND value==*EDIFACT_ORDERS_EXPORT*,", - "/data-export-spring/configs?query=type==(EDIFACT_ORDERS_EXPORT), module==mod-data-export-spring AND value==*EDIFACT_ORDERS_EXPORT*,", - "/data-export-spring/configs?query=type==CLAIMS, module==mod-data-export-spring AND value==*CLAIMS*,", - "/data-export-spring/configs?query=type==(CLAIMS), module==mod-data-export-spring AND value==*CLAIMS*,", - "/data-export-spring/configs?query=type==(CLAIMS OR EDIFACT_ORDERS_EXPORT), module==mod-data-export-spring AND value==*CLAIMS*, module==mod-data-export-spring AND value==*EDIFACT_ORDERS_EXPORT*", - "/data-export-spring/configs?query=type==(CLAIMS OR BATCH_VOUCHER_EXPORT), module==mod-data-export-spring AND value==*CLAIMS*, module==mod-data-export-spring AND value==*BATCH_VOUCHER_EXPORT*", - "/data-export-spring/configs?query=configName==\"EDIFACT_ORDERS_EXPORT_079e28a8-bf6d-4424-8461-13a3b1c3ec71**\", module==mod-data-export-spring AND configName==\"EDIFACT_ORDERS_EXPORT_079e28a8-bf6d-4424-8461-13a3b1c3ec71**\",", - "/data-export-spring/configs?query=configName==\"CLAIMS_1e958895-82a6-4fa1-b6fe-763063381946*\", module==mod-data-export-spring AND configName==\"CLAIMS_1e958895-82a6-4fa1-b6fe-763063381946*\",", - "/data-export-spring/configs?query=configName==(\"CLAIMS_2e6623c8-e201-48e8-bfae-e6426f04bea3*\" OR \"EDIFACT_ORDERS_EXPORT_079e28a8-bf6d-4424-8461-13a3b1c3ec71*\"), module==mod-data-export-spring AND configName==(\"CLAIMS_2e6623c8-e201-48e8-bfae-e6426f04bea3*\" OR \"EDIFACT_ORDERS_EXPORT_079e28a8-bf6d-4424-8461-13a3b1c3ec71*\"),", + "/data-export-spring/configs?query=type==BURSAR_FEES_FINES, configName==export_config_parameters,", + "/data-export-spring/configs?query=type==BATCH_VOUCHER_EXPORT, type==*BATCH_VOUCHER_EXPORT*,", + "/data-export-spring/configs?query=type==EDIFACT_ORDERS_EXPORT, type==*EDIFACT_ORDERS_EXPORT*,", + "/data-export-spring/configs?query=type==(EDIFACT_ORDERS_EXPORT), type==*EDIFACT_ORDERS_EXPORT*,", + "/data-export-spring/configs?query=type==CLAIMS, type==*CLAIMS*,", + "/data-export-spring/configs?query=type==(CLAIMS), type==*CLAIMS*,", + "/data-export-spring/configs?query=type==(CLAIMS OR EDIFACT_ORDERS_EXPORT), type==*CLAIMS*, type==*EDIFACT_ORDERS_EXPORT*", + "/data-export-spring/configs?query=type==(CLAIMS OR BATCH_VOUCHER_EXPORT), type==*CLAIMS*, type==*BATCH_VOUCHER_EXPORT*", + "/data-export-spring/configs?query=configName==\"EDIFACT_ORDERS_EXPORT_079e28a8-bf6d-4424-8461-13a3b1c3ec71**\", configName==\"EDIFACT_ORDERS_EXPORT_079e28a8-bf6d-4424-8461-13a3b1c3ec71**\",", + "/data-export-spring/configs?query=configName==\"CLAIMS_1e958895-82a6-4fa1-b6fe-763063381946*\", configName==\"CLAIMS_1e958895-82a6-4fa1-b6fe-763063381946*\",", + "/data-export-spring/configs?query=configName==(\"CLAIMS_2e6623c8-e201-48e8-bfae-e6426f04bea3*\" OR \"EDIFACT_ORDERS_EXPORT_079e28a8-bf6d-4424-8461-13a3b1c3ec71*\"), configName==(\"CLAIMS_2e6623c8-e201-48e8-bfae-e6426f04bea3*\" OR \"EDIFACT_ORDERS_EXPORT_079e28a8-bf6d-4424-8461-13a3b1c3ec71*\"),", }) @DisplayName("Fetch config by query") void getConfigs(String exportConfigQuery, String firstModConfigQuery, String secondModConfigQuery) throws Exception { - var config = new ConfigurationCollection(); - config.setTotalRecords(0); - wireMockServer.stubFor(WireMock.get(anyUrl()) - .willReturn(aResponse().withBody(asJsonString(config)) - .withHeader(CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE) - .withStatus(200))); - mockMvc .perform( get(exportConfigQuery) @@ -98,9 +83,9 @@ void getConfigs(String exportConfigQuery, String firstModConfigQuery, String sec content().contentType(MediaType.APPLICATION_JSON_VALUE), jsonPath("$.totalRecords", is(0))); - verify(configurationClient, times(1)).getConfigurations(eq(firstModConfigQuery), any()); + verify(repository).findByCql(eq(firstModConfigQuery), any()); if (Objects.nonNull(secondModConfigQuery)) { - verify(configurationClient, times(1)).getConfigurations(eq(secondModConfigQuery), any()); + verify(repository).findByCql(eq(secondModConfigQuery), any()); } } @@ -113,13 +98,6 @@ void getConfigs(String exportConfigQuery, String firstModConfigQuery, String sec }) @DisplayName("Fetch config by query with case-insensitive operator") void getConfigsCaseWithInsensitiveOperators(String exportConfigQuery) throws Exception { - var config = new ConfigurationCollection(); - config.setTotalRecords(0); - wireMockServer.stubFor(WireMock.get(anyUrl()) - .willReturn(aResponse().withBody(asJsonString(config)) - .withHeader(CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE) - .withStatus(200))); - mockMvc .perform( get(exportConfigQuery) @@ -129,26 +107,17 @@ void getConfigsCaseWithInsensitiveOperators(String exportConfigQuery) throws Exc content().contentType(MediaType.APPLICATION_JSON_VALUE), jsonPath("$.totalRecords", is(0))); - verify(configurationClient, times(1)).getConfigurations( - eq("module==mod-data-export-spring AND value==*CLAIMS*"), any()); - verify(configurationClient, times(1)).getConfigurations( - eq("module==mod-data-export-spring AND value==*EDIFACT_ORDERS_EXPORT*"), any()); + verify(repository).findByCql(eq("type==*CLAIMS*"), any()); + verify(repository).findByCql(eq("type==*EDIFACT_ORDERS_EXPORT*"), any()); } @ParameterizedTest @CsvSource({ - "/data-export-spring/configs?query=type==(CLAIMS OR CLAIMS), module==mod-data-export-spring AND value==*CLAIMS*", - "/data-export-spring/configs?query=type==(EDIFACT_ORDERS_EXPORT OR EDIFACT_ORDERS_EXPORT), module==mod-data-export-spring AND value==*EDIFACT_ORDERS_EXPORT*", + "/data-export-spring/configs?query=type==(CLAIMS OR CLAIMS), type==*CLAIMS*", + "/data-export-spring/configs?query=type==(EDIFACT_ORDERS_EXPORT OR EDIFACT_ORDERS_EXPORT), type==*EDIFACT_ORDERS_EXPORT*", }) @DisplayName("Fetch config by query with duplicate export type") void getConfigsWithDuplicateExportTypes(String exportConfigQuery, String modConfigQuery) throws Exception { - var config = new ConfigurationCollection(); - config.setTotalRecords(0); - wireMockServer.stubFor(WireMock.get(anyUrl()) - .willReturn(aResponse().withBody(asJsonString(config)) - .withHeader(CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE) - .withStatus(200))); - mockMvc .perform( get(exportConfigQuery) @@ -158,8 +127,7 @@ void getConfigsWithDuplicateExportTypes(String exportConfigQuery, String modConf content().contentType(MediaType.APPLICATION_JSON_VALUE), jsonPath("$.totalRecords", is(0))); - verify(configurationClient, times(1)).getConfigurations( - eq(modConfigQuery), any()); + verify(repository).findByCql(eq(modConfigQuery), any()); } @Test @@ -206,10 +174,7 @@ void postClaimsConfig() throws Exception { @Test @DisplayName("Success update config") void putConfig() throws Exception { - wireMockServer.stubFor(WireMock.put(anyUrl()) - .willReturn(aResponse().withBody(UPDATE_CONFIG_REQUEST) - .withHeader(CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE) - .withStatus(204))); + saveConfig(UPDATE_CONFIG_REQUEST); mockMvc .perform( @@ -225,10 +190,7 @@ void putConfig() throws Exception { @Test @DisplayName("Should throw exception when update config if ID in the body and path is MISMATCH") void putShouldThrowExceptionConfig() throws Exception { - wireMockServer.stubFor(WireMock.put(anyUrl()) - .willReturn(aResponse().withBody(UPDATE_CONFIG_REQUEST) - .withHeader(CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE) - .withStatus(204))); + saveConfig(UPDATE_CONFIG_REQUEST); mockMvc .perform( @@ -257,55 +219,22 @@ void putConfigFail() throws Exception { @Test @DisplayName("Should retrieve config by Id if config exist") void shouldRetrieveConfigByIdIfConfigExist() throws Exception { - String urlById = "/configurations/entries/c8303ff3-7dec-49a1-acc8-7ce4f311fe21"; - ModelConfiguration modelConfiguration = new ModelConfiguration(); - modelConfiguration.setId("c8303ff3-7dec-49a1-acc8-7ce4f311fe21"); - modelConfiguration.setConfigName("First_BURSAR_FEES"); - modelConfiguration.setModule(DEFAULT_MODULE_NAME); - modelConfiguration.setValue(UPDATE_CONFIG_REQUEST); - wireMockServer.stubFor(WireMock.get(urlEqualTo(urlById)) - .willReturn(aResponse().withBody(asJsonString(modelConfiguration)) - .withHeader(CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE) - .withStatus(200))); + saveConfig(UPDATE_CONFIG_REQUEST); mockMvc .perform( - get("/data-export-spring/configs/c8303ff3-7dec-49a1-acc8-7ce4f311fe21") + get("/data-export-spring/configs/0a3cba78-16e7-498e-b75b-98713000277b") .accept(MediaType.APPLICATION_JSON_VALUE) .headers(defaultHeaders())) .andExpectAll(status().isOk(), content().contentType(MediaType.APPLICATION_JSON_VALUE), - jsonPath("$.id", is("c8303ff3-7dec-49a1-acc8-7ce4f311fe21"))); - - } - - @Test - @DisplayName("Should be 404 if config body is null") - void shouldBe404IfConfigBodyIsNull() throws Exception { - String urlById = "/configurations/entries/c8303ff3-7dec-49a1-acc8-7ce4f311fe21"; - wireMockServer.stubFor(WireMock.get(urlEqualTo(urlById)) - .willReturn(aResponse().withJsonBody(null) - .withHeader(CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE) - .withStatus(200))); + jsonPath("$.id", is("0a3cba78-16e7-498e-b75b-98713000277b"))); - mockMvc - .perform( - get("/data-export-spring/configs/c8303ff3-7dec-49a1-acc8-7ce4f311fe21") - .accept(MediaType.APPLICATION_JSON_VALUE) - .headers(defaultHeaders())) - .andExpectAll(status().isNotFound(), - content().contentType(MediaType.APPLICATION_JSON_VALUE), - jsonPath("$.errors[0].message", startsWith("NotFoundException"))); } @Test @DisplayName("Should be 404 if config is not exist") void shouldBe404IfConfigIsNotExist() throws Exception { - String urlById = "/configurations/entries/c8303ff3-7dec-49a1-acc8-7ce4f311fe21"; - wireMockServer.stubFor(WireMock.get(urlEqualTo(urlById)) - .willReturn((aResponse().withHeader(CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE) - .withStatus(404)))); - mockMvc .perform( get("/data-export-spring/configs/c8303ff3-7dec-49a1-acc8-7ce4f311fe21") @@ -319,13 +248,11 @@ void shouldBe404IfConfigIsNotExist() throws Exception { @Test @DisplayName("Should delete config by Id if config exist") void shouldDeleteConfigByIdIfConfigExist() throws Exception { - String urlById = "/configurations/entries/c8303ff3-7dec-49a1-acc8-7ce4f311fe21"; - wireMockServer.stubFor(WireMock.delete(urlEqualTo(urlById)) - .willReturn(noContent().withStatus(204))); + saveConfig(NEW_CONFIG_REQUEST); mockMvc .perform( - delete("/data-export-spring/configs/c8303ff3-7dec-49a1-acc8-7ce4f311fe21") + delete("/data-export-spring/configs/0a3cba78-16e7-498e-b75b-98713000277b") .accept(MediaType.APPLICATION_JSON_VALUE) .headers(defaultHeaders())) .andExpectAll(status().isNoContent()); @@ -334,11 +261,6 @@ void shouldDeleteConfigByIdIfConfigExist() throws Exception { @Test @DisplayName("Should not be deleted and response 404 if config is not exist") void shouldNotBeDeletedIfConfigIsNotExist() throws Exception { - String urlById = "/configurations/entries/c8303ff3-7dec-49a1-acc8-7ce4f311fe21"; - wireMockServer.stubFor(WireMock.delete(urlEqualTo(urlById)) - .willReturn((aResponse().withHeader(CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE) - .withStatus(404)))); - mockMvc .perform( delete("/data-export-spring/configs/c8303ff3-7dec-49a1-acc8-7ce4f311fe21") @@ -348,4 +270,13 @@ void shouldNotBeDeletedIfConfigIsNotExist() throws Exception { content().contentType(MediaType.APPLICATION_JSON_VALUE), jsonPath("$.errors[0].message", startsWith("NotFoundException"))); } + + private void saveConfig(String config) throws Exception { + mockMvc.perform(post("/data-export-spring/configs") + .contentType(MediaType.APPLICATION_JSON_VALUE) + .headers(defaultHeaders()) + .content(config)) + .andExpectAll(status().isCreated()); + reset(bursarExportScheduler, repository); + } } From 7fea442048673c3d77748826406fc91a4def78d6 Mon Sep 17 00:00:00 2001 From: saba_zedginidze Date: Thu, 30 Oct 2025 18:07:59 +0400 Subject: [PATCH 15/21] [MODEXPS-296] Address copilot suggestions --- pom.xml | 7 +++++-- .../org/folio/des/config/JacksonConfiguration.java | 12 ++++++++++++ .../org/folio/des/config/ServiceConfiguration.java | 4 ++-- .../org/folio/des/mapper/BaseExportConfigMapper.java | 10 ++-------- .../ClaimsExportConfigMapper.java | 7 +++++-- .../EdifactExportConfigMapper.java | 11 ++++++++--- .../des/mapper/ExportConfigMapperResolverTest.java | 4 ++-- .../acquisition/ClaimsExportConfigMapperTest.java | 2 -- .../acquisition/EdifactExportConfigMapperTest.java | 2 -- .../config/acquisition/ClaimsExportServiceTest.java | 5 ++--- .../acquisition/EdifactOrdersExportServiceTest.java | 5 ++--- .../config/impl/BaseExportConfigServiceTest.java | 3 +-- .../impl/BursarFeesFinesExportConfigServiceTest.java | 3 +-- 13 files changed, 42 insertions(+), 33 deletions(-) rename src/main/java/org/folio/des/mapper/{aqcuisition => acquisition}/ClaimsExportConfigMapper.java (87%) rename src/main/java/org/folio/des/mapper/{aqcuisition => acquisition}/EdifactExportConfigMapper.java (88%) diff --git a/pom.xml b/pom.xml index 96f8982b..e5248167 100644 --- a/pom.xml +++ b/pom.xml @@ -38,6 +38,7 @@ 4.1.1 1.0.0 3.9.2 + 1.18.42 1.6.3 0.2.0 4.4 @@ -166,6 +167,7 @@ org.projectlombok lombok + ${lombok.version} true @@ -296,10 +298,11 @@ maven-compiler-plugin - + org.projectlombok lombok - + ${lombok.version} + org.projectlombok lombok-mapstruct-binding diff --git a/src/main/java/org/folio/des/config/JacksonConfiguration.java b/src/main/java/org/folio/des/config/JacksonConfiguration.java index 28496f2a..48e2f163 100644 --- a/src/main/java/org/folio/des/config/JacksonConfiguration.java +++ b/src/main/java/org/folio/des/config/JacksonConfiguration.java @@ -22,13 +22,16 @@ import org.springframework.batch.core.ExitStatus; import org.springframework.batch.core.JobParameter; +import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Primary; @Configuration public class JacksonConfiguration implements ObjectMapperSupplier { private static final ObjectMapper OBJECT_MAPPER; + private static final ObjectMapper ENTITY_OBJECT_MAPPER; static { OBJECT_MAPPER = @@ -42,6 +45,8 @@ public class JacksonConfiguration implements ObjectMapperSupplier { .configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false) .configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false) .setSerializationInclusion(JsonInclude.Include.NON_EMPTY); + ENTITY_OBJECT_MAPPER = OBJECT_MAPPER.copy() + .setSerializationInclusion(JsonInclude.Include.ALWAYS); } static class ExitStatusDeserializer extends StdDeserializer { @@ -111,10 +116,17 @@ public void serialize(UUID value, JsonGenerator gen, SerializerProvider provider } @Bean + @Primary public ObjectMapper objectMapper() { return OBJECT_MAPPER; } + @Bean + @Qualifier("entityObjectMapper") + public ObjectMapper entityObjectMapper() { + return ENTITY_OBJECT_MAPPER; + } + @Override public ObjectMapper get() { return OBJECT_MAPPER; diff --git a/src/main/java/org/folio/des/config/ServiceConfiguration.java b/src/main/java/org/folio/des/config/ServiceConfiguration.java index b3f44566..42f037c0 100644 --- a/src/main/java/org/folio/des/config/ServiceConfiguration.java +++ b/src/main/java/org/folio/des/config/ServiceConfiguration.java @@ -14,8 +14,8 @@ import org.folio.des.mapper.BaseExportConfigMapper; import org.folio.des.mapper.DefaultExportConfigMapper; import org.folio.des.mapper.ExportConfigMapperResolver; -import org.folio.des.mapper.aqcuisition.ClaimsExportConfigMapper; -import org.folio.des.mapper.aqcuisition.EdifactExportConfigMapper; +import org.folio.des.mapper.acquisition.ClaimsExportConfigMapper; +import org.folio.des.mapper.acquisition.EdifactExportConfigMapper; import org.folio.des.repository.ExportConfigRepository; import org.folio.des.domain.dto.ExportType; import org.folio.des.domain.dto.ExportTypeSpecificParameters; diff --git a/src/main/java/org/folio/des/mapper/BaseExportConfigMapper.java b/src/main/java/org/folio/des/mapper/BaseExportConfigMapper.java index beb73128..61dc28fb 100644 --- a/src/main/java/org/folio/des/mapper/BaseExportConfigMapper.java +++ b/src/main/java/org/folio/des/mapper/BaseExportConfigMapper.java @@ -12,23 +12,17 @@ import org.mapstruct.Mapper; import org.mapstruct.Mapping; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; -import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.databind.ObjectMapper; -import jakarta.annotation.PostConstruct; - @Mapper(implementationName = "DefaultExportConfigMapper", imports = {ExportConfigConstants.class, ExportTypeSpecificParameters.class, ExportTypeSpecificParametersWithLegacyBursar.class}) public abstract class BaseExportConfigMapper { @Autowired + @Qualifier("entityObjectMapper") protected ObjectMapper objectMapper; - @PostConstruct - public void init() { - objectMapper = objectMapper.copy().setSerializationInclusion(JsonInclude.Include.ALWAYS); - } - @Mapping(target = "configName", expression = "java(getConfigName(dto))") @Mapping(target = "exportTypeSpecificParameters", expression = "java(objectMapper.convertValue(dto.getExportTypeSpecificParameters(), ExportTypeSpecificParameters.class))") @Mapping(target = "createdDate", ignore = true) diff --git a/src/main/java/org/folio/des/mapper/aqcuisition/ClaimsExportConfigMapper.java b/src/main/java/org/folio/des/mapper/acquisition/ClaimsExportConfigMapper.java similarity index 87% rename from src/main/java/org/folio/des/mapper/aqcuisition/ClaimsExportConfigMapper.java rename to src/main/java/org/folio/des/mapper/acquisition/ClaimsExportConfigMapper.java index 8b4f3ae9..8f1bca6a 100644 --- a/src/main/java/org/folio/des/mapper/aqcuisition/ClaimsExportConfigMapper.java +++ b/src/main/java/org/folio/des/mapper/acquisition/ClaimsExportConfigMapper.java @@ -1,4 +1,4 @@ -package org.folio.des.mapper.aqcuisition; +package org.folio.des.mapper.acquisition; import org.folio.des.domain.dto.ExportConfig; import org.folio.des.domain.dto.ExportTypeSpecificParameters; @@ -26,7 +26,10 @@ protected void validateConfig(ExportConfig exportConfig) { @Override protected String getConfigName(ExportConfig exportConfig) { var ediOrdersExportConfig = exportConfig.getExportTypeSpecificParameters().getVendorEdiOrdersExportConfig(); - return exportConfig.getType().getValue() + "_" + ediOrdersExportConfig.getVendorId().toString() + "_" + exportConfig.getId(); + return "%s_%s_%s".formatted( + exportConfig.getType().getValue(), + ediOrdersExportConfig.getVendorId(), + exportConfig.getId()); } } diff --git a/src/main/java/org/folio/des/mapper/aqcuisition/EdifactExportConfigMapper.java b/src/main/java/org/folio/des/mapper/acquisition/EdifactExportConfigMapper.java similarity index 88% rename from src/main/java/org/folio/des/mapper/aqcuisition/EdifactExportConfigMapper.java rename to src/main/java/org/folio/des/mapper/acquisition/EdifactExportConfigMapper.java index 48c5e002..9e25166c 100644 --- a/src/main/java/org/folio/des/mapper/aqcuisition/EdifactExportConfigMapper.java +++ b/src/main/java/org/folio/des/mapper/acquisition/EdifactExportConfigMapper.java @@ -1,4 +1,4 @@ -package org.folio.des.mapper.aqcuisition; +package org.folio.des.mapper.acquisition; import java.util.Objects; import java.util.Optional; @@ -16,7 +16,6 @@ import org.mapstruct.Mapper; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.validation.BeanPropertyBindingResult; -import org.springframework.validation.Errors; import lombok.extern.log4j.Log4j2; @@ -33,7 +32,10 @@ public abstract class EdifactExportConfigMapper extends BaseExportConfigMapper { protected void validateConfig(ExportConfig exportConfig) { var errors = new BeanPropertyBindingResult(exportConfig.getExportTypeSpecificParameters(), "specificParameters"); validator.validate(exportConfig.getExportTypeSpecificParameters(), errors); + normalizeScheduledParameterIds(exportConfig); + } + private void normalizeScheduledParameterIds(ExportConfig exportConfig) { var ediOrdersExportConfig = exportConfig.getExportTypeSpecificParameters().getVendorEdiOrdersExportConfig(); Optional.ofNullable(ediOrdersExportConfig.getEdiSchedule()) .map(EdiSchedule::getScheduleParameters) @@ -51,7 +53,10 @@ private boolean isScheduledParameterIdNotValid(ExportConfig exportConfig, Schedu @Override protected String getConfigName(ExportConfig exportConfig) { var ediOrdersExportConfig = exportConfig.getExportTypeSpecificParameters().getVendorEdiOrdersExportConfig(); - return exportConfig.getType().getValue() + "_" + ediOrdersExportConfig.getVendorId().toString() + "_" + exportConfig.getId(); + return "%s_%s_%s".formatted( + exportConfig.getType().getValue(), + ediOrdersExportConfig.getVendorId(), + exportConfig.getId()); } } diff --git a/src/test/java/org/folio/des/mapper/ExportConfigMapperResolverTest.java b/src/test/java/org/folio/des/mapper/ExportConfigMapperResolverTest.java index fe6a2518..2a8f0709 100644 --- a/src/test/java/org/folio/des/mapper/ExportConfigMapperResolverTest.java +++ b/src/test/java/org/folio/des/mapper/ExportConfigMapperResolverTest.java @@ -10,8 +10,8 @@ import org.folio.des.CopilotGenerated; import org.folio.des.domain.dto.ExportType; -import org.folio.des.mapper.aqcuisition.ClaimsExportConfigMapper; -import org.folio.des.mapper.aqcuisition.EdifactExportConfigMapper; +import org.folio.des.mapper.acquisition.ClaimsExportConfigMapper; +import org.folio.des.mapper.acquisition.EdifactExportConfigMapper; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; diff --git a/src/test/java/org/folio/des/mapper/acquisition/ClaimsExportConfigMapperTest.java b/src/test/java/org/folio/des/mapper/acquisition/ClaimsExportConfigMapperTest.java index 5beefc68..137917ac 100644 --- a/src/test/java/org/folio/des/mapper/acquisition/ClaimsExportConfigMapperTest.java +++ b/src/test/java/org/folio/des/mapper/acquisition/ClaimsExportConfigMapperTest.java @@ -18,8 +18,6 @@ import org.folio.des.domain.dto.ExportType; import org.folio.des.domain.dto.ExportTypeSpecificParameters; import org.folio.des.domain.dto.VendorEdiOrdersExportConfig; -import org.folio.des.mapper.aqcuisition.ClaimsExportConfigMapper; -import org.folio.des.mapper.aqcuisition.ClaimsExportConfigMapperImpl; import org.folio.des.validator.acquisition.ClaimsExportParametersValidator; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; diff --git a/src/test/java/org/folio/des/mapper/acquisition/EdifactExportConfigMapperTest.java b/src/test/java/org/folio/des/mapper/acquisition/EdifactExportConfigMapperTest.java index fdfe66b0..51d06689 100644 --- a/src/test/java/org/folio/des/mapper/acquisition/EdifactExportConfigMapperTest.java +++ b/src/test/java/org/folio/des/mapper/acquisition/EdifactExportConfigMapperTest.java @@ -17,8 +17,6 @@ import org.folio.des.domain.dto.ExportTypeSpecificParameters; import org.folio.des.domain.dto.ScheduleParameters; import org.folio.des.domain.dto.VendorEdiOrdersExportConfig; -import org.folio.des.mapper.aqcuisition.EdifactExportConfigMapper; -import org.folio.des.mapper.aqcuisition.EdifactExportConfigMapperImpl; import org.folio.des.validator.acquisition.EdifactOrdersExportParametersValidator; import org.folio.des.validator.acquisition.EdifactOrdersScheduledParamsValidator; import org.junit.jupiter.api.DisplayName; diff --git a/src/test/java/org/folio/des/service/config/acquisition/ClaimsExportServiceTest.java b/src/test/java/org/folio/des/service/config/acquisition/ClaimsExportServiceTest.java index fd89e199..7b76e3e8 100644 --- a/src/test/java/org/folio/des/service/config/acquisition/ClaimsExportServiceTest.java +++ b/src/test/java/org/folio/des/service/config/acquisition/ClaimsExportServiceTest.java @@ -16,7 +16,7 @@ import org.folio.des.domain.dto.VendorEdiOrdersExportConfig; import org.folio.des.mapper.DefaultExportConfigMapper; import org.folio.des.mapper.ExportConfigMapperResolver; -import org.folio.des.mapper.aqcuisition.ClaimsExportConfigMapperImpl; +import org.folio.des.mapper.acquisition.ClaimsExportConfigMapperImpl; import org.folio.des.repository.ExportConfigRepository; import org.folio.des.validator.ExportConfigValidatorResolver; import org.folio.des.validator.acquisition.ClaimsExportParametersValidator; @@ -53,9 +53,8 @@ void setUp() { var defaultExportConfigMapper = new DefaultExportConfigMapper(); var claimsExportConfigMapper = new ClaimsExportConfigMapperImpl(); var exportConfigMapperResolver = new ExportConfigMapperResolver(Map.of(ExportType.CLAIMS, claimsExportConfigMapper), defaultExportConfigMapper); - setInternalState(claimsExportConfigMapper, "objectMapper", new JacksonConfiguration().get()); + setInternalState(claimsExportConfigMapper, "objectMapper", new JacksonConfiguration().entityObjectMapper()); setInternalState(claimsExportConfigMapper, "validator", validator); - claimsExportConfigMapper.init(); repository = Mockito.mock(ExportConfigRepository.class); service = new ClaimsExportService(repository, claimsExportConfigMapper, exportConfigMapperResolver, exportConfigValidatorResolver); diff --git a/src/test/java/org/folio/des/service/config/acquisition/EdifactOrdersExportServiceTest.java b/src/test/java/org/folio/des/service/config/acquisition/EdifactOrdersExportServiceTest.java index fc849695..0a9218b4 100644 --- a/src/test/java/org/folio/des/service/config/acquisition/EdifactOrdersExportServiceTest.java +++ b/src/test/java/org/folio/des/service/config/acquisition/EdifactOrdersExportServiceTest.java @@ -20,7 +20,7 @@ import org.folio.des.domain.dto.VendorEdiOrdersExportConfig; import org.folio.des.mapper.DefaultExportConfigMapper; import org.folio.des.mapper.ExportConfigMapperResolver; -import org.folio.des.mapper.aqcuisition.EdifactExportConfigMapperImpl; +import org.folio.des.mapper.acquisition.EdifactExportConfigMapperImpl; import org.folio.des.repository.ExportConfigRepository; import org.folio.des.scheduling.ExportJobScheduler; import org.folio.des.validator.ExportConfigValidatorResolver; @@ -63,9 +63,8 @@ void setUp() { var defaultExportConfigMapper = new DefaultExportConfigMapper(); var edifactExportConfigMapper = new EdifactExportConfigMapperImpl(); var exportConfigMapperResolver = new ExportConfigMapperResolver(Map.of(ExportType.EDIFACT_ORDERS_EXPORT, edifactExportConfigMapper), defaultExportConfigMapper); - setInternalState(edifactExportConfigMapper, "objectMapper", new JacksonConfiguration().get()); + setInternalState(edifactExportConfigMapper, "objectMapper", new JacksonConfiguration().entityObjectMapper()); setInternalState(edifactExportConfigMapper, "validator", validator); - edifactExportConfigMapper.init(); repository = Mockito.mock(ExportConfigRepository.class); edifactOrdersExportJobScheduler = Mockito.mock(ExportJobScheduler.class); diff --git a/src/test/java/org/folio/des/service/config/impl/BaseExportConfigServiceTest.java b/src/test/java/org/folio/des/service/config/impl/BaseExportConfigServiceTest.java index 74b1eb98..d24981fd 100644 --- a/src/test/java/org/folio/des/service/config/impl/BaseExportConfigServiceTest.java +++ b/src/test/java/org/folio/des/service/config/impl/BaseExportConfigServiceTest.java @@ -55,8 +55,7 @@ void setUp() { var defaultExportConfigMapper = new DefaultExportConfigMapper(); var exportConfigMapperResolver = new ExportConfigMapperResolver(Map.of(), defaultExportConfigMapper); - setInternalState(defaultExportConfigMapper, "objectMapper", new JacksonConfiguration().get()); - defaultExportConfigMapper.init(); + setInternalState(defaultExportConfigMapper, "objectMapper", new JacksonConfiguration().entityObjectMapper()); repository = Mockito.mock(ExportConfigRepository.class); service = new BaseExportConfigService(repository, defaultExportConfigMapper, exportConfigMapperResolver, exportConfigValidatorResolver); diff --git a/src/test/java/org/folio/des/service/config/impl/BursarFeesFinesExportConfigServiceTest.java b/src/test/java/org/folio/des/service/config/impl/BursarFeesFinesExportConfigServiceTest.java index 205217f5..4ac3532d 100644 --- a/src/test/java/org/folio/des/service/config/impl/BursarFeesFinesExportConfigServiceTest.java +++ b/src/test/java/org/folio/des/service/config/impl/BursarFeesFinesExportConfigServiceTest.java @@ -42,8 +42,7 @@ void setUp() { var defaultExportConfigMapper = new DefaultExportConfigMapper(); var exportConfigMapperResolver = new ExportConfigMapperResolver(Map.of(), defaultExportConfigMapper); - setInternalState(defaultExportConfigMapper, "objectMapper", new JacksonConfiguration().get()); - defaultExportConfigMapper.init(); + setInternalState(defaultExportConfigMapper, "objectMapper", new JacksonConfiguration().entityObjectMapper()); repository = Mockito.mock(ExportConfigRepository.class); bursarExportScheduler = Mockito.mock(BursarExportScheduler.class); From 409549dc2fa32da34f6325ad68a81f9294aa57d8 Mon Sep 17 00:00:00 2001 From: saba_zedginidze Date: Fri, 31 Oct 2025 13:05:50 +0400 Subject: [PATCH 16/21] [MODEXPS-296] Remove mod-configuration verification from InstallUpgradeIT --- .../java/org/folio/des/InstallUpgradeIT.java | 45 ------------------- 1 file changed, 45 deletions(-) diff --git a/src/test/java/org/folio/des/InstallUpgradeIT.java b/src/test/java/org/folio/des/InstallUpgradeIT.java index ed3a4e3b..3efeaad6 100644 --- a/src/test/java/org/folio/des/InstallUpgradeIT.java +++ b/src/test/java/org/folio/des/InstallUpgradeIT.java @@ -54,7 +54,6 @@ class InstallUpgradeIT { .parse("mockserver/mockserver") .withTag("mockserver-" + MockServerClient.class.getPackage().getImplementationVersion()); private static final Network NETWORK = Network.newNetwork(); - private static final String EDIFACT_CONFIG_QUERY = "module==mod-data-export-spring and value==*EDIFACT_ORDERS_EXPORT*"; private static MockServerClient mockServerClient; @Container @@ -122,10 +121,6 @@ void beforeEach() { mockServerClient.when(request("/users").withMethod("PUT")).respond(response().withStatusCode(201)); mockPath(mockServerClient, "/users.*", "{\"users\": []}"); mockPath(mockServerClient, "/perms/users.*", "{\"permissionUsers\": []}"); - mockServerClient.when(request().withPath("/configurations/entries") - .withQueryStringParameter("query", EDIFACT_CONFIG_QUERY).withMethod("GET")) - .respond(response().withStatusCode(200).withContentType(MediaType.APPLICATION_JSON) - .withBody(CONFIGS_RESPONSE)); mockServerClient.when(request()) .respond(response().withStatusCode(200).withContentType(MediaType.APPLICATION_JSON) .withBody("{\"totalRecords\": 0}")); @@ -200,7 +195,6 @@ void upgradeToPoppy() { setTenant("latest"); postTenant(createObjectNode().put("module_to", "3.0.0").put("module_from", "2.1.0")); //existing schedule configurations should be loaded to be scheduled with quartz - verifySchedulingConfigsReloaded(); smokeTest(); } @@ -210,7 +204,6 @@ void upgradeFromPoppy() { setTenant("latest"); postTenant(createObjectNode().put("module_to", "3.1.0").put("module_from", "3.0.0")); // module_from supports quartz scheduling already, no need to reload scheduling configs - verifySchedulingConfigsNotReloaded(); smokeTest(); } @@ -223,7 +216,6 @@ void upgradeFromPoppyWithForcedSchedulesReload() { .put("value", "true")); postTenant(request); //forceSchedulesReload is set to true, so scheduling configs need to be reloaded - verifySchedulingConfigsReloaded(); smokeTest(); } @@ -240,41 +232,4 @@ static void postgresExec(String... command) { } } - private static void verifySchedulingConfigsReloaded() { - verifySchedulingConfigReload(1); - } - - private static void verifySchedulingConfigsNotReloaded() { - verifySchedulingConfigReload(0); - } - - private static void verifySchedulingConfigReload(int times) { - mockServerClient.verify(request() - .withPath("/configurations/entries") - .withMethod("GET") - .withQueryStringParameter("query", "module==mod-data-export-spring and value==*EDIFACT_ORDERS_EXPORT*"), VerificationTimes.exactly(times)); - } - - private static final String CONFIGS_RESPONSE= """ - { - "configs": [ - { - "id": "9fa30f7a-0de4-4067-864a-5449d85b1d65", - "value": "{\\"id\\":\\"5a3cba28-16e7-498e-b73b-98713000298e\\", \\"tenant\\": \\"some_tenant\\", \\"type\\": \\"EDIFACT_ORDERS_EXPORT\\", \\"exportTypeSpecificParameters\\": { \\"vendorEdiOrdersExportConfig\\": {\\"vendorId\\": \\"046b6c7f-0b8a-43b9-b35d-6489e6daee91\\", \\"configName\\": \\"edi_config\\", \\"ediSchedule\\": {\\"enableScheduledExport\\": true, \\"scheduleParameters\\": {\\"scheduleFrequency\\": 1, \\"schedulePeriod\\": \\"WEEK\\", \\"weekDays\\":[\\"SUNDAY\\"], \\"scheduleTime\\": \\"15:30:00\\"}}}}, \\"schedulePeriod\\": \\"HOUR\\"}", - "module": "mod-data-export-spring", - "default": true, - "enabled": true, - "metadata": { - "createdDate": "2023-04-30T12:56:26.211Z", - "updatedDate": "2023-05-04T21:41:53.887Z", - "createdByUserId": "850e9737-1b60-5553-9423-a6f6251aeb0b", - "updatedByUserId": "850e9737-1b60-5553-9423-a6f6251aeb0b" - }, - "configName": "EDIFACT_ORDERS_EXPORT_e0fb5df2-cdf1-11e8-a8d5-f2801f1b9fd1_9fa30f7a-0de4-4067-864a-5449d85b1d65", - "description": "Edifact orders export configuration parameters" - } - ], - "totalRecords": 1 - } - """; } From 16829ae66e5869823cdf657466684076545939cf Mon Sep 17 00:00:00 2001 From: saba_zedginidze Date: Fri, 31 Oct 2025 13:38:08 +0400 Subject: [PATCH 17/21] [MODEXPS-296] Fix sonar issues --- src/test/java/org/folio/des/InstallUpgradeIT.java | 1 - .../folio/des/mapper/ExportConfigMapperResolverTest.java | 7 ++++--- .../config/acquisition/ClaimsExportServiceTest.java | 3 +++ .../service/config/impl/BaseExportConfigServiceTest.java | 2 ++ 4 files changed, 9 insertions(+), 4 deletions(-) diff --git a/src/test/java/org/folio/des/InstallUpgradeIT.java b/src/test/java/org/folio/des/InstallUpgradeIT.java index 3efeaad6..64e51c54 100644 --- a/src/test/java/org/folio/des/InstallUpgradeIT.java +++ b/src/test/java/org/folio/des/InstallUpgradeIT.java @@ -13,7 +13,6 @@ import org.junit.jupiter.api.Test; import org.mockserver.client.MockServerClient; import org.mockserver.model.MediaType; -import org.mockserver.verify.VerificationTimes; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.test.annotation.DirtiesContext; diff --git a/src/test/java/org/folio/des/mapper/ExportConfigMapperResolverTest.java b/src/test/java/org/folio/des/mapper/ExportConfigMapperResolverTest.java index 2a8f0709..656a84cb 100644 --- a/src/test/java/org/folio/des/mapper/ExportConfigMapperResolverTest.java +++ b/src/test/java/org/folio/des/mapper/ExportConfigMapperResolverTest.java @@ -5,6 +5,7 @@ import static org.mockito.Mockito.mock; import static org.mockito.Mockito.verifyNoInteractions; +import java.util.EnumMap; import java.util.HashMap; import java.util.Map; @@ -31,11 +32,11 @@ class ExportConfigMapperResolverTest { private DefaultExportConfigMapper defaultMapper; private ExportConfigMapperResolver resolver; - private Map mappers; + private EnumMap mappers; @BeforeEach void setUp() { - mappers = new HashMap<>(); + mappers = new EnumMap<>(ExportType.class); } @Test @@ -106,7 +107,7 @@ void testHandleNullExportType() { @DisplayName("Should return default mapper when map is empty") void testReturnDefaultMapperWhenMapIsEmpty() { // Given - resolver = new ExportConfigMapperResolver(new HashMap<>(), defaultMapper); + resolver = new ExportConfigMapperResolver(new EnumMap<>(ExportType.class), defaultMapper); // When BaseExportConfigMapper result = resolver.resolve(ExportType.EDIFACT_ORDERS_EXPORT); diff --git a/src/test/java/org/folio/des/service/config/acquisition/ClaimsExportServiceTest.java b/src/test/java/org/folio/des/service/config/acquisition/ClaimsExportServiceTest.java index 7b76e3e8..b456079c 100644 --- a/src/test/java/org/folio/des/service/config/acquisition/ClaimsExportServiceTest.java +++ b/src/test/java/org/folio/des/service/config/acquisition/ClaimsExportServiceTest.java @@ -3,6 +3,7 @@ import static org.folio.des.support.TestUtils.setInternalState; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; import java.util.Map; @@ -77,6 +78,8 @@ void testUpdateConfig() { .thenReturn(java.util.Optional.of(new ExportConfigEntity())); service.updateConfig(CLAIMS_EXPORT_CONFIG.getId(), CLAIMS_EXPORT_CONFIG); + + verify(repository).save(any()); } } diff --git a/src/test/java/org/folio/des/service/config/impl/BaseExportConfigServiceTest.java b/src/test/java/org/folio/des/service/config/impl/BaseExportConfigServiceTest.java index d24981fd..6193cb35 100644 --- a/src/test/java/org/folio/des/service/config/impl/BaseExportConfigServiceTest.java +++ b/src/test/java/org/folio/des/service/config/impl/BaseExportConfigServiceTest.java @@ -101,6 +101,8 @@ void testUpdateConfig() { .thenReturn(java.util.Optional.of(new ExportConfigEntity())); service.updateConfig(exportConfig.getId(), exportConfig); + + verify(repository).save(any()); } @Test From 32b315dee2c1cc0d080e1ee6528cdadfe01e6a09 Mon Sep 17 00:00:00 2001 From: saba_zedginidze Date: Fri, 31 Oct 2025 13:39:58 +0400 Subject: [PATCH 18/21] [MODEXPS-296] Fix TestUtils indentation --- .../java/org/folio/des/support/TestUtils.java | 68 +++++++++---------- 1 file changed, 34 insertions(+), 34 deletions(-) diff --git a/src/test/java/org/folio/des/support/TestUtils.java b/src/test/java/org/folio/des/support/TestUtils.java index f7121eae..1e278758 100644 --- a/src/test/java/org/folio/des/support/TestUtils.java +++ b/src/test/java/org/folio/des/support/TestUtils.java @@ -17,39 +17,39 @@ @UtilityClass public class TestUtils { - public static ExportConfig getBursarExportConfig() { - return new ExportConfig() - .id(UUID.randomUUID().toString()) - .exportTypeSpecificParameters(new ExportTypeSpecificParameters() - .bursarFeeFines(new BursarExportJob() - .filter(new BursarExportFilterCondition() - .criteria(new ArrayList<>(List.of( - new BursarExportFilterAge().numDays(1), - new BursarExportFilterPatronGroup().patronGroupId(UUID.fromString("0000-00-00-00-000000"))))) - .operation(BursarExportFilterCondition.OperationEnum.AND)))); - } - - public static void setInternalState(Object target, String field, Object value) { - Class c = target.getClass(); - try { - var f = getDeclaredFieldRecursive(field, c); - f.setAccessible(true); - f.set(target, value); - } catch (Exception e) { - throw new RuntimeException( - "Unable to set internal state on a private field. [...]", e); - } - } - - private static Field getDeclaredFieldRecursive(String field, Class cls) { - try { - return cls.getDeclaredField(field); - } catch (NoSuchFieldException e) { - if (cls.getSuperclass() != null) { - return getDeclaredFieldRecursive(field, cls.getSuperclass()); - } - throw new RuntimeException(String.format("Unable to find field: %s for class: %s", field, cls.getName()), e); - } - } + public static ExportConfig getBursarExportConfig() { + return new ExportConfig() + .id(UUID.randomUUID().toString()) + .exportTypeSpecificParameters(new ExportTypeSpecificParameters() + .bursarFeeFines(new BursarExportJob() + .filter(new BursarExportFilterCondition() + .criteria(new ArrayList<>(List.of( + new BursarExportFilterAge().numDays(1), + new BursarExportFilterPatronGroup().patronGroupId(UUID.fromString("0000-00-00-00-000000"))))) + .operation(BursarExportFilterCondition.OperationEnum.AND)))); + } + + public static void setInternalState(Object target, String field, Object value) { + Class c = target.getClass(); + try { + var f = getDeclaredFieldRecursive(field, c); + f.setAccessible(true); + f.set(target, value); + } catch (Exception e) { + throw new RuntimeException( + "Unable to set internal state on a private field. [...]", e); + } + } + + private static Field getDeclaredFieldRecursive(String field, Class cls) { + try { + return cls.getDeclaredField(field); + } catch (NoSuchFieldException e) { + if (cls.getSuperclass() != null) { + return getDeclaredFieldRecursive(field, cls.getSuperclass()); + } + throw new RuntimeException(String.format("Unable to find field: %s for class: %s", field, cls.getName()), e); + } + } } From 2613e3fe794e1a242a98650e1ca5081ab659ec25 Mon Sep 17 00:00:00 2001 From: saba_zedginidze Date: Mon, 3 Nov 2025 12:37:33 +0400 Subject: [PATCH 19/21] [MODEXPS-296] Address comments and fix filtering --- descriptors/ModuleDescriptor-template.json | 44 +++---------------- pom.xml | 3 ++ .../folio/de/entity/ExportConfigEntity.java | 8 +--- .../config/impl/BaseExportConfigService.java | 3 +- .../23_10_2025_create_export_config_table.xml | 8 +++- .../mapper/DefaultExportConfigMapperTest.java | 2 +- .../ExportConfigMapperResolverTest.java | 2 - .../ClaimsExportConfigMapperTest.java | 2 +- .../EdifactExportConfigMapperTest.java | 2 +- 9 files changed, 21 insertions(+), 53 deletions(-) diff --git a/descriptors/ModuleDescriptor-template.json b/descriptors/ModuleDescriptor-template.json index de1eb115..5ba553c5 100644 --- a/descriptors/ModuleDescriptor-template.json +++ b/descriptors/ModuleDescriptor-template.json @@ -26,10 +26,6 @@ "id": "circulation-logs", "version": "1.2" }, - { - "id": "configuration", - "version": "2.0" - }, { "id" : "bulk-edit", "version": "4.1" @@ -83,11 +79,6 @@ "feesfines.accounts-bulk.transfer.post", "accounts.collection.get", "circulation-logs.collection.get", - "configuration.entries.collection.get", - "configuration.entries.item.get", - "configuration.entries.item.post", - "configuration.entries.item.put", - "configuration.entries.item.delete", "data-export.job.collection.get", "data-export.config.collection.get", "feefineactions.collection.get", @@ -138,9 +129,7 @@ "permissionsRequired": [ "data-export.config.collection.get" ], - "modulePermissions": [ - "configuration.entries.collection.get" - ] + "modulePermissions": [] }, { "methods": [ @@ -150,9 +139,7 @@ "permissionsRequired": [ "data-export.config.item.get" ], - "modulePermissions": [ - "configuration.entries.item.get" - ] + "modulePermissions": [] }, { "methods": [ @@ -162,9 +149,7 @@ "permissionsRequired": [ "data-export.config.item.post" ], - "modulePermissions": [ - "configuration.entries.item.post" - ] + "modulePermissions": [] }, { "methods": [ @@ -174,9 +159,7 @@ "permissionsRequired": [ "data-export.config.item.put" ], - "modulePermissions": [ - "configuration.entries.item.put" - ] + "modulePermissions": [] }, { "methods": [ @@ -186,9 +169,7 @@ "permissionsRequired": [ "data-export.config.item.delete" ], - "modulePermissions": [ - "configuration.entries.item.delete" - ] + "modulePermissions": [] }, { "methods": [ @@ -203,11 +184,6 @@ "feesfines.accounts-bulk.transfer.post", "accounts.collection.get", "circulation-logs.collection.get", - "configuration.entries.collection.get", - "configuration.entries.item.get", - "configuration.entries.item.post", - "configuration.entries.item.put", - "configuration.entries.item.delete", "data-export.job.collection.get", "data-export.config.collection.get", "feefineactions.collection.get", @@ -296,9 +272,6 @@ "login.item.delete", "perms.users.item.post", "perms.users.get", - "configuration.entries.collection.get", - "configuration.entries.item.post", - "configuration.entries.item.put", "perms.users.assign.immutable", "data-export.job.collection.get", "data-export.config.collection.get" @@ -413,8 +386,6 @@ "displayName": "Edifact export create permission", "description": "Edifact export create permission", "subPermissions": [ - "configuration.entries.collection.get", - "configuration.entries.item.get", "data-export.job.item.post", "finance.expense-classes.item.get", "inventory-storage.holdings.item.get", @@ -476,11 +447,6 @@ "feesfines.accounts-bulk.transfer.post", "accounts.collection.get", "circulation-logs.collection.get", - "configuration.entries.collection.get", - "configuration.entries.item.get", - "configuration.entries.item.post", - "configuration.entries.item.put", - "configuration.entries.item.delete", "data-export.job.collection.get", "data-export.config.collection.get", "feefineactions.collection.get", diff --git a/pom.xml b/pom.xml index e5248167..218d5da3 100644 --- a/pom.xml +++ b/pom.xml @@ -56,6 +56,7 @@ 1.0.1 3.0.0-M7 3.0.0-M7 + 3.14.1 **/src/main/java/org/folio/des/ModDataExportSpringApplication.java, @@ -296,7 +297,9 @@ org.apache.maven.plugins maven-compiler-plugin + ${maven-compiler-plugin.version} + ${java.version} org.projectlombok diff --git a/src/main/java/org/folio/de/entity/ExportConfigEntity.java b/src/main/java/org/folio/de/entity/ExportConfigEntity.java index 63bf19a2..f9b5a40c 100644 --- a/src/main/java/org/folio/de/entity/ExportConfigEntity.java +++ b/src/main/java/org/folio/de/entity/ExportConfigEntity.java @@ -4,14 +4,11 @@ import java.util.UUID; import org.folio.de.entity.base.AuditableEntity; -import org.folio.des.domain.dto.ExportType; import org.hibernate.annotations.Type; import io.hypersistence.utils.hibernate.type.json.JsonBinaryType; import jakarta.persistence.Column; import jakarta.persistence.Entity; -import jakarta.persistence.EnumType; -import jakarta.persistence.Enumerated; import jakarta.persistence.Id; import jakarta.persistence.Table; import lombok.Data; @@ -19,7 +16,7 @@ import lombok.experimental.Accessors; @Entity -@Table(name = "export_configs") +@Table(name = "export_config") @Data @Accessors(chain = true) @EqualsAndHashCode(callSuper = true) @@ -32,9 +29,8 @@ public class ExportConfigEntity extends AuditableEntity { @Column(name = "config_name", nullable = false) private String configName; - @Enumerated(EnumType.STRING) @Column(name = "type", nullable = false) - private ExportType type; + private String type; @Column(name = "tenant", nullable = false) private String tenant; diff --git a/src/main/java/org/folio/des/service/config/impl/BaseExportConfigService.java b/src/main/java/org/folio/des/service/config/impl/BaseExportConfigService.java index aaf0fd96..0a88b1ca 100644 --- a/src/main/java/org/folio/des/service/config/impl/BaseExportConfigService.java +++ b/src/main/java/org/folio/des/service/config/impl/BaseExportConfigService.java @@ -6,6 +6,7 @@ import java.util.UUID; import org.folio.de.entity.ExportConfigEntity; +import org.folio.des.domain.dto.ExportType; import org.folio.des.mapper.BaseExportConfigMapper; import org.folio.des.mapper.ExportConfigMapperResolver; import org.folio.des.domain.dto.ExportConfig; @@ -92,7 +93,7 @@ public void deleteConfigById(String configId) { @SneakyThrows protected ExportConfig toDto(ExportConfigEntity exportConfigEntity) { - return exportConfigMapperResolver.resolve(exportConfigEntity.getType()).toDto(exportConfigEntity); + return exportConfigMapperResolver.resolve(ExportType.fromValue(exportConfigEntity.getType())).toDto(exportConfigEntity); } protected void validateIncomingExportConfig(ExportConfig exportConfig) { diff --git a/src/main/resources/db/changelog/changes/23_10_2025_create_export_config_table.xml b/src/main/resources/db/changelog/changes/23_10_2025_create_export_config_table.xml index 84d62557..8803572f 100644 --- a/src/main/resources/db/changelog/changes/23_10_2025_create_export_config_table.xml +++ b/src/main/resources/db/changelog/changes/23_10_2025_create_export_config_table.xml @@ -6,13 +6,13 @@ - + - + @@ -35,6 +35,10 @@ + + CREATE INDEX idx_export_config_type_gin_trgm ON export_config USING GIN (type gin_trgm_ops); + + diff --git a/src/test/java/org/folio/des/mapper/DefaultExportConfigMapperTest.java b/src/test/java/org/folio/des/mapper/DefaultExportConfigMapperTest.java index 7637369f..1934958a 100644 --- a/src/test/java/org/folio/des/mapper/DefaultExportConfigMapperTest.java +++ b/src/test/java/org/folio/des/mapper/DefaultExportConfigMapperTest.java @@ -65,7 +65,7 @@ void testToDto() { UUID id = UUID.randomUUID(); ExportConfigEntity entity = new ExportConfigEntity(); entity.setId(id); - entity.setType(ExportType.BURSAR_FEES_FINES); + entity.setType(ExportType.BURSAR_FEES_FINES.getValue()); entity.setTenant("test-tenant"); entity.setConfigName("test-config"); entity.setScheduleFrequency(7); diff --git a/src/test/java/org/folio/des/mapper/ExportConfigMapperResolverTest.java b/src/test/java/org/folio/des/mapper/ExportConfigMapperResolverTest.java index 656a84cb..a9d1cd78 100644 --- a/src/test/java/org/folio/des/mapper/ExportConfigMapperResolverTest.java +++ b/src/test/java/org/folio/des/mapper/ExportConfigMapperResolverTest.java @@ -6,8 +6,6 @@ import static org.mockito.Mockito.verifyNoInteractions; import java.util.EnumMap; -import java.util.HashMap; -import java.util.Map; import org.folio.des.CopilotGenerated; import org.folio.des.domain.dto.ExportType; diff --git a/src/test/java/org/folio/des/mapper/acquisition/ClaimsExportConfigMapperTest.java b/src/test/java/org/folio/des/mapper/acquisition/ClaimsExportConfigMapperTest.java index 137917ac..8f42d741 100644 --- a/src/test/java/org/folio/des/mapper/acquisition/ClaimsExportConfigMapperTest.java +++ b/src/test/java/org/folio/des/mapper/acquisition/ClaimsExportConfigMapperTest.java @@ -80,7 +80,7 @@ void testToDto() { UUID id = UUID.randomUUID(); ExportConfigEntity entity = new ExportConfigEntity(); entity.setId(id); - entity.setType(ExportType.EDIFACT_ORDERS_EXPORT); + entity.setType(ExportType.EDIFACT_ORDERS_EXPORT.getValue()); entity.setTenant("test-tenant"); entity.setConfigName("test-config"); diff --git a/src/test/java/org/folio/des/mapper/acquisition/EdifactExportConfigMapperTest.java b/src/test/java/org/folio/des/mapper/acquisition/EdifactExportConfigMapperTest.java index 51d06689..6fae5974 100644 --- a/src/test/java/org/folio/des/mapper/acquisition/EdifactExportConfigMapperTest.java +++ b/src/test/java/org/folio/des/mapper/acquisition/EdifactExportConfigMapperTest.java @@ -78,7 +78,7 @@ void testToDto() { UUID id = UUID.randomUUID(); ExportConfigEntity entity = new ExportConfigEntity(); entity.setId(id); - entity.setType(ExportType.EDIFACT_ORDERS_EXPORT); + entity.setType(ExportType.EDIFACT_ORDERS_EXPORT.getValue()); entity.setTenant("test-tenant"); entity.setConfigName("test-config"); From 87f968f5b397b30c68853d27e5625e297e9f47f5 Mon Sep 17 00:00:00 2001 From: saba_zedginidze Date: Mon, 3 Nov 2025 13:03:58 +0400 Subject: [PATCH 20/21] [MODEXPS-296] Fix failing tests --- .../changelog/changes/23_10_2025_create_export_config_table.xml | 1 + .../org/folio/des/mapper/DefaultExportConfigMapperTest.java | 2 +- .../des/mapper/acquisition/ClaimsExportConfigMapperTest.java | 2 +- .../des/mapper/acquisition/EdifactExportConfigMapperTest.java | 2 +- 4 files changed, 4 insertions(+), 3 deletions(-) diff --git a/src/main/resources/db/changelog/changes/23_10_2025_create_export_config_table.xml b/src/main/resources/db/changelog/changes/23_10_2025_create_export_config_table.xml index 8803572f..ed196427 100644 --- a/src/main/resources/db/changelog/changes/23_10_2025_create_export_config_table.xml +++ b/src/main/resources/db/changelog/changes/23_10_2025_create_export_config_table.xml @@ -36,6 +36,7 @@ + CREATE EXTENSION IF NOT EXISTS pg_trgm; CREATE INDEX idx_export_config_type_gin_trgm ON export_config USING GIN (type gin_trgm_ops); diff --git a/src/test/java/org/folio/des/mapper/DefaultExportConfigMapperTest.java b/src/test/java/org/folio/des/mapper/DefaultExportConfigMapperTest.java index 1934958a..3bc5f9b8 100644 --- a/src/test/java/org/folio/des/mapper/DefaultExportConfigMapperTest.java +++ b/src/test/java/org/folio/des/mapper/DefaultExportConfigMapperTest.java @@ -50,7 +50,7 @@ void testToEntity() { // Then assertNotNull(entity); assertEquals(UUID.fromString(id), entity.getId()); - assertEquals(ExportType.BURSAR_FEES_FINES, entity.getType()); + assertEquals(ExportType.BURSAR_FEES_FINES.getValue(), entity.getType()); assertEquals("test-tenant", entity.getTenant()); assertEquals(7, entity.getScheduleFrequency()); assertEquals("WEEK", entity.getSchedulePeriod()); diff --git a/src/test/java/org/folio/des/mapper/acquisition/ClaimsExportConfigMapperTest.java b/src/test/java/org/folio/des/mapper/acquisition/ClaimsExportConfigMapperTest.java index 8f42d741..f3cdcd23 100644 --- a/src/test/java/org/folio/des/mapper/acquisition/ClaimsExportConfigMapperTest.java +++ b/src/test/java/org/folio/des/mapper/acquisition/ClaimsExportConfigMapperTest.java @@ -63,7 +63,7 @@ void testToEntity() { // Then assertNotNull(entity); assertEquals(UUID.fromString(exportId), entity.getId()); - assertEquals(ExportType.EDIFACT_ORDERS_EXPORT, entity.getType()); + assertEquals(ExportType.EDIFACT_ORDERS_EXPORT.getValue(), entity.getType()); assertEquals("test-tenant", entity.getTenant()); // Verify config name format: TYPE_VENDORID_EXPORTID diff --git a/src/test/java/org/folio/des/mapper/acquisition/EdifactExportConfigMapperTest.java b/src/test/java/org/folio/des/mapper/acquisition/EdifactExportConfigMapperTest.java index 6fae5974..12c0a5a7 100644 --- a/src/test/java/org/folio/des/mapper/acquisition/EdifactExportConfigMapperTest.java +++ b/src/test/java/org/folio/des/mapper/acquisition/EdifactExportConfigMapperTest.java @@ -61,7 +61,7 @@ void testToEntity() { // Then assertNotNull(entity); assertEquals(UUID.fromString(exportId), entity.getId()); - assertEquals(ExportType.EDIFACT_ORDERS_EXPORT, entity.getType()); + assertEquals(ExportType.EDIFACT_ORDERS_EXPORT.getValue(), entity.getType()); assertEquals("test-tenant", entity.getTenant()); // Verify config name format: TYPE_VENDORID_EXPORTID From dddf74cbae4d5f4fdae57bfcefc93e8f9a40f8ce Mon Sep 17 00:00:00 2001 From: saba_zedginidze Date: Mon, 3 Nov 2025 13:59:24 +0400 Subject: [PATCH 21/21] [MODEXPS-296] Use correct schema --- .../changes/23_10_2025_create_export_config_table.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/resources/db/changelog/changes/23_10_2025_create_export_config_table.xml b/src/main/resources/db/changelog/changes/23_10_2025_create_export_config_table.xml index ed196427..040a0349 100644 --- a/src/main/resources/db/changelog/changes/23_10_2025_create_export_config_table.xml +++ b/src/main/resources/db/changelog/changes/23_10_2025_create_export_config_table.xml @@ -36,8 +36,8 @@ - CREATE EXTENSION IF NOT EXISTS pg_trgm; - CREATE INDEX idx_export_config_type_gin_trgm ON export_config USING GIN (type gin_trgm_ops); + CREATE EXTENSION IF NOT EXISTS pg_trgm SCHEMA public; + CREATE INDEX idx_export_config_type_gin_trgm ON export_config USING GIN (type public.gin_trgm_ops);