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;