test(procurement): verify fee source recovery without duplicate debit

This commit is contained in:
2026-10-10 03:43:53 +08:00
parent c0fbe2698b
commit 373f1b2c18
@@ -129,6 +129,24 @@ class ProcurementFinancePersistenceTest {
assertThat(fees.selectById(fee.getId()).getWalletStatus()).isEqualTo("SETTLE_PENDING");
assertThat(jdbc.queryForObject("SELECT status FROM ll_procurement_wallet_attempt WHERE command_event_id=?",String.class,result.commandEventId())).isEqualTo("PENDING");
verify(commands,times(2)).publish(anyString(),anyLong(),anyString(),anyString(),any(),anyString(),anyLong());
var recoveredSource=new OverseasFeeSource();recoveredSource.setSourceFeeId(901L);
doReturn(recoveredSource).when(sources).publishSettled(anyString(),anyString(),any(),any(),any());
handle(result);handle(result);
var recovered=fees.selectById(fee.getId());
assertThat(recovered.getWalletStatus()).isEqualTo("SETTLED");
assertThat(recovered.getSourceFeeId()).isEqualTo(901L);
assertThat(recovered.getSettledCommandEventId()).isEqualTo(result.commandEventId());
assertThat(recovered.getWalletLedgerId()).isEqualTo(result.walletLedgerId());
assertThat(jdbc.queryForObject("SELECT status FROM ll_procurement_wallet_attempt WHERE command_event_id=?",String.class,result.commandEventId())).isEqualTo("SUCCEEDED");
assertThat(jdbc.queryForObject("SELECT COUNT(*) FROM ll_procurement_wallet_attempt WHERE fee_id=?",Integer.class,fee.getId())).isEqualTo(2);
verify(sources,times(2)).publishSettled(anyString(),anyString(),any(),any(),argThat(ref->ref.commandEventId().equals(result.commandEventId())));
verify(commands,times(2)).publish(anyString(),anyLong(),anyString(),anyString(),any(),anyString(),anyLong());
assertThat(service.sourceLinked(recovered)).isFalse();
assertThatThrownBy(()->service.requireShipmentReady(11)).hasMessageContaining("来源关联");
jdbc.update("INSERT INTO ll_event_outbox VALUES('OVERSEAS_PROCUREMENT_FEE','901','PUBLISHED')");
assertThat(service.sourceLinked(recovered)).isTrue();
service.requireShipmentReady(11);
}
@Test void freeSampleDoesNotPublishZeroMoneyAndCannotBeChangedByReplay() {