package com.battery.business.runtime; import static org.junit.jupiter.api.Assertions.assertTrue; import static org.junit.jupiter.api.Assertions.assertFalse; import java.io.InputStream; import java.nio.charset.StandardCharsets; import org.junit.jupiter.api.Test; /** 测试双设备绑定、电池组当前字段和接收状态的 Mapper 契约。 */ class TestDeviceBindingMapperContractTest { @Test void persistsAndReadsCollectorMappingsAndFieldSnapshots() { String mapper = resource("mapper/battery/TTestMapper.xml"); assertTrue(mapper.contains("id=\"insertTestCollectorChannel\"")); assertTrue(mapper.contains("id=\"selectTestCollectorChannels\"")); assertTrue(mapper.contains("reception_status = 'NOT_STARTED'")); assertTrue(mapper.contains("channel_count channelCount")); assertTrue(mapper.contains("id=\"selectBatteryNosByTestIds\"")); assertTrue(mapper.contains("channel_fact.channel_id channelId")); assertTrue(mapper.contains("id=\"selectReceptionChannelForUpdate\"")); assertTrue(mapper.contains("channel_fact.online_status onlineStatus")); assertTrue(mapper.contains("channel_fact.last_seen_at_utc lastSeenAtUtc")); assertTrue(mapper.contains("set test_status = 'COMPLETED'")); assertTrue(mapper.contains("set test_status = 'COMPLETED', reception_status = 'ENDED'")); assertTrue(mapper.contains("#{testStatus} = 'COMPLETED' and t.test_status in ('COMPLETED', 'COMPLETION_PENDING', 'TERMINATED')")); assertFalse(mapper.contains("t_test_reception_interval")); assertFalse(mapper.contains("reception_interval_id")); assertFalse(mapper.contains("t_test_integrity_issue")); assertFalse(mapper.contains("t_test_backfill_cursor")); assertFalse(mapper.contains("t_test_collector_exception_interval")); assertFalse(mapper.contains("group_concat")); } private static String resource(String path) { try (InputStream stream = TestDeviceBindingMapperContractTest.class.getClassLoader().getResourceAsStream(path)) { if (stream == null) throw new AssertionError("缺少资源 " + path); return new String(stream.readAllBytes(), StandardCharsets.UTF_8); } catch (Exception exception) { throw new AssertionError("无法读取资源 " + path, exception); } } }