| | |
| | | class BtsDevelopmentSimulatorControllerTest |
| | | { |
| | | @Test |
| | | void restChangesSoftwareAndCollectorChannelFactsAndRetiresPlayback() throws Exception |
| | | { |
| | | try (BtsDevelopmentSimulator simulator = new BtsDevelopmentSimulator(0)) |
| | | { |
| | | var mvc = org.springframework.test.web.servlet.setup.MockMvcBuilders.standaloneSetup(controller(simulator)).build(); |
| | | mvc.perform(org.springframework.test.web.servlet.request.MockMvcRequestBuilders.put("/dev/bts-simulator/software") |
| | | .contentType("application/json").content("{\"accessible\":false}")) |
| | | .andExpect(org.springframework.test.web.servlet.result.MockMvcResultMatchers.status().isOk()); |
| | | assertFalse(simulator.snapshot().softwareAccessible()); |
| | | mvc.perform(org.springframework.test.web.servlet.request.MockMvcRequestBuilders.put( |
| | | "/dev/bts-simulator/collectors/1/channels/S-01/status") |
| | | .contentType("application/json").content("{\"workStatus\":\"PROTECTED\"}")) |
| | | .andExpect(org.springframework.test.web.servlet.result.MockMvcResultMatchers.status().isOk()); |
| | | assertEquals(DeviceWorkStatus.PROTECTED, simulator.snapshot().collectors().get(0).channels().get(0).workStatus()); |
| | | for (String path : List.of("/devices/1/channels/1/playback/play", "/devices/1/channels/1/playback/next-step")) |
| | | mvc.perform(org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post("/dev/bts-simulator" + path)) |
| | | .andExpect(org.springframework.test.web.servlet.result.MockMvcResultMatchers.status().isNotFound()); |
| | | for (String path : List.of("/collectors/1/history", "/devices/1/channels/1/records")) |
| | | mvc.perform(org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get("/dev/bts-simulator" + path)) |
| | | .andExpect(org.springframework.test.web.servlet.result.MockMvcResultMatchers.status().isNotFound()); |
| | | } |
| | | } |
| | | |
| | | @Test |
| | | void controllerUpdatesDeviceAndChannelState() throws Exception |
| | | { |
| | | try (BtsDevelopmentSimulator simulator = new BtsDevelopmentSimulator(0)) |
| | |
| | | } |
| | | |
| | | @Test |
| | | void controllerExposesCollectorRealtimeAndPagedHistory() throws Exception |
| | | void controllerExposesOnlyCurrentCollectorMeasurements() throws Exception |
| | | { |
| | | try (BtsDevelopmentSimulator simulator = new BtsDevelopmentSimulator(0)) |
| | | { |
| | | BtsDevelopmentSimulatorController controller = controller(simulator); |
| | | controller.configureCollectorSampling(1, |
| | | new BtsDevelopmentSimulatorController.CollectorSamplingCommand( |
| | | 100, List.of(), null, null, false)); |
| | | controller.configureCollectorChannel(1, "S-01", |
| | | new BtsDevelopmentSimulatorController.CollectorChannelCommand(List.of( |
| | | new BtsDevelopmentSimulatorController.CollectorMetricCommand( |
| | | "temperature", new BigDecimal("27.2"), "℃"), |
| | | new BtsDevelopmentSimulatorController.CollectorMetricCommand( |
| | | "custom_voltage", new BigDecimal("1.234"), "V")))); |
| | | simulator.advanceCollectors(Instant.parse("2026-08-29T01:00:00Z")); |
| | | |
| | | var realtime = controller.collectorRealtime(1); |
| | | var firstPage = controller.collectorHistory(1, 0, 2); |
| | | |
| | | assertTrue(realtime.online()); |
| | | assertTrue(realtime.measurements().stream().anyMatch(item -> item.metricCode().equals("custom_voltage"))); |
| | | assertEquals(2, firstPage.records().size()); |
| | | assertTrue(firstPage.hasMore()); |
| | | assertEquals(2, firstPage.nextOffset()); |
| | | |
| | | } |
| | | } |
| | | |
| | | @Test |
| | | void controllerPowersAllSimulatorDevicesWithoutResettingHistory() throws Exception |
| | | void controllerChangesOnlineFactsWithoutResettingChannelStatus() throws Exception |
| | | { |
| | | try (BtsDevelopmentSimulator simulator = new BtsDevelopmentSimulator(0)) |
| | | { |
| | | BtsDevelopmentSimulatorController controller = controller(simulator); |
| | | simulator.advanceCollectors(Instant.now()); |
| | | long historyCount = controller.state().collectors().get(0).historyRecordCount(); |
| | | simulator.updateChannel(1, 1, true, DeviceWorkStatus.PAUSED); |
| | | |
| | | var poweredOff = controller.setPower( |
| | | new BtsDevelopmentSimulatorController.SimulatorPowerCommand(false)); |
| | | |
| | | assertTrue(poweredOff.devices().stream().noneMatch(device -> device.online() |
| | | || device.channels().stream().anyMatch(channel -> channel.online()))); |
| | | assertTrue(poweredOff.devices().stream().noneMatch(device -> device.online())); |
| | | assertTrue(poweredOff.collectors().stream().noneMatch(collector -> collector.online())); |
| | | assertEquals(historyCount, poweredOff.collectors().get(0).historyRecordCount()); |
| | | assertEquals(DeviceWorkStatus.PAUSED, poweredOff.devices().get(0).channels().get(0).workStatus()); |
| | | |
| | | var poweredOn = controller.setPower( |
| | | new BtsDevelopmentSimulatorController.SimulatorPowerCommand(true)); |
| | | assertTrue(poweredOn.devices().stream().allMatch(device -> device.online() |
| | | && device.channels().stream().allMatch(channel -> channel.online() |
| | | && channel.workStatus() == DeviceWorkStatus.STOPPED))); |
| | | ))); |
| | | assertTrue(poweredOn.collectors().stream().allMatch(collector -> collector.online())); |
| | | } |
| | | } |