From 5493fc40949407eaa30d50cfa8d2d86d563398e2 Mon Sep 17 00:00:00 2001 From: Mikhail Trofimov Date: Thu, 24 Jul 2025 12:44:08 +0300 Subject: [PATCH] Splited UtilTest to ZipUtilsTest and ValidationUtilTest; Added CTUtilTest; Updated CTUtil --- .../credit_tracker/facade/SignalFacade.java | 3 + .../ru/nbch/credit_tracker/utils/CTUtil.java | 10 +- .../nbch/credit_tracker/utils/CTUtilTest.java | 160 ++++++++++++++++++ ...{UtilTest.java => ValidationUtilTest.java} | 51 +----- .../credit_tracker/utils/ZipUtilsTest.java | 61 +++++++ 5 files changed, 234 insertions(+), 51 deletions(-) create mode 100644 src/test/java/ru/nbch/credit_tracker/utils/CTUtilTest.java rename src/test/java/ru/nbch/credit_tracker/utils/{UtilTest.java => ValidationUtilTest.java} (72%) create mode 100644 src/test/java/ru/nbch/credit_tracker/utils/ZipUtilsTest.java diff --git a/src/main/java/ru/nbch/credit_tracker/facade/SignalFacade.java b/src/main/java/ru/nbch/credit_tracker/facade/SignalFacade.java index 3c9cb37..cab7a94 100644 --- a/src/main/java/ru/nbch/credit_tracker/facade/SignalFacade.java +++ b/src/main/java/ru/nbch/credit_tracker/facade/SignalFacade.java @@ -279,6 +279,9 @@ public class SignalFacade { public ResponseEntity downloadFile(String fileName) { try { String memberCode = CTUtil.getMemberCodeFromFileName(fileName); + if (memberCode == null) { + throw clientExcp(SignalError.ERROR_014, XmlErrorFormat.MonitoringDownloadError); + } String dirPath = config.getLoadDir() + File.separator + memberCode; File folder = new File(dirPath); diff --git a/src/main/java/ru/nbch/credit_tracker/utils/CTUtil.java b/src/main/java/ru/nbch/credit_tracker/utils/CTUtil.java index f953e85..b4f0f99 100644 --- a/src/main/java/ru/nbch/credit_tracker/utils/CTUtil.java +++ b/src/main/java/ru/nbch/credit_tracker/utils/CTUtil.java @@ -18,8 +18,8 @@ import java.util.regex.Pattern; @Slf4j public class CTUtil { - private static DateTimeFormatter onlineReportDateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH-mm-ss"); - private static DateTimeFormatter responseReportDateTimeFormatter = DateTimeFormatter.ofPattern("yyyyMMdd_HHmmss"); + private static final DateTimeFormatter onlineReportDateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH-mm-ss"); + private static final DateTimeFormatter responseReportDateTimeFormatter = DateTimeFormatter.ofPattern("yyyyMMdd_HHmmss"); public static LocalDateTime parseDateFromReportFileName(String reportFileName) { @@ -54,6 +54,9 @@ public class CTUtil { } public static String getMemberCodeFromFileName(String fileName) { + if (StringUtils.isBlank(fileName)) { + return null; + } String[] parts = fileName.split("_"); if (parts.length > 1) { return parts[0]; @@ -63,8 +66,9 @@ public class CTUtil { } public static String normalize(String value) { - if (value == null) + if (StringUtils.isBlank(value)) { return null; + } return value.replaceAll("[^А-Яа-яA-Za-z0-9]", ""); } diff --git a/src/test/java/ru/nbch/credit_tracker/utils/CTUtilTest.java b/src/test/java/ru/nbch/credit_tracker/utils/CTUtilTest.java new file mode 100644 index 0000000..a5fdde6 --- /dev/null +++ b/src/test/java/ru/nbch/credit_tracker/utils/CTUtilTest.java @@ -0,0 +1,160 @@ +package ru.nbch.credit_tracker.utils; + +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.MethodSource; +import org.springframework.boot.test.context.SpringBootTest; + +import java.time.LocalDateTime; +import java.util.stream.Stream; + +@SpringBootTest +public class CTUtilTest { + + private static Stream dateParsingTestCases() { + return Stream.of( + Arguments.of( + "ABС123_MY_BATCH_01.1.online.2025-04-30T18-05-42.xml.gz", + LocalDateTime.of(2025, 4, 30, 18, 5, 42) + ), + Arguments.of( + "ABС1234_MY_BATCH_01.2.online.2025-05-05T11-25-41.xml.gz", + LocalDateTime.of(2025, 5, 5, 11, 25, 41) + ) + , + Arguments.of( + "asfwqfwqwgqg", + null + ) + , + Arguments.of( + "ABС1234_MY_BATCH_01.2.online.2023-04-04T12-23-14.xml.gz", + LocalDateTime.of(2023, 4, 4, 12, 23, 14) + ) + ); + } + + private static Stream busCategoryTestCases() { + return Stream.of( + Arguments.of( + "MFO", + true + ), + Arguments.of( + "MKK", + true + ) + , + Arguments.of( + "MFK", + true + ) + , + Arguments.of( + "BANK", + false + ) + , + Arguments.of( + "", + false + ) + , + Arguments.of( + null, + false + ) + ); + } + + private static Stream memberCodeParsingTestCases() { + return Stream.of( + Arguments.of( + "0001XX_MY_BATCH_71_20250703_180647.zip", + "0001XX" + ), + Arguments.of( + "000222_BATCH_72_20250703_180647.zip", + "000222" + ) + , + Arguments.of( + "000333_BATCH_73_20250703_180647.zip", + "000333" + ) + , + Arguments.of( + "0001XXBATCH732025070380647.zip", + null + ) + , + Arguments.of( + "", + null + ) + , + Arguments.of( + null, + null + ) + ); + } + + private static Stream normalizingTestCases() { + return Stream.of( + Arguments.of( + "ADE124115", + "ADE124115" + ), + Arguments.of( + "A__DE12___4115", + "ADE124115" + ) + , + Arguments.of( + "A__DE12 %$#@$%12___4115 5", + "ADE121241155" + ) + , + Arguments.of( + "0001XXBATCH732025070380647.zip", + "0001XXBATCH732025070380647zip" + ) + , + Arguments.of( + null, + null + ) + , + Arguments.of( + "", + null + ) + ); + } + + @ParameterizedTest(name = "[{index}] FILENAME: [ {0} ] EXPECTED: [ {1} ]") + @MethodSource("dateParsingTestCases") + void parseDateFromReportFileNameTest(String fileName, LocalDateTime expected) { + Assertions.assertEquals(expected, CTUtil.parseDateFromReportFileName(fileName)); + } + + @ParameterizedTest(name = "[{index}] CATEGORY: [ {0} ] EXPECTED: [ {1} ]") + @MethodSource("busCategoryTestCases") + void checkBusCategoryTest(String category, boolean expected) { + Assertions.assertEquals(expected, CTUtil.checkBusCategory(category)); + } + + @ParameterizedTest(name = "[{index}] FILENAME: [ {0} ] EXPECTED: [ {1} ]") + @MethodSource("memberCodeParsingTestCases") + void getMemberCodeFromFileNameTest(String fileName, String expected) { + Assertions.assertEquals(expected, CTUtil.getMemberCodeFromFileName(fileName)); + } + + @ParameterizedTest(name = "[{index}] STR: [ {0} ] EXPECTED: [ {1} ]") + @MethodSource("normalizingTestCases") + void normalizeTest(String str, String expected) { + Assertions.assertEquals(expected, CTUtil.normalize(str)); + } +} diff --git a/src/test/java/ru/nbch/credit_tracker/utils/UtilTest.java b/src/test/java/ru/nbch/credit_tracker/utils/ValidationUtilTest.java similarity index 72% rename from src/test/java/ru/nbch/credit_tracker/utils/UtilTest.java rename to src/test/java/ru/nbch/credit_tracker/utils/ValidationUtilTest.java index 2c773fc..b4ba069 100644 --- a/src/test/java/ru/nbch/credit_tracker/utils/UtilTest.java +++ b/src/test/java/ru/nbch/credit_tracker/utils/ValidationUtilTest.java @@ -22,20 +22,18 @@ import java.io.IOException; import java.util.ArrayList; import java.util.Collections; import java.util.List; -import java.util.Optional; import java.util.stream.Stream; -import java.util.zip.ZipEntry; import java.util.zip.ZipInputStream; import static ru.nbch.credit_tracker.utils.error.ExceptionUtils.clientExcp; -@SpringBootTest(classes = {UtilTest.TestConfig.class}) -public class UtilTest { +@SpringBootTest(classes = {ValidationUtilTest.TestConfig.class}) +public class ValidationUtilTest { private final StaxXmlProcessor staxXmlProcessor; @Autowired - public UtilTest(StaxXmlProcessor staxXmlProcessor) { + public ValidationUtilTest(StaxXmlProcessor staxXmlProcessor) { this.staxXmlProcessor = staxXmlProcessor; } @@ -49,49 +47,6 @@ public class UtilTest { } } - private static Stream entryTestCases() { - return Stream.of( - Arguments.of( - "/monitoring_request/valid_request.zip", - true - ), - Arguments.of( - "/monitoring_request/directory_request.zip", - false - ) - , - Arguments.of( - "/monitoring_request/empty_request.zip", - false - ) - , - Arguments.of( - "/monitoring_request/many_files_request.zip", - false - ) - , - Arguments.of( - "/monitoring_request/txt_request.zip", - false - ) - ); - } - - @ParameterizedTest(name = "[{index}] PATH: [ {0} ] EXPECTED: [ {1} ]") - @MethodSource("entryTestCases") - void testExtractEntryFromZip(String path, boolean expected) { - ZipInputStream zipInputStream; - Optional xmlFileEntry; - try { - zipInputStream = new ZipInputStream(getClass().getResourceAsStream(path)); - xmlFileEntry = ZipUtils.extractValidEntry(zipInputStream); - Assertions.assertEquals(expected, xmlFileEntry.isPresent()); - zipInputStream.close(); - } catch (Exception e) { - throw new RuntimeException(e); - } - } - private static Stream validationTestCases() { return Stream.of( Arguments.of( diff --git a/src/test/java/ru/nbch/credit_tracker/utils/ZipUtilsTest.java b/src/test/java/ru/nbch/credit_tracker/utils/ZipUtilsTest.java new file mode 100644 index 0000000..5a0b5cb --- /dev/null +++ b/src/test/java/ru/nbch/credit_tracker/utils/ZipUtilsTest.java @@ -0,0 +1,61 @@ +package ru.nbch.credit_tracker.utils; + +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.MethodSource; +import org.springframework.boot.test.context.SpringBootTest; + +import java.util.Optional; +import java.util.stream.Stream; +import java.util.zip.ZipEntry; +import java.util.zip.ZipInputStream; + +@SpringBootTest +public class ZipUtilsTest { + + private static Stream entryTestCases() { + return Stream.of( + Arguments.of( + "/monitoring_request/valid_request.zip", + true + ), + Arguments.of( + "/monitoring_request/directory_request.zip", + false + ) + , + Arguments.of( + "/monitoring_request/empty_request.zip", + false + ) + , + Arguments.of( + "/monitoring_request/many_files_request.zip", + false + ) + , + Arguments.of( + "/monitoring_request/txt_request.zip", + false + ) + ); + } + + @ParameterizedTest(name = "[{index}] PATH: [ {0} ] EXPECTED: [ {1} ]") + @MethodSource("entryTestCases") + void testExtractEntryFromZip(String path, boolean expected) { + ZipInputStream zipInputStream; + Optional xmlFileEntry; + try { + zipInputStream = new ZipInputStream(getClass().getResourceAsStream(path)); + xmlFileEntry = ZipUtils.extractValidEntry(zipInputStream); + Assertions.assertEquals(expected, xmlFileEntry.isPresent()); + zipInputStream.close(); + } catch (Exception e) { + throw new RuntimeException(e); + } + } + + +}