feat(fleet): integrate costs quotes operations and in-transit handovers
This commit is contained in:
+48
@@ -0,0 +1,48 @@
|
||||
package com.baiyue.lastleg.financefee.fleet;
|
||||
|
||||
import com.baiyue.lastleg.financefee.service.OverseasFeeCurrencyConverter;
|
||||
import com.baiyue.lastleg.fleet.maintenance.VehicleCareFinanceGateway;
|
||||
import com.baiyue.lastleg.mapper.LastlegEventOutboxMapper;
|
||||
import com.fasterxml.jackson.databind.ObjectMapper;
|
||||
import org.junit.jupiter.api.Test;
|
||||
import org.springframework.aop.framework.ProxyFactory;
|
||||
import org.springframework.jdbc.core.JdbcTemplate;
|
||||
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
|
||||
import org.springframework.jdbc.datasource.DriverManagerDataSource;
|
||||
import org.springframework.transaction.IllegalTransactionStateException;
|
||||
import org.springframework.transaction.annotation.AnnotationTransactionAttributeSource;
|
||||
import org.springframework.transaction.interceptor.TransactionInterceptor;
|
||||
import java.math.BigDecimal;
|
||||
import java.time.LocalDate;
|
||||
import java.util.*;
|
||||
import static org.assertj.core.api.Assertions.*;
|
||||
import static org.mockito.Mockito.*;
|
||||
|
||||
class VehicleCareFinanceAdapterTest {
|
||||
@Test void publicationCannotStartItsOwnTransactionAndConversionDelegatesToTheFeeOwner() {
|
||||
var converter = mock(OverseasFeeCurrencyConverter.class);
|
||||
var outbox = mock(LastlegEventOutboxMapper.class);
|
||||
var jdbc = mock(JdbcTemplate.class);
|
||||
var ds = new DriverManagerDataSource("jdbc:h2:mem:vehicle-adapter-" + UUID.randomUUID(), "sa", "");
|
||||
var adapter = new VehicleCareFinanceAdapter(converter, outbox, jdbc, new ObjectMapper());
|
||||
var proxy = new ProxyFactory(adapter); proxy.setProxyTargetClass(true);
|
||||
proxy.addAdvice(new TransactionInterceptor(new DataSourceTransactionManager(ds), new AnnotationTransactionAttributeSource()));
|
||||
var gateway = (VehicleCareFinanceGateway) proxy.getProxy();
|
||||
assertThatThrownBy(() -> gateway.publish(null)).isInstanceOf(IllegalTransactionStateException.class);
|
||||
verifyNoInteractions(outbox);
|
||||
var date = LocalDate.of(2026, 1, 1);
|
||||
when(converter.convert("USD", BigDecimal.TEN, date)).thenReturn(new OverseasFeeCurrencyConverter.Conversion("USD", new BigDecimal("10.00"), new BigDecimal("7.000000"), "2026-01", new BigDecimal("70.00")));
|
||||
assertThat(gateway.convert("USD", BigDecimal.TEN, date)).isEqualTo(new VehicleCareFinanceGateway.Conversion("USD", new BigDecimal("10.00"), new BigDecimal("7.000000"), "2026-01", new BigDecimal("70.00")));
|
||||
verify(converter).convert("USD", BigDecimal.TEN, date);
|
||||
}
|
||||
@Test void deliveryStatusReadsAreBoundedAndKeepActualOutboxState() {
|
||||
var ds = new DriverManagerDataSource("jdbc:h2:mem:vehicle-delivery-" + UUID.randomUUID() + ";DB_CLOSE_DELAY=-1", "sa", "");
|
||||
var jdbc = new JdbcTemplate(ds);
|
||||
jdbc.execute("CREATE TABLE ll_event_outbox(event_key VARCHAR(128),status VARCHAR(32))");
|
||||
jdbc.update("INSERT INTO ll_event_outbox VALUES('one','PENDING'),('two','DEAD'),('other','PUBLISHED')");
|
||||
var adapter = new VehicleCareFinanceAdapter(mock(OverseasFeeCurrencyConverter.class), mock(LastlegEventOutboxMapper.class), jdbc, new ObjectMapper());
|
||||
assertThat(adapter.deliveryStates(List.of())).isEmpty();
|
||||
assertThat(adapter.deliveryStates(List.of("one", "two"))).containsExactlyInAnyOrderEntriesOf(Map.of("one", "PENDING", "two", "DEAD"));
|
||||
assertThatThrownBy(() -> adapter.deliveryStates(Collections.nCopies(101, "one"))).hasMessageContaining("最多100");
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user