package com.battery.device.contract; import static org.junit.jupiter.api.Assertions.assertEquals; import java.time.Instant; import java.util.List; import org.junit.jupiter.api.Test; import com.battery.device.discovery.DeviceDiscoveryCandidateStore.CabinetCandidate; import com.battery.device.discovery.DeviceDiscoveryCandidateStore.ChannelCandidate; import com.battery.device.discovery.DeviceDiscoveryCandidateStore.CollectorCandidate; import com.battery.device.discovery.InMemoryDeviceDiscoveryCandidateStore; import com.battery.device.model.ChannelIdentity; import com.battery.device.model.DeviceWorkStatus; class DiscoveryCandidateStoreContractTest { @Test void returnsOnlyLogicallyUnexpiredCandidates() { Instant now = Instant.parse("2026-08-27T00:00:00Z"); InMemoryDeviceDiscoveryCandidateStore store = new InMemoryDeviceDiscoveryCandidateStore(); store.recordCabinets(List.of(candidate("expired", now.minusSeconds(1)), candidate("current", now.plusSeconds(1)))); assertEquals(List.of("current"), store.snapshot(now).cabinets().stream() .map(CabinetCandidate::deviceCode).toList()); } @Test void removesAllCandidateTypesForOneAdapter() { Instant now = Instant.parse("2026-08-27T00:00:00Z"); InMemoryDeviceDiscoveryCandidateStore store = new InMemoryDeviceDiscoveryCandidateStore(); store.recordCabinets(List.of(candidate("dev-sim-cabinet", now.plusSeconds(30)))); store.replaceCollectors("dev-sim", List.of(new CollectorCandidate("dev-sim", "dev-sim-collector-1", "127.0.1.2", null, "采集器", null, null, 4, true, now, now.plusSeconds(30)))); store.removeAdapter("dev-sim"); assertEquals(List.of(), store.snapshot(now).cabinets()); assertEquals(List.of(), store.snapshot(now).collectors()); } private CabinetCandidate candidate(String code, Instant expiresAt) { Instant observedAt = Instant.parse("2026-08-26T23:59:55Z"); ChannelIdentity identity = new ChannelIdentity("dev-sim", 22, 1, 1, 1); return new CabinetCandidate("dev-sim", null, code, 22, 1, "127.0.0.2", null, code, null, null, List.of(new ChannelCandidate(identity, true, DeviceWorkStatus.STOPPED, observedAt)), observedAt, expiresAt); } }