浏览代码

refactor(mcli): isolate legacy verification in mcli module

Move the five legacy verification sources from the shared module into mjava-mcli without changing their contents. Add migration coverage and document the technical verification boundary.
malk 2 周之前
父节点
当前提交
3d3158454c

+ 2 - 0
README.md

@@ -19,6 +19,8 @@ Java 后端基座、公共运行时、标准接口和客户子项目的统一源
 - 可复用的第三方原子接口和基础能力放在 `mjava/`。
 - 钉钉角色与应用可见范围统一通过 `mjava` 的 `DDClient_Role` 调用,不再放入 `DDClient_Contacts` 或客户模块重复实现。
 - 个人验证和技术试验放在 `mjava-mcli/`,验证成熟后再迁入对应公共层。
+- 从阿科德斯公共基座迁入的3个通用验证Controller及2个DTO统一位于 `mjava-mcli/src/main/java/com/malk/test/`,保留原包名和dev/test环境限制;这5个类已从公共 `mjava` 源码移出。
+- `mjava-mcli` 当前以本地 `9001` 按需运行,公网验证使用既有 FRP;客户正式能力由各自 `mjava-{customer}` 模块承载。`155:/home/server/mcli` 的旧 `9999` 部署是历史入口,相关目标信息和备份保留,不作为当前技术验证服务的常驻生产环境。
 - 多客户共用的业务运行时放在 `mjava-pro/`;标准对外接口放在 `mjava-com/`。
 - 客户定制代码使用独立的 `mjava-{customer}/` Maven 模块、配置和可执行 jar,资料归入 `/Users/malk/Desktop/Tech/1. malk/后端/2 one/<客户>/`。
 - 不属于本聚合工程的独立 Java 项目保留在后端根目录;当前 `akds` 位于 `/Users/malk/server/cur/akds`,通过 `后端/阿科德斯/mjava-akds` 快捷方式引用。

mjava/src/main/java/com/malk/test/DSTestController.java → mjava-mcli/src/main/java/com/malk/test/DSTestController.java


mjava/src/main/java/com/malk/test/McTestController.java → mjava-mcli/src/main/java/com/malk/test/McTestController.java


mjava/src/main/java/com/malk/test/RESTFulTestController.java → mjava-mcli/src/main/java/com/malk/test/RESTFulTestController.java


mjava/src/main/java/com/malk/test/dto/Async2Sync.java → mjava-mcli/src/main/java/com/malk/test/dto/Async2Sync.java


mjava/src/main/java/com/malk/test/dto/User.java → mjava-mcli/src/main/java/com/malk/test/dto/User.java


+ 85 - 0
mjava-mcli/src/test/java/com/malk/mcli/dingtalk/LegacyVerificationMigrationTest.java

@@ -0,0 +1,85 @@
+package com.malk.mcli.dingtalk;
+
+import com.malk.mcli.Boot;
+import com.malk.test.DSTestController;
+import com.malk.test.McTestController;
+import com.malk.test.RESTFulTestController;
+import com.malk.test.dto.Async2Sync;
+import com.malk.test.dto.User;
+import org.junit.Test;
+import org.springframework.context.annotation.ClassPathScanningCandidateComponentProvider;
+import org.springframework.core.env.MapPropertySource;
+import org.springframework.core.env.StandardEnvironment;
+import org.springframework.core.type.filter.AnnotationTypeFilter;
+import org.springframework.test.web.servlet.MockMvc;
+import org.springframework.test.web.servlet.setup.MockMvcBuilders;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.net.URL;
+import java.util.Collections;
+import java.util.Set;
+import java.util.stream.Collectors;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
+import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.handler;
+import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
+
+/**
+ * prd 验证旧通用验证类实际归入 MCLI,并保留原有路由和环境边界。
+ */
+public class LegacyVerificationMigrationTest {
+
+    @Test
+    public void verificationClassesAreLoadedFromMcliModule() {
+        URL module = Boot.class.getProtectionDomain().getCodeSource().getLocation();
+        Class<?>[] migratedClasses = {
+            DSTestController.class, McTestController.class, RESTFulTestController.class,
+            Async2Sync.class, User.class
+        };
+        for (Class<?> type : migratedClasses) {
+            assertEquals(type.getName(), module,
+                type.getProtectionDomain().getCodeSource().getLocation());
+        }
+    }
+
+    @Test
+    public void migratedRestVerificationEndpointStillWorks() throws Exception {
+        MockMvc mvc = MockMvcBuilders.standaloneSetup(new RESTFulTestController()).build();
+        mvc.perform(get("/test/users/test"))
+            .andExpect(status().isOk())
+            .andExpect(handler().handlerType(RESTFulTestController.class));
+    }
+
+    @Test
+    public void verificationControllersKeepTheirDevTestProfileBoundary() {
+        String[] names = {
+            DSTestController.class.getName(), McTestController.class.getName(),
+            RESTFulTestController.class.getName()
+        };
+        for (String profile : new String[] {"dev", "test", "prod"}) {
+            Set<String> candidates = scannedControllers(profile);
+            for (String name : names) {
+                if ("prod".equals(profile)) {
+                    assertFalse(candidates.contains(name));
+                } else {
+                    assertTrue(name, candidates.contains(name));
+                }
+            }
+        }
+    }
+
+    private Set<String> scannedControllers(String profile) {
+        StandardEnvironment environment = new StandardEnvironment();
+        environment.setActiveProfiles(profile);
+        environment.getPropertySources().addFirst(new MapPropertySource("migration-test",
+            Collections.<String, Object>singletonMap("spel.multiSource", "true")));
+        ClassPathScanningCandidateComponentProvider scanner =
+            new ClassPathScanningCandidateComponentProvider(false, environment);
+        scanner.addIncludeFilter(new AnnotationTypeFilter(RestController.class));
+        return scanner.findCandidateComponents("com.malk.test").stream()
+            .map(candidate -> candidate.getBeanClassName()).collect(Collectors.toSet());
+    }
+}