1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
package com.battery.business.service;
 
import static org.junit.jupiter.api.Assertions.*;
import static org.mockito.Mockito.*;
import java.time.Instant;
import java.util.*;
import com.battery.business.domain.*;
import com.battery.business.mapper.TTestMapper;
import org.h2.jdbcx.JdbcDataSource;
import org.junit.jupiter.api.Test;
import org.springframework.jdbc.core.JdbcTemplate;
 
class DashboardServiceTest {
    @Test
    void aggregatesAllTestsAtHongKongMidnightAndKeepsDeviceFactsSeparate() {
        var database = new JdbcDataSource(); database.setURL("jdbc:h2:mem:dashboard_" + UUID.randomUUID() + ";MODE=MySQL;DB_CLOSE_DELAY=-1");
        var jdbc = new JdbcTemplate(database);
        jdbc.execute("create table t_battery_group(group_id bigint, del_flag int)");
        jdbc.execute("insert into t_battery_group values(1,0),(2,1)");
        jdbc.execute("create table t_test_realtime_record(record_id bigint,test_id bigint,test_battery_id bigint,step_no int,cycle_no int)");
        jdbc.execute("create table t_test_battery(test_battery_id bigint,battery_no varchar(20),del_flag int)");
        jdbc.execute("create table t_test_channel_binding(channel_id bigint,test_id bigint,test_battery_id bigint)");
        jdbc.execute("create table t_detection_channel(channel_id bigint,cabinet_id bigint,del_flag int)");
        jdbc.execute("create table t_test(test_id bigint,test_status varchar(20),del_flag int)");
        jdbc.execute("insert into t_test values(1,'RUNNING',0),(2,'COMPLETED',0)");
        jdbc.execute("insert into t_test_battery values(1,'电池1',0),(2,'电池2',0)");
        jdbc.execute("insert into t_detection_channel values(1,7,0)");
        jdbc.execute("insert into t_test_channel_binding values(1,1,1),(1,2,2)");
        var tests = mock(ITTestService.class);
        var cabinets = mock(ITDetectionCabinetService.class);
        var mapper = mock(TTestMapper.class);
        var rows = new ArrayList<TTest>();
        for (int index = 0; index < 1001; index++) {
            var test = new TTest(); test.setTestId((long) index + 1); test.setTestStatus("RUNNING"); test.setReceptionStatus("PAUSED");
            test.setCreateTime(Date.from(Instant.parse(index == 0 ? "2026-08-31T15:59:59Z" : "2026-08-31T16:00:00Z"))); rows.add(test);
        }
        when(tests.selectTestList(any())).thenReturn(rows);
        var cabinet = new TDetectionCabinet(); cabinet.setCabinetId(7L); cabinet.setChannelCount(8); cabinet.setOnlineStatus("0");
        when(cabinets.selectDetectionCabinetList(any())).thenReturn(List.of(cabinet));
        var warning = new TTestWarningException(); warning.setExceptionId(3L); warning.setTestId(1L); warning.setExceptionType("DEVICE_OFFLINE");
        when(mapper.selectWarningExceptions(null, "OPEN")).thenReturn(List.of(warning));
        var result = new DashboardService(tests, cabinets, mapper, database).read(Instant.parse("2026-09-01T00:00:00Z"));
        assertEquals(1001, result.summary().testCount());
        assertEquals(1, result.summary().batteryGroupCount());
        assertEquals(1000, result.summary().todayCount());
        assertEquals(1000, result.summary().monthCount());
        assertEquals(List.of(1000L), result.trends().get("month").values());
        assertEquals(1, result.trends().get("year").values().get(7));
        assertEquals(1000, result.trends().get("year").values().get(8));
        assertEquals("在线", result.cabinets().get(0).onlineStatus());
        assertEquals(1, result.cabinets().get(0).usedChannels());
        assertEquals(1, result.cabinets().get(0).testCount());
        assertEquals("RUNNING", result.tests().get(0).status());
        assertEquals("PAUSED", result.tests().get(0).receptionStatus());
        assertEquals("设备离线", result.warnings().get(0).item());
    }
}