From 210663040bf65ee00b5f86545fdc31bd0356fddf Mon Sep 17 00:00:00 2001
From: yeg <1347747024@qq.com>
Date: 星期四, 27 八月 2026 16:31:53 +0800
Subject: [PATCH] feat(device): persist simulator discovery in redis

---
 ruoyi-admin/src/test/java/com/ruoyi/system/service/impl/TCollectorServiceImplTest.java |   52 +++++++++++++++++++++++++++++++++++++++++++++-------
 1 files changed, 45 insertions(+), 7 deletions(-)

diff --git a/ruoyi-admin/src/test/java/com/ruoyi/system/service/impl/TCollectorServiceImplTest.java b/ruoyi-admin/src/test/java/com/ruoyi/system/service/impl/TCollectorServiceImplTest.java
index b461b51..8529c48 100644
--- a/ruoyi-admin/src/test/java/com/ruoyi/system/service/impl/TCollectorServiceImplTest.java
+++ b/ruoyi-admin/src/test/java/com/ruoyi/system/service/impl/TCollectorServiceImplTest.java
@@ -4,6 +4,7 @@
 import static org.junit.jupiter.api.Assertions.assertFalse;
 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 java.io.IOException;
 import java.io.InputStream;
@@ -19,12 +20,13 @@
 import org.junit.jupiter.api.Test;
 import org.junit.jupiter.api.extension.ExtendWith;
 import org.mockito.ArgumentCaptor;
-import org.mockito.InjectMocks;
 import org.mockito.Mock;
 import org.mockito.junit.jupiter.MockitoExtension;
 import com.ruoyi.common.exception.ServiceException;
 import com.ruoyi.system.domain.TCollector;
 import com.ruoyi.system.mapper.TCollectorMapper;
+import com.ruoyi.device.discovery.InMemoryDeviceDiscoveryCandidateStore;
+import com.ruoyi.device.discovery.DeviceDiscoveryCandidateStore.CollectorCandidate;
 
 /**
  * 采集器 Service 单元测试。
@@ -35,14 +37,20 @@
     @Mock
     private TCollectorMapper collectorMapper;
 
-    @InjectMocks
     private TCollectorServiceImpl collectorService;
+    private InMemoryDeviceDiscoveryCandidateStore candidateStore;
 
     private TCollector collector;
 
     @BeforeEach
     void setUp()
     {
+        candidateStore = new InMemoryDeviceDiscoveryCandidateStore();
+        collectorService = new TCollectorServiceImpl(collectorMapper, candidateStore);
+        java.time.Instant now = java.time.Instant.now();
+        candidateStore.replaceCollectors("dev-sim", java.util.List.of(new CollectorCandidate(
+                "dev-sim", "COL-001", "192.168.1.10", "AA:BB:CC:DD:EE:FF", "一号采集器",
+                "开发模拟器", "Virtual Collector", 8, true, now, now.plusSeconds(60))));
         collector = new TCollector();
         collector.setCollectorId(1L);
         collector.setCollectorCode("COL-001");
@@ -69,6 +77,23 @@
 
             assertFalse(insertSql.contains("update_by"));
             assertFalse(insertSql.contains("update_time"));
+        }
+    }
+
+    @Test
+    void registeredCollectorCodeSqlShouldIgnoreDeletedRows() throws IOException
+    {
+        try (InputStream input = getClass().getResourceAsStream(
+                "/mapper/system/TCollectorMapper.xml"))
+        {
+            assertNotNull(input);
+            String mapperXml = new String(input.readAllBytes(), StandardCharsets.UTF_8);
+            int selectStart = mapperXml.indexOf("<select id=\"selectRegisteredCollectorCodes\"");
+            assertTrue(selectStart >= 0);
+            int selectEnd = mapperXml.indexOf("</select>", selectStart);
+            String selectSql = mapperXml.substring(selectStart, selectEnd);
+
+            assertTrue(selectSql.contains("where del_flag = '0'"));
         }
     }
 
@@ -123,16 +148,21 @@
     }
 
     @Test
-    void insertCollectorShouldRejectInvalidIpAddress()
+    void insertCollectorShouldValidateAuthoritativeCandidateTopology()
     {
         collector.setCollectorId(null);
         collector.setIpAddress("invalid-host");
+        collector.setMacAddress("invalid-mac");
+        collector.setChannelCount(99);
+        when(collectorMapper.insertCollector(any(TCollector.class))).thenReturn(1);
 
-        ServiceException exception = assertThrows(ServiceException.class,
-                () -> collectorService.insertCollector(collector));
+        assertEquals(1, collectorService.insertCollector(collector));
 
-        assertEquals("IP地址格式不正确", exception.getMessage());
-        verify(collectorMapper, never()).insertCollector(any(TCollector.class));
+        ArgumentCaptor<TCollector> captor = ArgumentCaptor.forClass(TCollector.class);
+        verify(collectorMapper).insertCollector(captor.capture());
+        assertEquals("192.168.1.10", captor.getValue().getIpAddress());
+        assertEquals("AA:BB:CC:DD:EE:FF", captor.getValue().getMacAddress());
+        assertEquals(8, captor.getValue().getChannelCount());
     }
 
     @Test
@@ -217,6 +247,14 @@
     }
 
     @Test
+    void selectRegisteredCollectorCodesShouldReturnUndeletedCodes()
+    {
+        when(collectorMapper.selectRegisteredCollectorCodes()).thenReturn(java.util.List.of("COL-001"));
+
+        assertEquals(java.util.Set.of("COL-001"), collectorService.selectRegisteredCollectorCodes());
+    }
+
+    @Test
     void deleteCollectorByIdsShouldRejectTestingCollectorBeforeAnyDelete()
     {
         TCollector idle = new TCollector();

--
Gitblit v1.7.1