package com.battery.device.bts; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertFalse; import static org.junit.jupiter.api.Assertions.assertThrows; import java.util.List; import java.util.Map; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import com.battery.device.api.DeviceAdapter; import com.battery.device.api.DeviceAdapterException; import com.battery.device.api.model.AdapterCapabilities; import com.battery.device.api.registry.AdapterInstanceConfig; import com.battery.device.api.registry.DeviceAdapterRegistry; import com.battery.device.api.registry.DeviceAdapterFactory; /** * 直连新威接口的类型装配:类型标识、口令来源与只读能力。 * *

口令走"本地凭据文件 → 环境变量 → 启动参数",测试用启动参数这一层注入只在本测试里存在的键, * 以免碰到真实凭据文件。 */ class NewareBtsAdapterFactoryContractTest { private static final String PASSWORD_KEY = "TEST_NEWARE_WIN_PASSWORD_FF"; @BeforeEach void provideAdminAccount() { System.setProperty(NewareBtsAdapterFactory.DEFAULT_USER_ENV, "Administrator"); } @AfterEach void clearAccount() { System.clearProperty(NewareBtsAdapterFactory.DEFAULT_USER_ENV); System.clearProperty(PASSWORD_KEY); } @Test void declaresItsOwnStorageShapeType() { assertEquals("NEWARE_BTS", new NewareBtsAdapterFactory().adapterType()); assertEquals("NEWARE_BTS", NewareBtsAdapter.ADAPTER_TYPE); } @Test void buildsAReadOnlyAdapterForAConfiguredHost() { System.setProperty(PASSWORD_KEY, "159357"); DeviceAdapterFactory factory = new NewareBtsAdapterFactory(); DeviceAdapter adapter = factory.create(config(Map.of(NewareBtsAdapterFactory.PASSWORD_ENV_OPTION, PASSWORD_KEY))); assertEquals("neware-f", adapter.adapterCode()); assertEquals(true, adapter.capabilities().historyDownload()); assertFalse(adapter.capabilities().control()); } @Test void refusesToGuessTheMachinePassword() { DeviceAdapterFactory factory = new NewareBtsAdapterFactory(); DeviceAdapterException exception = assertThrows(DeviceAdapterException.class, () -> factory.create(config(Map.of()))); // 五台机器的口令实测有两种,猜一个就会连错机器,所以这个配置项没有缺省值。 assertEquals(true, exception.getMessage().contains(NewareBtsAdapterFactory.PASSWORD_ENV_OPTION)); } @Test void registryRejectsAnInstanceWhoseCredentialsAreMissingWithoutEnablingIt() { try (DeviceAdapterRegistry registry = new DeviceAdapterRegistry(List.of(new NewareBtsAdapterFactory()))) { assertThrows(DeviceAdapterException.class, () -> registry.synchronize(config(Map.of()))); assertFalse(registry.contains("neware-f")); } } private static AdapterInstanceConfig config(Map sourceConfig) { return new AdapterInstanceConfig("neware-f", "NEWARE_BTS", "26.117.165.166", 445, 60000, "Asia/Hong_Kong", true, new AdapterCapabilities(true, true, true, false), sourceConfig); } }