From 02504de02162bd153455a6fdfca56035044b81f6 Mon Sep 17 00:00:00 2001 From: lingniu Date: Wed, 1 Jul 2026 04:22:10 +0800 Subject: [PATCH] refactor: make command gateway opt-in --- modules/apps/command-gateway/pom.xml | 5 ++ .../CommandGatewayAutoConfiguration.java | 2 +- .../CommandGatewayAutoConfigurationTest.java | 62 +++++++++++++++++++ 3 files changed, 68 insertions(+), 1 deletion(-) create mode 100644 modules/apps/command-gateway/src/test/java/com/lingniu/ingest/gateway/CommandGatewayAutoConfigurationTest.java diff --git a/modules/apps/command-gateway/pom.xml b/modules/apps/command-gateway/pom.xml index 4efd2c7e..10eeedae 100644 --- a/modules/apps/command-gateway/pom.xml +++ b/modules/apps/command-gateway/pom.xml @@ -49,5 +49,10 @@ assertj-core test + + org.springframework.boot + spring-boot-test + test + diff --git a/modules/apps/command-gateway/src/main/java/com/lingniu/ingest/gateway/CommandGatewayAutoConfiguration.java b/modules/apps/command-gateway/src/main/java/com/lingniu/ingest/gateway/CommandGatewayAutoConfiguration.java index 7a12d56b..c987f13b 100644 --- a/modules/apps/command-gateway/src/main/java/com/lingniu/ingest/gateway/CommandGatewayAutoConfiguration.java +++ b/modules/apps/command-gateway/src/main/java/com/lingniu/ingest/gateway/CommandGatewayAutoConfiguration.java @@ -8,7 +8,7 @@ import org.springframework.web.servlet.DispatcherServlet; @AutoConfiguration @ConditionalOnClass(DispatcherServlet.class) -@ConditionalOnProperty(prefix = "lingniu.ingest.command-gateway", name = "enabled", havingValue = "true", matchIfMissing = true) +@ConditionalOnProperty(prefix = "lingniu.ingest.command-gateway", name = "enabled", havingValue = "true") @ComponentScan(basePackageClasses = TerminalCommandController.class) public class CommandGatewayAutoConfiguration { // 只扫描 REST 下行命令网关;不参与 32960 接收、RAW 冷存或历史查询链路。 diff --git a/modules/apps/command-gateway/src/test/java/com/lingniu/ingest/gateway/CommandGatewayAutoConfigurationTest.java b/modules/apps/command-gateway/src/test/java/com/lingniu/ingest/gateway/CommandGatewayAutoConfigurationTest.java new file mode 100644 index 00000000..9f162bbe --- /dev/null +++ b/modules/apps/command-gateway/src/test/java/com/lingniu/ingest/gateway/CommandGatewayAutoConfigurationTest.java @@ -0,0 +1,62 @@ +package com.lingniu.ingest.gateway; + +import com.lingniu.ingest.session.CommandDispatcher; +import com.lingniu.ingest.session.DeviceSession; +import com.lingniu.ingest.session.SessionStore; +import org.junit.jupiter.api.Test; +import org.springframework.boot.autoconfigure.AutoConfigurations; +import org.springframework.boot.test.context.runner.ApplicationContextRunner; + +import java.time.Duration; +import java.util.Optional; +import java.util.concurrent.CompletableFuture; +import java.util.function.UnaryOperator; + +import static org.assertj.core.api.Assertions.assertThat; + +class CommandGatewayAutoConfigurationTest { + + private final ApplicationContextRunner contextRunner = new ApplicationContextRunner() + .withConfiguration(AutoConfigurations.of(CommandGatewayAutoConfiguration.class)) + .withBean(SessionStore.class, EmptySessionStore::new) + .withBean(CommandDispatcher.class, NoopCommandDispatcher::new); + + @Test + void backsOffByDefault() { + contextRunner.run(context -> assertThat(context).doesNotHaveBean(TerminalCommandController.class)); + } + + @Test + void createsControllerWhenExplicitlyEnabled() { + contextRunner + .withPropertyValues("lingniu.ingest.command-gateway.enabled=true") + .run(context -> assertThat(context).hasSingleBean(TerminalCommandController.class)); + } + + private static final class NoopCommandDispatcher implements CommandDispatcher { + @Override + public CompletableFuture notify(String sessionId, Object command) { + return CompletableFuture.completedFuture(null); + } + + @Override + public CompletableFuture request(String sessionId, + Object command, + Class responseType, + Duration timeout) { + return CompletableFuture.failedFuture(new UnsupportedOperationException("not used")); + } + } + + private static final class EmptySessionStore implements SessionStore { + @Override public void put(DeviceSession session) {} + @Override public Optional findBySessionId(String sessionId) { return Optional.empty(); } + @Override public Optional findByVin(String vin) { return Optional.empty(); } + @Override public Optional findByPhone(String phone) { return Optional.empty(); } + @Override public Optional update(String sessionId, UnaryOperator updater) { + return Optional.empty(); + } + @Override public void remove(String sessionId) {} + @Override public int size() { return 0; } + } +}