feat(selfop): add bounded inventory flow diagnostic through account egress
This commit is contained in:
+32
@@ -311,6 +311,38 @@ class LingxingWmsClientTest {
|
||||
response.set(page("current", "size", 1, 1, 1, 1, ORDER).replace("\"code\":200", "\"code\":200,\"success\":" + success));
|
||||
assertThrows(LingxingWmsException.class, () -> client().queryPage(query(1, 1), context()));
|
||||
}
|
||||
private InventoryFlowRequest flow() {return new InventoryFlowRequest("W-DEMO","C-DEMO","SKU-DEMO",
|
||||
LocalDateTime.of(2026,9,14,8,0),LocalDateTime.of(2026,10,14,8,0));}
|
||||
@Test void flowUsesExactScopeSinglePageAndPreservesSignedChangeAndLargeId() throws Exception {
|
||||
response.set(page("current","size",1,1000,1,1,"""
|
||||
{"id":9223372036854775806,"customerCode":"C-DEMO","whCode":"W-DEMO","productSku":"SKU-DEMO",
|
||||
"productQuality":1,"bookQty":-3,"bookChangQty":"-3","closeQty":17,"createTime":"2026-10-13 12:00:00"}
|
||||
"""));
|
||||
var result=client().queryInventoryFlow(flow(),context());
|
||||
assertThat(path.get()).isEqualTo("/openapi/v2/stock/stockCellBook/page");
|
||||
var sent=mapper.readTree(body.get()).path("data");
|
||||
assertThat(sent.path("barcodeAccurate").asText()).isEqualTo("SKU-DEMO");
|
||||
assertThat(sent.path("size").asInt()).isEqualTo(1000);assertThat(sent.has("productQuality")).isFalse();
|
||||
assertThat(result.records().get(0).id()).isEqualTo("9223372036854775806");
|
||||
assertThat(result.records().get(0).bookQty()).isEqualByComparingTo("-3");
|
||||
assertThat(result.records().get(0).bookChangQty()).isEqualTo("-3");assertThat(calls.get()).isEqualTo(1);
|
||||
assertThat(completion.get().operation()).isEqualTo(Operation.INVENTORY_FLOW);
|
||||
}
|
||||
@Test void flowPermissionDenialIsScopedAndDoesNotStopOrdinaryQueries() {
|
||||
var c=client();response.set("{\"code\":11008,\"msg\":\"private\"}");
|
||||
var error=assertThrows(LingxingWmsException.class,()->c.queryInventoryFlow(flow(),context()));
|
||||
assertThat(error.code()).isEqualTo("LINGXING_WMS_FLOW_PERMISSION_DENIED");
|
||||
assertThat(completion.get().accountPaused()).isFalse();
|
||||
response.set(page("current","size",1,1,1,1,ORDER));
|
||||
assertThat(c.queryPage(query(1,1),context()).records()).hasSize(1);assertThat(calls.get()).isEqualTo(2);
|
||||
}
|
||||
@Test void flowRejectsUnboundedWindowBeforeSendingAndWrongSkuAfterResponse() {
|
||||
var q=flow();var c=client();
|
||||
assertThrows(LingxingWmsException.class,()->c.queryInventoryFlow(new InventoryFlowRequest(q.warehouseCode(),q.customerCode(),q.sku(),q.startTime(),q.startTime().plusDays(32)),context()));
|
||||
assertThat(calls.get()).isZero();
|
||||
response.set(page("current","size",1,1000,1,1,"{\"whCode\":\"W-DEMO\",\"customerCode\":\"C-DEMO\",\"productSku\":\"OTHER\"}"));
|
||||
contract(()->c.queryInventoryFlow(q,context()),"FLOW_IDENTITY_MISMATCH");
|
||||
}
|
||||
private LingxingWmsClient client() { return client(CollectionMode.BUSINESS, true, true); }
|
||||
private LingxingWmsClient client(CollectionMode mode, boolean grant, boolean budget) {
|
||||
var clock = new LingxingEgressGateTest.MutableClock(NOW);
|
||||
|
||||
Reference in New Issue
Block a user