From 7259e265b9237286996b09da03038ea5a133e1e0 Mon Sep 17 00:00:00 2001
From: yeg <1347747024@qq.com>
Date: 星期六, 05 九月 2026 17:45:07 +0800
Subject: [PATCH] 收敛模拟器为设备事实与实时观测

---
 ruoyi-admin/src/test/java/com/battery/business/service/impl/DeviceDiscoveryPersistenceServiceTest.java |   30 ++++++++++++++++++++++++++++++
 1 files changed, 30 insertions(+), 0 deletions(-)

diff --git a/ruoyi-admin/src/test/java/com/battery/business/service/impl/DeviceDiscoveryPersistenceServiceTest.java b/ruoyi-admin/src/test/java/com/battery/business/service/impl/DeviceDiscoveryPersistenceServiceTest.java
index dbf2b9c..dda94d2 100644
--- a/ruoyi-admin/src/test/java/com/battery/business/service/impl/DeviceDiscoveryPersistenceServiceTest.java
+++ b/ruoyi-admin/src/test/java/com/battery/business/service/impl/DeviceDiscoveryPersistenceServiceTest.java
@@ -20,6 +20,36 @@
 class DeviceDiscoveryPersistenceServiceTest
 {
     @Test
+    void failedDiscoveryInvalidatesSuccessfulSnapshotUntilSoftwareReturns() throws Exception
+    {
+        try (var simulator = new com.battery.device.simulator.BtsDevelopmentSimulator(0);
+             var registry = new DeviceAdapterRegistry(List.of(new com.battery.device.bts.BtsDeviceAdapterFactory())))
+        {
+            registry.synchronize(new com.battery.device.api.registry.AdapterInstanceConfig("dev-sim", "BTS",
+                    "127.0.0.1", simulator.port(), 5000, "Asia/Hong_Kong", true,
+                    com.battery.device.api.model.AdapterCapabilities.observeOnly()));
+            var store = new InMemoryDeviceDiscoveryCandidateStore();
+            var mapper = Mockito.mock(TDetectionCabinetMapper.class);
+            var persistence = new DeviceDiscoveryPersistenceService(store, mapper);
+            var scheduler = new com.battery.business.runtime.DevelopmentSimulatorDiscoveryScheduler(registry, persistence);
+            simulator.updateChannel(1, 1, true, com.battery.device.api.model.DeviceWorkStatus.WORKING);
+            scheduler.discover();
+            var before = store.snapshot(java.time.Instant.now()).cabinets().get(0);
+            org.junit.jupiter.api.Assertions.assertNotNull(before.channels().get(0).latestSnapshot());
+            simulator.setSoftwareAccessible(false);
+            scheduler.discover();
+            var failed = store.snapshot(java.time.Instant.now()).cabinets().get(0);
+            assertEquals(before.deviceCode(), failed.deviceCode());
+            org.junit.jupiter.api.Assertions.assertFalse(failed.online());
+            org.junit.jupiter.api.Assertions.assertNull(failed.channels().get(0).latestSnapshot());
+            verify(mapper).markRegisteredCabinetsOffline("dev-sim");
+            simulator.setSoftwareAccessible(true);
+            scheduler.discover();
+            org.junit.jupiter.api.Assertions.assertTrue(store.snapshot(java.time.Instant.now()).cabinets().get(0).online());
+        }
+    }
+
+    @Test
     void discoveryPersistsCandidatesWithoutReceivingTest()
     {
         InMemoryDeviceDiscoveryCandidateStore candidateStore = new InMemoryDeviceDiscoveryCandidateStore();

--
Gitblit v1.7.1