feat: add self-operated analytics and enforce Lastleg module boundaries
This commit is contained in:
+41
-8
@@ -1,7 +1,9 @@
|
||||
package com.baiyue.lastleg.service;
|
||||
|
||||
import com.baiyue.lastleg.entity.LastlegOrder;
|
||||
import com.baiyue.lastleg.fleet.customer.FleetCustomerDirectory;
|
||||
import com.baiyue.lastleg.service.reference.ReturnCustomerReferenceClient;
|
||||
import com.baiyue.common.core.api.ApiResponse;
|
||||
import com.baiyue.common.core.api.PageResult;
|
||||
import com.baiyue.lastleg.inboundplan.pda.gateway.WarehouseResourceGateway;
|
||||
import org.junit.jupiter.api.Test;
|
||||
import java.util.List;
|
||||
@@ -11,11 +13,11 @@ import static org.mockito.Mockito.*;
|
||||
class ReturnOrderReferenceResolverTest {
|
||||
@Test
|
||||
void directoryFailureBlocksNewSnapshotButDoesNotHideHistoricalOrders() {
|
||||
var customers = mock(FleetCustomerDirectory.class);
|
||||
var customers = mock(ReturnCustomerReferenceClient.class);
|
||||
var warehouses = mock(WarehouseResourceGateway.class);
|
||||
when(customers.find("1")).thenThrow(new org.springframework.web.server.ResponseStatusException(org.springframework.http.HttpStatus.SERVICE_UNAVAILABLE));
|
||||
when(customers.customers("test-token", 1, 30, null, "ACTIVE", 1L)).thenThrow(new org.springframework.web.server.ResponseStatusException(org.springframework.http.HttpStatus.SERVICE_UNAVAILABLE));
|
||||
when(warehouses.requireActiveSharedWarehouse(10L)).thenReturn(new WarehouseResourceGateway.WarehouseReference(10L, "USLAX01", "洛杉矶仓", "ACTIVE"));
|
||||
var resolver = new ReturnOrderReferenceResolver(customers, warehouses);
|
||||
var resolver = new ReturnOrderReferenceResolver(customers, warehouses, "test-token");
|
||||
org.junit.jupiter.api.Assertions.assertThrows(org.springframework.web.server.ResponseStatusException.class, () -> resolver.populate(List.of(order())));
|
||||
var historical = order();
|
||||
resolver.populateForRead(List.of(historical));
|
||||
@@ -24,24 +26,55 @@ class ReturnOrderReferenceResolverTest {
|
||||
|
||||
@Test
|
||||
void resolvesMissingReturnReferencesOncePerCustomerAndWarehouseAndPreservesSnapshots() {
|
||||
var customers = mock(FleetCustomerDirectory.class);
|
||||
var customers = mock(ReturnCustomerReferenceClient.class);
|
||||
var warehouses = mock(WarehouseResourceGateway.class);
|
||||
when(customers.find("1")).thenReturn(new FleetCustomerDirectory.Customer("1", "C1", "测试货主", null, null));
|
||||
when(customers.customers("test-token", 1, 30, null, "ACTIVE", 1L)).thenReturn(ApiResponse.success(new PageResult<>(
|
||||
List.of(new ReturnCustomerReferenceClient.Customer(1L, "C1", "测试货主", "ACTIVE", null, null)), 1, 30, 1, 1)));
|
||||
when(warehouses.requireActiveSharedWarehouse(10L)).thenReturn(new WarehouseResourceGateway.WarehouseReference(10L, "USLAX01", "洛杉矶仓", "ACTIVE"));
|
||||
LastlegOrder first = order(), second = order(), frozen = order();
|
||||
frozen.setCustomerName("原货主快照"); frozen.setOverseasWarehouseCode("OLD"); frozen.setOverseasWarehouseName("原仓库快照");
|
||||
|
||||
new ReturnOrderReferenceResolver(customers, warehouses).populate(List.of(first, second, frozen));
|
||||
new ReturnOrderReferenceResolver(customers, warehouses, "test-token").populate(List.of(first, second, frozen));
|
||||
|
||||
assertEquals("测试货主", first.getCustomerName());
|
||||
assertEquals("USLAX01", second.getOverseasWarehouseCode());
|
||||
assertEquals("洛杉矶仓", second.getOverseasWarehouseName());
|
||||
assertEquals("原货主快照", frozen.getCustomerName());
|
||||
assertEquals("原仓库快照", frozen.getOverseasWarehouseName());
|
||||
verify(customers, times(1)).find("1");
|
||||
verify(customers, times(1)).customers("test-token", 1, 30, null, "ACTIVE", 1L);
|
||||
verify(warehouses, times(1)).requireActiveSharedWarehouse(10L);
|
||||
}
|
||||
|
||||
@Test
|
||||
void foreignOrInactiveCustomerCannotSupplyReturnSnapshot() {
|
||||
var customers = mock(ReturnCustomerReferenceClient.class);
|
||||
var warehouses = mock(WarehouseResourceGateway.class);
|
||||
when(customers.customers("test-token", 1, 30, null, "ACTIVE", 1L)).thenReturn(ApiResponse.success(new PageResult<>(List.of(
|
||||
new ReturnCustomerReferenceClient.Customer(2L, "C2", "其他客户", "ACTIVE", null, null),
|
||||
new ReturnCustomerReferenceClient.Customer(1L, "C1", "停用客户", "DISABLED", null, null)), 1, 30, 2, 1)));
|
||||
var resolver = new ReturnOrderReferenceResolver(customers, warehouses, "test-token");
|
||||
var error = org.junit.jupiter.api.Assertions.assertThrows(org.springframework.web.server.ResponseStatusException.class,
|
||||
() -> resolver.populate(List.of(order())));
|
||||
assertEquals(400, error.getStatusCode().value());
|
||||
verifyNoInteractions(warehouses);
|
||||
}
|
||||
|
||||
@Test
|
||||
void unexpectedClientFailureDoesNotHideHistoricalReturnAndKeepsMissingNameUnknown() {
|
||||
var customers = mock(ReturnCustomerReferenceClient.class);
|
||||
var warehouses = mock(WarehouseResourceGateway.class);
|
||||
when(customers.customers("test-token", 1, 30, null, "ACTIVE", 1L)).thenThrow(new IllegalStateException("transport failure"));
|
||||
when(warehouses.requireActiveSharedWarehouse(10L)).thenReturn(new WarehouseResourceGateway.WarehouseReference(10L, "USLAX01", "洛杉矶仓", "ACTIVE"));
|
||||
var resolver = new ReturnOrderReferenceResolver(customers, warehouses, "test-token");
|
||||
var historical = order();
|
||||
resolver.populateForRead(List.of(historical));
|
||||
org.junit.jupiter.api.Assertions.assertNull(historical.getCustomerName());
|
||||
assertEquals("洛杉矶仓", historical.getOverseasWarehouseName());
|
||||
var error = org.junit.jupiter.api.Assertions.assertThrows(org.springframework.web.server.ResponseStatusException.class,
|
||||
() -> resolver.populate(List.of(order())));
|
||||
assertEquals(503, error.getStatusCode().value());
|
||||
}
|
||||
|
||||
private LastlegOrder order() {
|
||||
var order = new LastlegOrder(); order.setOrderType("RETURN_RELABEL");
|
||||
order.setCustomerId("1"); order.setOverseasWarehouseId("10"); return order;
|
||||
|
||||
Reference in New Issue
Block a user