package com.ruoyi.web.controller.device; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertFalse; import static org.junit.jupiter.api.Assertions.assertTrue; import static org.junit.jupiter.api.Assertions.assertArrayEquals; import java.lang.reflect.Method; import java.net.InetAddress; import org.junit.jupiter.api.Test; import org.springframework.mock.web.MockHttpServletRequest; import org.springframework.mock.web.MockHttpServletResponse; import org.springframework.web.bind.annotation.GetMapping; import com.ruoyi.common.annotation.Anonymous; import com.ruoyi.device.bts.BtsDevelopmentSimulator; import com.ruoyi.device.model.DeviceWorkStatus; import com.ruoyi.web.config.BtsDevelopmentSimulatorWebConfig; class BtsDevelopmentSimulatorControllerTest { @Test void controllerUpdatesDeviceAndChannelState() throws Exception { try (BtsDevelopmentSimulator simulator = new BtsDevelopmentSimulator(0)) { BtsDevelopmentSimulatorController controller = new BtsDevelopmentSimulatorController(simulator); controller.updateDevice(1, new BtsDevelopmentSimulatorController.DeviceStateCommand("127.0.0.2", 4, false)); controller.updateChannel(1, 3, new BtsDevelopmentSimulatorController.ChannelStateCommand(true, DeviceWorkStatus.PAUSED)); assertFalse(controller.state().devices().get(0).online()); assertEquals(DeviceWorkStatus.PAUSED, controller.state().devices().get(0).channels().get(2).workStatus()); } } @Test void controllerAddsUpdatesAndDeletesVirtualDevices() throws Exception { try (BtsDevelopmentSimulator simulator = new BtsDevelopmentSimulator(0)) { BtsDevelopmentSimulatorController controller = new BtsDevelopmentSimulatorController(simulator); var created = controller.createDevice( new BtsDevelopmentSimulatorController.CreateDeviceCommand("127.0.0.8", 6)); int deviceId = created.devices().stream() .filter(device -> device.ip().equals("127.0.0.8")) .findFirst().orElseThrow().deviceId(); controller.updateDevice(deviceId, new BtsDevelopmentSimulatorController.DeviceStateCommand("127.0.0.9", 3, false)); assertEquals(2, controller.state().devices().size()); assertEquals(3, controller.state().devices().stream() .filter(device -> device.deviceId() == deviceId) .findFirst().orElseThrow().channels().size()); controller.deleteDevice(deviceId); assertEquals(1, controller.state().devices().size()); } } @Test void developmentControlBoundaryOnlyAllowsLoopbackClients() throws Exception { var interceptor = new BtsDevelopmentSimulatorWebConfig.LocalOnlyInterceptor(); MockHttpServletResponse localResponse = new MockHttpServletResponse(); MockHttpServletRequest localRequest = requestFrom(InetAddress.getLoopbackAddress().getHostAddress()); MockHttpServletResponse remoteResponse = new MockHttpServletResponse(); MockHttpServletRequest remoteRequest = requestFrom("192.168.1.20"); assertTrue(interceptor.preHandle(localRequest, localResponse, new Object())); assertFalse(interceptor.preHandle(remoteRequest, remoteResponse, new Object())); assertEquals(403, remoteResponse.getStatus()); assertTrue(BtsDevelopmentSimulatorController.class.isAnnotationPresent(Anonymous.class)); } @Test void exposesStaticControlPageThroughAnonymousHandler() throws Exception { Method page = BtsDevelopmentSimulatorController.class.getMethod("page"); assertArrayEquals(new String[] { "/dev/bts-simulator.html" }, page.getAnnotation(GetMapping.class).value()); assertTrue(BtsDevelopmentSimulatorController.class.isAnnotationPresent(Anonymous.class)); } private MockHttpServletRequest requestFrom(String remoteAddress) { MockHttpServletRequest request = new MockHttpServletRequest("GET", "/dev/bts-simulator/state"); request.setRemoteAddr(remoteAddress); return request; } }