This commit is contained in:
2026-08-21 10:43:25 +08:00
parent d5e9ba6d4c
commit e17f03e596
55 changed files with 775 additions and 173 deletions
@@ -97,7 +97,7 @@ class InventoryCommandServiceTest {
assertThrows(ResponseStatusException.class,
() -> service.hold("100", "7", new InventoryCommandRequests.Move(
"100", 201L, 6, "ORD-1", null, null, "hold-1", null)));
201L, 6, "ORD-1", null, null, "hold-1", null)));
verify(positions, never()).updateById(any(InventoryPosition.class));
verify(balances, never()).updateById(any(InventoryBalance.class));
}
@@ -129,7 +129,7 @@ class InventoryCommandServiceTest {
when(commands.palletPackages("100", 300L)).thenReturn(0L);
var result = service.ship("100", "7", new InventoryCommandRequests.Move(
"100", 201L, 5, "OUT-1", "OUT-1", null, "ship-1", null));
201L, 5, "OUT-1", "OUT-1", null, "ship-1", null));
assertTrue(result.palletEmpty());
assertEquals("EMPTY", position.getStatus());
@@ -137,6 +137,23 @@ class InventoryCommandServiceTest {
verify(ledgers).insert(any(InventoryLedger.class));
}
@Test
void platformHoldDerivesCustomerFromInventoryPosition() {
InventoryBalance balance = balance(200L, 5);
InventoryPosition position = position(201L, 200L, 5);
position.setCustomerId("200");
when(commands.findPosition(201L)).thenReturn(position);
when(commands.lockPosition("200", 201L)).thenReturn(position);
when(commands.lockBalance("200", 200L)).thenReturn(balance);
InventoryCommandRequests.Move request = new InventoryCommandRequests.Move(
201L, 2, "ORD-1", null, null, "platform-hold-1", null);
service.holdPlatform("7", request);
verify(commands).lockPosition("200", 201L);
verify(operations).findIdempotency("200", "platform-hold-1");
}
private InventoryCommandRequests.StockIn stockIn(String inbound, String key, long packages, long quantity) {
return new InventoryCommandRequests.StockIn("100", "Customer 100", "WH-1", "WH1", "Warehouse 1",
"DEST-1", "ONT8", "ONT8", 101L, inbound, "IN-CODE-1", "SKU-1", "Product 1", null,
@@ -44,14 +44,14 @@ class InventoryCommandControllerTest {
@Test
void permittedBackOfficeUserCanRunInventoryFormCommand() {
var request = move();
when(service.hold("100", "7", request)).thenReturn(response());
when(service.holdPlatform("7", request)).thenReturn(response());
controller.hold(user(Set.of(InventoryCommandController.MANAGE_PERMISSION)), request);
verify(service).hold("100", "7", request);
verify(service).holdPlatform("7", request);
}
@Test
void physicalAdjustmentRequiresDedicatedPermission() {
var request = new InventoryCommandRequests.Adjustment("100", 1L, 2, "COUNT", "ORD-1", "adj-1", null);
var request = new InventoryCommandRequests.Adjustment(1L, 2, "COUNT", "ORD-1", "adj-1", null);
ResponseStatusException exception = assertThrows(ResponseStatusException.class,
() -> controller.adjust(user(Set.of(InventoryCommandController.MANAGE_PERMISSION)), request));
assertEquals(403, exception.getStatusCode().value());
@@ -59,11 +59,11 @@ class InventoryCommandControllerTest {
}
private InventoryCommandRequests.Move move() {
return new InventoryCommandRequests.Move("100", 1L, 2, "ORD-1", null, null, "hold-1", null);
return new InventoryCommandRequests.Move(1L, 2, "ORD-1", null, null, "hold-1", null);
}
private AuthenticatedUser user(Set<String> permissions) {
return new AuthenticatedUser(7L, 100L, 100L, 8L, "operator", "MERCHANT", "WEB", permissions);
return new AuthenticatedUser(7L, 0L, 0L, 8L, "operator", "PLATFORM", "WEB", permissions);
}
private InventoryCommandResponse response() {
@@ -21,21 +21,21 @@ class InventoryQueryControllerTest {
1L, 20L, null, null, null, null, null, null, null, null, null, null, null, null);
@Test
void merchantCannotOverrideCustomerScope() {
controller.balances(user(100L, "MERCHANT"), "200", query);
verify(service).balances(eq("100"), eq(query));
void platformBalancePageQueriesAllCustomers() {
controller.balances(user(0L, "PLATFORM"), query);
verify(service).balances(eq(null), eq(query));
}
@Test
void platformMustSelectCustomer() {
void merchantCannotUsePlatformInventoryController() {
assertThrows(ResponseStatusException.class,
() -> controller.summary(user(0L, "PLATFORM"), null, query));
() -> controller.summary(user(100L, "MERCHANT"), query));
}
@Test
void platformCanQuerySelectedCustomer() {
controller.summary(user(0L, "PLATFORM"), "200", query);
verify(service).dashboard(eq("200"), eq(query));
void platformSummaryQueriesAllCustomers() {
controller.summary(user(0L, "PLATFORM"), query);
verify(service).dashboard(eq(null), eq(query));
}
@Test
@@ -43,7 +43,7 @@ class InventoryQueryControllerTest {
InventoryQueryRequests.PositionQuery positionQuery =
new InventoryQueryRequests.PositionQuery(null, null, null);
assertThrows(ResponseStatusException.class,
() -> controller.positions(null, null, 1L, positionQuery));
() -> controller.positions(null, 1L, positionQuery));
}
private static AuthenticatedUser user(long customerId, String appCode) {
@@ -65,6 +65,16 @@ class InventoryQueryServiceTest {
verify(mapper).balances("100", query, 0, 20);
}
@Test
void platformBalancePagePassesNoCustomerFilter() {
InventoryQueryRequests.BalanceQuery query = balanceQuery(null);
when(mapper.countBalances(null, query)).thenReturn(0L);
service.balances(null, query);
verify(mapper).countBalances(null, query);
}
@Test
void unknownStatusIsRejectedBeforeDatabaseQuery() {
InventoryQueryRequests.BalanceQuery query = balanceQuery("DAMAGED");
@@ -102,6 +112,20 @@ class InventoryQueryServiceTest {
assertEquals(7L, result.totalPackages());
}
@Test
void platformPositionDetailDerivesCustomerFromBalance() {
InventoryQueryRequests.PositionQuery query = new InventoryQueryRequests.PositionQuery(null, null, null);
InventoryBalance balance = new InventoryBalance();
balance.setId(99L);
balance.setCustomerId("200");
when(mapper.findBalance(99L)).thenReturn(balance);
when(mapper.positions("200", 99L, query)).thenReturn(List.of());
service.positions(null, 99L, query);
verify(mapper).positions("200", 99L, query);
}
@Test
void reversedLedgerDateRangeIsRejected() {
InventoryQueryRequests.LedgerQuery query = new InventoryQueryRequests.LedgerQuery(