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