| | |
| | | |
| | | import static org.junit.jupiter.api.Assertions.assertEquals; |
| | | import static org.junit.jupiter.api.Assertions.assertTrue; |
| | | import static org.mockito.Mockito.mock; |
| | | import static org.mockito.Mockito.when; |
| | | import java.time.Instant; |
| | | import java.time.LocalDateTime; |
| | | import java.util.Date; |
| | | import java.util.LinkedHashMap; |
| | | import java.util.List; |
| | | import java.util.Map; |
| | | import org.junit.jupiter.api.Test; |
| | |
| | | import com.battery.business.domain.TTest; |
| | | import com.battery.business.domain.TTestDataRevisionAction; |
| | | import com.battery.business.service.ITestLiveService.LiveState; |
| | | import com.battery.business.mapper.TTestMapper; |
| | | import com.battery.business.service.impl.TTestServiceImpl; |
| | | import com.battery.business.service.impl.TestDataQueryServiceImpl; |
| | | import com.battery.business.web.TTestController; |
| | | import org.springframework.test.util.ReflectionTestUtils; |
| | | |
| | | /** 控制台 REST/SSE 的业务时间统一为毫秒,平台响应保持原有格式。 */ |
| | | class ConsoleTimeContractTest |
| | |
| | | assertEquals(time, json.readTree(json.writeValueAsString(state)).get("updatedAt").longValue()); |
| | | assertEquals(time, json.readTree(json.writeValueAsString(Map.of("at", state.updatedAt()))).get("at").longValue()); |
| | | } |
| | | |
| | | @Test |
| | | void persistedDataEndpointsInterpretDatabaseLocalDateTimeAsUtcMillis() |
| | | { |
| | | var mapper = mock(TTestMapper.class); |
| | | var storedTest = new TTest(); storedTest.setTestId(42L); |
| | | when(mapper.selectTestById(42L)).thenReturn(storedTest); |
| | | var tests = new TTestServiceImpl(); |
| | | ReflectionTestUtils.setField(tests, "testMapper", mapper); |
| | | var controller = new TTestController(); |
| | | ReflectionTestUtils.setField(controller, "testDataQueryService", new TestDataQueryServiceImpl(mapper, tests)); |
| | | // JDBC 可将 UTC DATETIME(3) 返回为 LocalDateTime;它不是用户所在时区的本地时间。 |
| | | for (Object databaseTime : List.of(LocalDateTime.parse("2023-05-08T03:42:11.123"), |
| | | Instant.parse("2023-05-08T03:42:11.123Z"), new Date(1683517331123L))) |
| | | { |
| | | Map<String, Object> row = new LinkedHashMap<>(); |
| | | for (String field : List.of("deviceTime", "collectorDeviceTime", "captureSlot", "serverReceivedAt", "recordedAt", "absoluteTime")) |
| | | row.put(field, databaseTime); |
| | | row.put("deviceTimeRaw", "2023-05-08 11:42:11.123"); |
| | | row.put("temperature", null); |
| | | when(mapper.selectPersistedFinalRealtimeRecords(42L)).thenReturn(List.of(new LinkedHashMap<>(row))); |
| | | when(mapper.selectPersistedFinalStepRecords(42L)).thenReturn(List.of(new LinkedHashMap<>(row))); |
| | | when(mapper.selectPersistedFinalCycleRecords(42L)).thenReturn(List.of(new LinkedHashMap<>(row))); |
| | | for (AjaxResult result : List.of(controller.persistedRecords(42L), controller.persistedSteps(42L), controller.persistedCycles(42L))) |
| | | { |
| | | var item = json.readTree(json.writeValueAsString(result)).get("data").get(0); |
| | | for (String field : List.of("deviceTime", "collectorDeviceTime", "captureSlot", "serverReceivedAt", "recordedAt", "absoluteTime")) |
| | | { |
| | | assertTrue(item.get(field).isIntegralNumber(), field + ": " + item.get(field)); |
| | | assertEquals(1683517331123L, item.get(field).longValue()); |
| | | } |
| | | assertEquals("2023-05-08 11:42:11.123", item.get("deviceTimeRaw").asString()); |
| | | assertTrue(item.get("temperature").isNull()); |
| | | } |
| | | } |
| | | } |
| | | } |