test(selfop): verify warehouse summary build transactions

This commit is contained in:
2026-10-13 10:04:06 +08:00
parent 25db631ff7
commit 2d7b6e4381
@@ -122,6 +122,7 @@ class OutboundCandidateBuildMySqlAcceptanceTest {
assertEquals(pointerBefore,jdbc.queryForMap("SELECT published_run_id,published_fact_revision FROM ll_selfop_sync_scope WHERE id=?",scopeId));
assertEquals(0L,jdbc.queryForObject("SELECT COUNT(*) FROM ll_selfop_outbound_discovery_scope WHERE source_account=?",Long.class,account));
assertTrue(transactionEvidence.inserts>0);assertFalse(transactionEvidence.nonTransactional);
assertEquals((skus*(long)days+499)/500,transactionEvidence.warehouseDailyInserts,"Each committed daily batch must write one warehouse summary");
BigDecimal quantity=jdbc.queryForObject("SELECT SUM(outbound_quantity) FROM ll_selfop_sku_daily_sales WHERE sales_run_id=?",BigDecimal.class,runId);
assertEquals(0,BigDecimal.valueOf((long)skus*days).compareTo(quantity));
assertEquals(0,quantity.compareTo(jdbc.queryForObject("SELECT SUM(observed_quantity) FROM ll_selfop_warehouse_daily_sales WHERE sales_run_id=?",BigDecimal.class,runId)));
@@ -188,6 +189,7 @@ class OutboundCandidateBuildMySqlAcceptanceTest {
private static int bounded(String key,int fallback,int min,int max){String value=System.getenv(key);int n=value==null?fallback:Integer.parseInt(value);assertTrue(n>=min&&n<=max,key+" outside bounded range");return n;}
private void captureStatementMetrics(){
report.put("buildMappedStatementCalls",transactionEvidence.calls);
report.put("warehouseDailyInsertStatements",transactionEvidence.warehouseDailyInserts);
report.put("buildMappedStatements",transactionEvidence.snapshot());
}
private void writeProgress()throws java.io.IOException {
@@ -200,7 +202,7 @@ class OutboundCandidateBuildMySqlAcceptanceTest {
@Intercepts({@Signature(type=Executor.class,method="update",args={MappedStatement.class,Object.class}),
@Signature(type=Executor.class,method="query",args={MappedStatement.class,Object.class,org.apache.ibatis.session.RowBounds.class,org.apache.ibatis.session.ResultHandler.class})})
public static class TransactionEvidence implements Interceptor {
long inserts,calls;boolean nonTransactional,active;
long inserts,warehouseDailyInserts,calls;boolean nonTransactional,active;
private final Map<String,long[]> metrics=new LinkedHashMap<>();
Map<String,Object> snapshot(){
Map<String,Object> result=new LinkedHashMap<>();metrics.forEach((id,m)->result.put(id,Map.of("calls",m[0],"failedCalls",m[1],"totalClientElapsedMs",m[2]/1000000.0,"maxClientElapsedMs",m[3]/1000000.0)));
@@ -209,8 +211,10 @@ class OutboundCandidateBuildMySqlAcceptanceTest {
@Override public Object intercept(Invocation invocation)throws Throwable {
if(!active)return invocation.proceed();
String id=((MappedStatement)invocation.getArgs()[0]).getId();
if(id.equals(OutboundAggregateMapper.class.getName()+".insertDaily")||id.equals(OutboundAggregateMapper.class.getName()+".insertProfiles")) {
inserts++;nonTransactional|=!TransactionSynchronizationManager.isActualTransactionActive();
boolean warehouseDaily=id.equals(OutboundAggregateMapper.class.getName()+".insertWarehouseDaily");
if(warehouseDaily||id.equals(OutboundAggregateMapper.class.getName()+".insertDaily")||id.equals(OutboundAggregateMapper.class.getName()+".insertProfiles")) {
inserts++;if(warehouseDaily)warehouseDailyInserts++;
nonTransactional|=!TransactionSynchronizationManager.isActualTransactionActive();
}
long start=System.nanoTime();boolean succeeded=false;calls++;
try {Object value=invocation.proceed();succeeded=true;return value;}