From 29d72fdf533c7475adbbd946d5b6a4799d20d1df Mon Sep 17 00:00:00 2001 From: Ivan Nikolaev-Axenov Date: Thu, 17 Jul 2025 16:46:25 +0300 Subject: [PATCH] PrepareXMLFile filename bug fixed, PrepareAndExportSf05FromHazelcastTest added --- .../exporter/logic/stages/PrepareXMLFile.java | 13 +- ...PrepareAndExportSf05FromHazelcastTest.java | 133 ++++++++++++++++++ 2 files changed, 143 insertions(+), 3 deletions(-) create mode 100644 clearing-parent/xml-exporter/src/test/java/ru/spcex/clearing/xml/exporter/logic/stages/PrepareAndExportSf05FromHazelcastTest.java diff --git a/clearing-parent/xml-exporter/src/main/java/ru/spcex/clearing/xml/exporter/logic/stages/PrepareXMLFile.java b/clearing-parent/xml-exporter/src/main/java/ru/spcex/clearing/xml/exporter/logic/stages/PrepareXMLFile.java index 8b2f5a228..fb13a3889 100644 --- a/clearing-parent/xml-exporter/src/main/java/ru/spcex/clearing/xml/exporter/logic/stages/PrepareXMLFile.java +++ b/clearing-parent/xml-exporter/src/main/java/ru/spcex/clearing/xml/exporter/logic/stages/PrepareXMLFile.java @@ -5,6 +5,7 @@ import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; import java.util.ArrayList; import java.util.EnumMap; import java.util.List; @@ -25,6 +26,8 @@ import ru.spcex.platform.utils.log.ExceptionUtils; @Component public class PrepareXMLFile implements InitializingBean { + private static final DateTimeFormatter FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd-HH-mm-ss"); + private final Logger log = LoggerFactory.getLogger(getClass()); private final ExportXMLServiceSettings settings; public static String outDir; @@ -61,9 +64,13 @@ public class PrepareXMLFile implements InitializingBean { Table table = resultContainer.getTableForExport(); LocalDateTime currentDateTime = LocalDateTime.now(); resultContainer.setRegistrationDateTime(currentDateTime); - String fileName = nameTemplates.get(table).getFileName(resultContainer, files); - if (sftpConnectionError) fileName = "error_%s_%s".formatted(LocalDateTime.now(), fileName); - File xmlFile = new File(fileName); + + File xmlFile = new File(nameTemplates.get(table).getFileName(resultContainer, files)); + if (sftpConnectionError) { + String errorFileName = "error_%s_%s".formatted(LocalDateTime.now().format(FORMATTER), xmlFile.getName()); + xmlFile = xmlFile.getParentFile().getAbsoluteFile().toPath().resolve(errorFileName).toFile(); + } + log.info("XML FILE = {}", xmlFile.toPath()); try { Path xmlFilePath = xmlFile.toPath(); diff --git a/clearing-parent/xml-exporter/src/test/java/ru/spcex/clearing/xml/exporter/logic/stages/PrepareAndExportSf05FromHazelcastTest.java b/clearing-parent/xml-exporter/src/test/java/ru/spcex/clearing/xml/exporter/logic/stages/PrepareAndExportSf05FromHazelcastTest.java new file mode 100644 index 000000000..f0b4addf4 --- /dev/null +++ b/clearing-parent/xml-exporter/src/test/java/ru/spcex/clearing/xml/exporter/logic/stages/PrepareAndExportSf05FromHazelcastTest.java @@ -0,0 +1,133 @@ +package ru.spcex.clearing.xml.exporter.logic.stages; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.fail; + +import java.io.File; +import java.io.IOException; +import java.math.BigDecimal; +import java.nio.charset.StandardCharsets; +import java.nio.file.Files; +import java.nio.file.Path; +import java.time.LocalDate; +import java.time.format.DateTimeFormatter; +import javax.annotation.PostConstruct; +import org.apache.commons.io.FileUtils; +import org.apache.kafka.clients.producer.MockProducer; +import org.apache.kafka.clients.producer.Producer; +import org.apache.kafka.clients.producer.ProducerRecord; +import org.assertj.core.api.Assertions; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.Test; +import org.mockito.ArgumentCaptor; +import org.mockito.Captor; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.boot.test.mock.mockito.SpyBean; +import org.springframework.test.annotation.DirtiesContext; +import org.springframework.test.context.TestPropertySource; +import ru.clearing.classes.statics.data.sdf.SDf05; +import ru.spcex.clearing.imdg.IMDGDistributedNames; +import ru.spcex.clearing.test.TestObjectCreator; +import ru.spcex.clearing.test.config.ImdgTestConfig; +import ru.spcex.clearing.test.config.KafkaTestConfig; +import ru.spcex.clearing.xml.exporter.TestUtils; +import ru.spcex.clearing.xml.exporter.config.SFTPConfig; +import ru.spcex.clearing.xml.exporter.config.XMLExporterConfig; +import ru.spcex.clearing.xml.exporter.config.settings.ExportXMLServiceSettings; +import ru.spcex.clearing.xml.exporter.logic.data.ResultContainer; +import ru.spcex.clearing.xml.exporter.logic.data.enums.StageResult; +import ru.spcex.clearing.xml.exporter.logic.data.enums.Table; +import ru.spcex.clearing.xml.exporter.logic.data.tags.objects.DF05ObjectTag; +import ru.spcex.platform.imdg.api.Imdg; +import ru.spcex.platform.imdg.iml.hazelcast.service.HazelcastService; + +@SpringBootTest(classes = { + PrepareXMLFile.class, + ExportFromHazelcast.class, + ExportXMLServiceSettings.class, + XMLExporterConfig.class, + SFTPConfig.class, + ImdgTestConfig.class, + KafkaTestConfig.class, +}) +@TestPropertySource(properties = {"spring.config.location=./src/test/resources/"}) +@DirtiesContext(classMode = DirtiesContext.ClassMode.AFTER_EACH_TEST_METHOD) +public class PrepareAndExportSf05FromHazelcastTest { + private final Logger log = LoggerFactory.getLogger(getClass()); + private final DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd.MM.yy"); + + @Autowired + @Qualifier("hazelcastServiceTest") + private HazelcastService hazelcastService; + + @Captor + private ArgumentCaptor producerRecord; + @SpyBean + private MockProducer producer; + @Autowired + @Qualifier("mockProducer") + protected Producer mockProducer; + + @Autowired + private PrepareXMLFile prepareXMLFile; + @Autowired + private ExportFromHazelcast exportFromHazelcast; + + @PostConstruct + private void init() { + hazelcastService.waitAvailable(); + + new TestObjectCreator(hazelcastService).createUserAdmin(1000L); + } + + @AfterEach + void tearDown() { + try { + Files.deleteIfExists(Path.of("./src/test/resources/xml/DF-05_S_PRC1604240915_1.xml")); + } catch (IOException e) { + fail(e.getMessage()); + } + } + + @Test + void process_shouldExportSDf05ToObjectTag() { + SDf05 expectedSDf05 = new SDf05(); + expectedSDf05.setTp(BigDecimal.TEN); + expectedSDf05.setDt(LocalDate.parse("2024-03-14")); + expectedSDf05.setTm("09:22:12"); + expectedSDf05.setPr("test2"); + + Imdg imdg = hazelcastService.getImdg(IMDGDistributedNames.Map_SDf05, SDf05.class); + imdg.insert(expectedSDf05); + + ResultContainer actualResultContainer = new ResultContainer(Table.S_DF05, "S"); + actualResultContainer.setSourceName(null); + + StageResult result = prepareXMLFile.process(actualResultContainer); + actualResultContainer.setLastStageResult(result); + + StageResult stageResult = exportFromHazelcast.process(actualResultContainer); + DF05ObjectTag actualObjectTag = (DF05ObjectTag) actualResultContainer.getDocumentTag().getObjects().get(0); + + Assertions.assertThat(stageResult).isEqualTo(StageResult.OK); + Assertions.assertThat(actualResultContainer.getDocumentTag().getMessageType()).isEqualTo("DF05"); + Assertions.assertThat(actualObjectTag.getTp()).isEqualTo(expectedSDf05.getTp()); + Assertions.assertThat(actualObjectTag.getDt()).isEqualTo(expectedSDf05.getDt()); + Assertions.assertThat(actualObjectTag.getTm()).isEqualTo(expectedSDf05.getTm()); + Assertions.assertThat(actualObjectTag.getPr()).isEqualTo(expectedSDf05.getPr()); + + try { + String actual = FileUtils.readFileToString(actualResultContainer.getFileForExport(), StandardCharsets.UTF_8); + String expected = FileUtils.readFileToString(new File("./src/test/resources/xml-original/DF-05_S_PRC1604240915_1.xml"), StandardCharsets.UTF_8); + actual = TestUtils.removeAttributes(actual, "MESSAGEDATE", "MESSAGETIME"); + expected = TestUtils.removeAttributes(expected, "MESSAGEDATE", "MESSAGETIME"); + assertEquals(expected, actual); + } catch (IOException e) { + fail("File comparison failed!"); + } + } +}