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 496dbdc0..218d5da3 100644 --- a/pom.xml +++ b/pom.xml @@ -38,6 +38,9 @@ 4.1.1 1.0.0 3.9.2 + 1.18.42 + 1.6.3 + 0.2.0 4.4 6.2.1 @@ -53,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, @@ -164,9 +168,16 @@ org.projectlombok lombok + ${lombok.version} true + + org.mapstruct + mapstruct + ${mapstruct.version} + + org.apache.logging.log4j log4j-web @@ -283,6 +294,37 @@ + + org.apache.maven.plugins + maven-compiler-plugin + ${maven-compiler-plugin.version} + + ${java.version} + + + org.projectlombok + lombok + ${lombok.version} + + + org.projectlombok + lombok-mapstruct-binding + ${mapstruct-binding.version} + + + org.mapstruct + mapstruct-processor + ${mapstruct.version} + + + + + -Amapstruct.defaultComponentModel=spring + + + + + org.codehaus.mojo versions-maven-plugin 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..f9b5a40c --- /dev/null +++ b/src/main/java/org/folio/de/entity/ExportConfigEntity.java @@ -0,0 +1,55 @@ +package org.folio.de.entity; + +import java.util.List; +import java.util.UUID; + +import org.folio.de.entity.base.AuditableEntity; +import org.hibernate.annotations.Type; + +import io.hypersistence.utils.hibernate.type.json.JsonBinaryType; +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.Id; +import jakarta.persistence.Table; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +@Entity +@Table(name = "export_config") +@Data +@Accessors(chain = true) +@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) + private String configName; + + @Column(name = "type", nullable = false) + private String 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/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/JacksonConfiguration.java b/src/main/java/org/folio/des/config/JacksonConfiguration.java index 1752683d..48e2f163 100644 --- a/src/main/java/org/folio/des/config/JacksonConfiguration.java +++ b/src/main/java/org/folio/des/config/JacksonConfiguration.java @@ -1,28 +1,37 @@ 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.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 = @@ -30,11 +39,14 @@ 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); + ENTITY_OBJECT_MAPPER = OBJECT_MAPPER.copy() + .setSerializationInclusion(JsonInclude.Include.ALWAYS); } static class ExitStatusDeserializer extends StdDeserializer { @@ -92,11 +104,29 @@ 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 + @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 6d8423a2..42f037c0 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.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; -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, + EdifactExportConfigMapper edifactExportConfigMapper, + ExportConfigMapperResolver exportConfigMapperResolver, + ExportConfigValidatorResolver exportConfigValidatorResolver, + ExportJobScheduler exportJobScheduler) { + return new EdifactOrdersExportService(repository, edifactExportConfigMapper, 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, + ClaimsExportConfigMapper claimsExportConfigMapper, + ExportConfigMapperResolver exportConfigMapperResolver, + ExportConfigValidatorResolver exportConfigValidatorResolver) { + return new ClaimsExportService(repository, claimsExportConfigMapper, 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)); } } + 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/converter/aqcuisition/EdifactExportConfigToModelConfigConverter.java b/src/main/java/org/folio/des/converter/aqcuisition/EdifactExportConfigToModelConfigConverter.java deleted file mode 100644 index 02381a22..00000000 --- a/src/main/java/org/folio/des/converter/aqcuisition/EdifactExportConfigToModelConfigConverter.java +++ /dev/null @@ -1,66 +0,0 @@ -package org.folio.des.converter.aqcuisition; - -import static org.folio.des.service.config.ExportConfigConstants.DEFAULT_MODULE_NAME; - -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.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.springframework.validation.BeanPropertyBindingResult; -import org.springframework.validation.Errors; - -import java.util.Objects; -import java.util.Optional; -import java.util.UUID; - -@AllArgsConstructor -@Log4j2 -@Service -public final class EdifactExportConfigToModelConfigConverter implements Converter { - 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; - private EdifactOrdersExportParametersValidator validator; - - @SneakyThrows - @Override - public ModelConfiguration convert(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)) - .ifPresent(scheduleParameters -> { - 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; - } - - private boolean isScheduledParameterIdNotValid(ExportConfig exportConfig, ScheduleParameters scheduleParameters) { - return Objects.isNull(scheduleParameters.getId()) || - !UUID.fromString(exportConfig.getId()).equals(scheduleParameters.getId()); - } -} 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..61dc28fb --- /dev/null +++ b/src/main/java/org/folio/des/mapper/BaseExportConfigMapper.java @@ -0,0 +1,46 @@ +package org.folio.des.mapper; + +import static org.folio.des.service.config.ExportConfigConstants.DEFAULT_CONFIG_NAME; + +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.service.config.ExportConfigConstants; +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.databind.ObjectMapper; + +@Mapper(implementationName = "DefaultExportConfigMapper", imports = {ExportConfigConstants.class, ExportTypeSpecificParameters.class, ExportTypeSpecificParametersWithLegacyBursar.class}) +public abstract class BaseExportConfigMapper { + + @Autowired + @Qualifier("entityObjectMapper") + protected ObjectMapper objectMapper; + + @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) + @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); + + protected String getConfigName(ExportConfig exportConfig) { + return exportConfig.getType() == null || ExportType.BURSAR_FEES_FINES.equals(exportConfig.getType()) + ? DEFAULT_CONFIG_NAME + : exportConfig.getType().getValue(); + } + +} 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/acquisition/ClaimsExportConfigMapper.java b/src/main/java/org/folio/des/mapper/acquisition/ClaimsExportConfigMapper.java new file mode 100644 index 00000000..8f1bca6a --- /dev/null +++ b/src/main/java/org/folio/des/mapper/acquisition/ClaimsExportConfigMapper.java @@ -0,0 +1,35 @@ +package org.folio.des.mapper.acquisition; + +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.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; + +@Mapper(imports = {ExportConfigConstants.class, ExportTypeSpecificParameters.class, ExportTypeSpecificParametersWithLegacyBursar.class}) +public abstract class ClaimsExportConfigMapper extends BaseExportConfigMapper { + + @Autowired + private ClaimsExportParametersValidator validator; + + @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 "%s_%s_%s".formatted( + exportConfig.getType().getValue(), + ediOrdersExportConfig.getVendorId(), + exportConfig.getId()); + } + +} diff --git a/src/main/java/org/folio/des/mapper/acquisition/EdifactExportConfigMapper.java b/src/main/java/org/folio/des/mapper/acquisition/EdifactExportConfigMapper.java new file mode 100644 index 00000000..9e25166c --- /dev/null +++ b/src/main/java/org/folio/des/mapper/acquisition/EdifactExportConfigMapper.java @@ -0,0 +1,62 @@ +package org.folio.des.mapper.acquisition; + +import java.util.Objects; +import java.util.Optional; +import java.util.UUID; + +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.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; + +import lombok.extern.log4j.Log4j2; + +@Log4j2 +@Mapper(imports = {ExportConfigConstants.class, ExportTypeSpecificParameters.class, ExportTypeSpecificParametersWithLegacyBursar.class}) +public abstract class EdifactExportConfigMapper extends BaseExportConfigMapper { + + private static final String INCORRECT_UUID_FOR_SCHEDULED_PARAMETER_MSG = "Incorrect UUID for scheduled parameter provided and will be replaced with : {}"; + + @Autowired + private EdifactOrdersExportParametersValidator validator; + + @BeforeMapping + 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) + .filter(scheduleParameters -> isScheduledParameterIdNotValid(exportConfig, scheduleParameters)) + .ifPresent(scheduleParameters -> { + log.warn(INCORRECT_UUID_FOR_SCHEDULED_PARAMETER_MSG, exportConfig.getId()); + scheduleParameters.setId(UUID.fromString(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 "%s_%s_%s".formatted( + exportConfig.getType().getValue(), + ediOrdersExportConfig.getVendorId(), + exportConfig.getId()); + } + +} 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/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..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,14 +4,19 @@ 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); 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..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,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, BaseExportConfigMapper defaultExportConfigMapper, + ExportConfigMapperResolver exportConfigMapperResolver, ExportConfigValidatorResolver exportConfigValidatorResolver) { + super(repository, defaultExportConfigMapper, exportConfigMapperResolver, exportConfigValidatorResolver); } @Override @@ -31,13 +30,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 bbabd3f3..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,12 +3,12 @@ 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 +20,10 @@ public class EdifactOrdersExportService extends BaseExportConfigService { private final ExportJobScheduler exportJobScheduler; - public EdifactOrdersExportService(ConfigurationClient client, - DefaultModelConfigToExportConfigConverter defaultModelConfigToExportConfigConverter, - ExportConfigConverterResolver exportConfigConverterResolver, - ExportConfigValidatorResolver exportConfigValidatorResolver, + public EdifactOrdersExportService(ExportConfigRepository repository, BaseExportConfigMapper defaultExportConfigMapper, + ExportConfigMapperResolver exportConfigMapperResolver, ExportConfigValidatorResolver exportConfigValidatorResolver, ExportJobScheduler exportJobScheduler) { - super(client, defaultModelConfigToExportConfigConverter, exportConfigConverterResolver, exportConfigValidatorResolver); + super(repository, defaultExportConfigMapper, exportConfigMapperResolver, exportConfigValidatorResolver); this.exportJobScheduler = exportJobScheduler; } @@ -38,16 +36,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 dbc7bdbe..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 @@ -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.domain.dto.ExportType; +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; 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 BaseExportConfigMapper exportConfigMapper; + 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 = exportConfigMapper.toEntity(exportConfig); + repository.save(entity); + log.info("updateConfig:: Successfully updated config with id={}", configId); } @Override - public ModelConfiguration postConfig(ExportConfig exportConfig) { - log.info("Posting {}.", exportConfig); + @Transactional + public ExportConfig postConfig(ExportConfig 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 = exportConfigMapper.toEntity(exportConfig); + entity = repository.save(entity); + log.info("postConfig:: Successfully created config with id={}", exportConfig.getId()); + + return toDto(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(exportConfigMapper::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(exportConfigMapper::toDto) + .findFirst(); + } + + @Override + public ExportConfig getConfigById(String configId) { + return repository.findById(UUID.fromString(configId)) + .map(exportConfigMapper::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 ExportConfig toDto(ExportConfigEntity exportConfigEntity) { + return exportConfigMapperResolver.resolve(ExportType.fromValue(exportConfigEntity.getType())).toDto(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..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 @@ -6,16 +6,16 @@ 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.de.entity.ExportConfigEntity; +import org.folio.des.mapper.DefaultExportConfigMapper; +import org.folio.des.mapper.ExportConfigMapperResolver; +import org.folio.des.domain.dto.ExportConfigWithLegacyBursar; +import org.folio.des.repository.ExportConfigRepository; import org.folio.des.domain.dto.ExportConfig; import org.folio.des.domain.dto.ExportConfigCollection; -import org.folio.des.domain.dto.ExportConfigWithLegacyBursar; -import org.folio.des.domain.dto.ModelConfiguration; 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 +24,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; } @@ -40,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 @@ -56,22 +55,17 @@ public ExportConfigCollection getConfigCollection(String query, Integer limit) { @Override public Optional getFirstConfig() { - return getFirstConfigGeneric(defaultModelConfigToExportConfigConverter::convert); + return getFirstConfigGeneric(exportConfigMapper::toDto); } public Optional getFirstConfigLegacy() { - return getFirstConfigGeneric(defaultModelConfigToExportConfigConverter::convertLegacy); + return getFirstConfigGeneric(exportConfigMapper::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..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 @@ -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,16 +16,12 @@ 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; -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; -import org.folio.spring.exception.NotFoundException; import lombok.AllArgsConstructor; import lombok.extern.log4j.Log4j2; @@ -43,10 +36,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,12 +45,12 @@ 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) { + public ExportConfig postConfig(ExportConfig exportConfig) { if (exportConfig.getId() == null) { exportConfig.setId(UUID.randomUUID().toString()); } @@ -129,16 +120,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 +134,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() 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..040a0349 --- /dev/null +++ b/src/main/resources/db/changelog/changes/23_10_2025_create_export_config_table.xml @@ -0,0 +1,46 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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); + + + + + + 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: diff --git a/src/test/java/org/folio/des/InstallUpgradeIT.java b/src/test/java/org/folio/des/InstallUpgradeIT.java index ed3a4e3b..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; @@ -54,7 +53,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 +120,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 +194,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 +203,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 +215,6 @@ void upgradeFromPoppyWithForcedSchedulesReload() { .put("value", "true")); postTenant(request); //forceSchedulesReload is set to true, so scheduling configs need to be reloaded - verifySchedulingConfigsReloaded(); smokeTest(); } @@ -240,41 +231,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 - } - """; } 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/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); + } } 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..3bc5f9b8 --- /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.getValue(), 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.getValue()); + 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..a9d1cd78 --- /dev/null +++ b/src/test/java/org/folio/des/mapper/ExportConfigMapperResolverTest.java @@ -0,0 +1,181 @@ +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.EnumMap; + +import org.folio.des.CopilotGenerated; +import org.folio.des.domain.dto.ExportType; +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; +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 EnumMap mappers; + + @BeforeEach + void setUp() { + mappers = new EnumMap<>(ExportType.class); + } + + @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 EnumMap<>(ExportType.class), 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..f3cdcd23 --- /dev/null +++ b/src/test/java/org/folio/des/mapper/acquisition/ClaimsExportConfigMapperTest.java @@ -0,0 +1,153 @@ +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.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.getValue(), 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.getValue()); + 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..12c0a5a7 --- /dev/null +++ b/src/test/java/org/folio/des/mapper/acquisition/EdifactExportConfigMapperTest.java @@ -0,0 +1,171 @@ +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.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.getValue(), 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.getValue()); + 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()); + } + +} + 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/service/config/acquisition/ClaimsExportServiceTest.java b/src/test/java/org/folio/des/service/config/acquisition/ClaimsExportServiceTest.java index 72a5f5ca..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 @@ -1,143 +1,85 @@ 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.verify; +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.acquisition.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 org.mockito.junit.jupiter.MockitoExtension; -import java.util.UUID; +@ExtendWith(MockitoExtension.class) +class ClaimsExportServiceTest { -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; + 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; -@SpringBootTest(classes = { DefaultModelConfigToExportConfigConverter.class, JacksonConfiguration.class, ServiceConfiguration.class }) -@EnableAutoConfiguration(exclude = { BatchAutoConfiguration.class }) -class ClaimsExportServiceTest { + @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)); - public static final String EMPTY_CONFIG_RESPONSE = "{\"configs\": [], \"totalRecords\": 0}"; + var defaultExportConfigMapper = new DefaultExportConfigMapper(); + var claimsExportConfigMapper = new ClaimsExportConfigMapperImpl(); + var exportConfigMapperResolver = new ExportConfigMapperResolver(Map.of(ExportType.CLAIMS, claimsExportConfigMapper), defaultExportConfigMapper); + setInternalState(claimsExportConfigMapper, "objectMapper", new JacksonConfiguration().entityObjectMapper()); + setInternalState(claimsExportConfigMapper, "validator", validator); - @Autowired - private ClaimsExportService service; - @MockitoBean - private ConfigurationClient client; - @Autowired - private ObjectMapper objectMapper; - @MockitoBean - private Scheduler scheduler; - @MockitoBean - private QuartzSchemaInitializer quartzSchemaInitializer; + repository = Mockito.mock(ExportConfigRepository.class); + service = new ClaimsExportService(repository, claimsExportConfigMapper, exportConfigMapperResolver, exportConfigValidatorResolver); + } @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()) - ); - } + void testPostConfig() { + when(repository.save(any())).thenAnswer(i -> i.getArguments()[0]); - @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()); - - 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()) - ); - - vendorEdiOrdersExportConfig.setConfigName("test_claims_config_update"); - service.updateConfig(configId, edifactOrdersExportConfig); + var response = service.postConfig(CLAIMS_EXPORT_CONFIG); + + 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()); - } + @DisplayName("Update configuration") + void testUpdateConfig() { + when(repository.findById(UUID.fromString(CLAIMS_EXPORT_CONFIG.getId()))) + .thenReturn(java.util.Optional.of(new ExportConfigEntity())); - 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)); - - return mockResponse; + service.updateConfig(CLAIMS_EXPORT_CONFIG.getId(), CLAIMS_EXPORT_CONFIG); + + verify(repository).save(any()); } + } 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..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 @@ -1,126 +1,96 @@ 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.acquisition.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().entityObjectMapper()); + setInternalState(edifactExportConfigMapper, "validator", validator); + + 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..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 @@ -2,233 +2,164 @@ 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().entityObjectMapper()); + + 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); + + verify(repository).save(any()); } @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..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 @@ -1,243 +1,78 @@ 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().entityObjectMapper()); - 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/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())); } + } 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..1e278758 --- /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); + } + } + +} 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;