feat(fleet): integrate costs quotes operations and in-transit handovers

This commit is contained in:
2026-10-03 12:38:04 +08:00
parent 274ecac474
commit cb6c54ffe5
107 changed files with 7304 additions and 42 deletions
@@ -34,6 +34,27 @@ class DirectEventClientTest {
verifyNoInteractions(firstleg);
}
@Test void companyVehicleCostsUseTheirOwnFinanceEndpoint() {
var event = event(EventTypes.COMPANY_VEHICLE_COST_SUBMITTED);
var ack = ApiResponse.success(DeliveryAck.of(event, DeliveryAck.Outcome.APPLIED));
when(finance.vehicleCost("token", event)).thenReturn(ack);
assertThat(client.receive("token", event)).isSameAs(ack);
verify(finance).vehicleCost("token", event);
verifyNoMoreInteractions(finance);
verifyNoInteractions(firstleg);
}
@Test void companyCostValidationConflictsArePermanentButDependencyFailuresRetry() {
var event = event(EventTypes.COMPANY_VEHICLE_COST_SUBMITTED);
for (String code : new String[]{"FIN_400", "FIN_404", "FIN_409", "FIN_503"}) {
when(finance.vehicleCost("token", event)).thenReturn(new ApiResponse<>(code, "rejected", null, null, null, Instant.now()));
assertThatThrownBy(() -> client.receive("token", event))
.isInstanceOf(com.baiyue.common.web.EventDeliveryFailure.class)
.satisfies(error -> assertThat(com.baiyue.common.web.EventDeliveryFailure.isPermanent((Exception) error)).isEqualTo(!"FIN_503".equals(code)));
}
verifyNoInteractions(firstleg);
}
@Test void fulfillmentEventsAreSentOnlyToFirstleg() {
for (String type : new String[]{EventTypes.OVERSEAS_CONTAINER_UNLOADED,
EventTypes.OVERSEAS_INBOUND_ORDER_DETAINED_CHANGED, EventTypes.OVERSEAS_DELIVERY_COMPLETED}) {
@@ -57,6 +78,8 @@ class DirectEventClientTest {
EventTypes.WALLET_COMMAND_REQUESTED);
assertEndpoint(FinanceBusinessEventClient.class, "fee", "FINANCE_SERVICE_URL", "finance",
EventTypes.BUSINESS_FEE_SOURCE_CHANGED);
assertEndpoint(FinanceBusinessEventClient.class, "vehicleCost", "FINANCE_SERVICE_URL", "finance",
EventTypes.COMPANY_VEHICLE_COST_SUBMITTED);
}
private void assertEndpoint(Class<?> type, String method, String env, String property, String eventType) throws Exception {