This commit is contained in:
2026-09-11 17:20:56 +08:00
parent c8e8245853
commit 458a4cfa50
8 changed files with 207 additions and 1 deletions
@@ -0,0 +1,33 @@
package com.baiyue.firstleg.dashboard;
import org.junit.jupiter.api.Test;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import java.util.Arrays;
import static org.assertj.core.api.Assertions.assertThat;
class DashboardMetricsContractTest {
@Test void exposesThePlatformDashboardEndpointWithBothReadPermissions() throws Exception {
assertThat(PlatformDashboardMetricsController.class.getAnnotation(RequestMapping.class).value())
.containsExactly("/api/platform/v1/first-leg/dashboard");
var method = PlatformDashboardMetricsController.class.getDeclaredMethod(
"metrics", com.baiyue.common.security.AuthenticatedUser.class);
assertThat(method.getAnnotation(GetMapping.class).value()).containsExactly("/operational-metrics");
assertThat(method.getAnnotation(PreAuthorize.class).value())
.contains("platform:firstleg:container:list", "platform:firstleg:customs:list");
}
@Test void queryCountsPhysicalTransitContainersAndDistinctPendingOrders() {
var sql = Arrays.stream(DashboardMetricsMapper.class.getDeclaredMethods())
.filter(method -> method.getName().equals("read"))
.findFirst().orElseThrow().getAnnotation(org.apache.ibatis.annotations.Select.class).value();
var statement = String.join("\n", sql);
assertThat(statement).contains("actual_sailing_at IS NOT NULL", "actual_warehouse_arrival_at IS NULL",
"booking.record_status = 'ACTIVE'", "ocean.status <> 'CANCELLED'",
"COUNT(DISTINCT inbound.order_id)", "customs_container.status <> 'COMPLETED'",
"item.deleted = 0", "inbound.deleted = 0", "LIKE '20%'", "LIKE '40%'", "LIKE '45%'");
}
}
@@ -0,0 +1,43 @@
package com.baiyue.firstleg.dashboard;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.junit.jupiter.MockitoExtension;
import java.math.BigDecimal;
import java.time.LocalDateTime;
import static org.assertj.core.api.Assertions.assertThat;
import static org.mockito.Mockito.when;
@ExtendWith(MockitoExtension.class)
class DashboardMetricsServiceTest {
@Mock DashboardMetricsMapper mapper;
@InjectMocks DashboardMetricsService service;
@Test void preservesOperationalCountsAndDecimalTeu() {
var asOf = LocalDateTime.of(2026, 9, 11, 12, 0);
when(mapper.read()).thenReturn(new DashboardMetricsMapper.MetricsProjection(
3L, new BigDecimal("4.25"), 1L, 7L, asOf));
var result = service.read();
assertThat(result.inTransitContainerCount()).isEqualTo(3);
assertThat(result.inTransitTeu()).isEqualByComparingTo("4.25");
assertThat(result.unknownContainerTypeCount()).isEqualTo(1);
assertThat(result.pendingCustomsOrderCount()).isEqualTo(7);
assertThat(result.asOf()).isEqualTo(asOf);
}
@Test void returnsZerosWhenTheDatabaseProjectionIsAbsent() {
when(mapper.read()).thenReturn(null);
var result = service.read();
assertThat(result.inTransitContainerCount()).isZero();
assertThat(result.inTransitTeu()).isEqualByComparingTo("0");
assertThat(result.pendingCustomsOrderCount()).isZero();
}
}