This commit is contained in:
2026-09-11 18:43:57 +08:00
parent 06b9f3eda7
commit dcd079b5b7
11 changed files with 130 additions and 10 deletions
@@ -60,7 +60,7 @@ class PriceBookContractTest {
void keepsPricingTaxModeSeparate() {
assertThat(PriceBookStatus.values()).containsExactly(
PriceBookStatus.PENDING_CONFIRMATION, PriceBookStatus.ACTIVE,
PriceBookStatus.SUPERSEDED, PriceBookStatus.FAILED);
PriceBookStatus.SUPERSEDED, PriceBookStatus.VOIDED, PriceBookStatus.FAILED);
assertThat(PricingTaxMode.values()).containsExactly(PricingTaxMode.TAX_INCLUDED, PricingTaxMode.TAX_EXCLUDED);
assertThat(PricingDestinationType.values()).containsExactly(PricingDestinationType.FBA, PricingDestinationType.OVERSEAS);
assertThat(PriceBookDtos.ParsedRate.class.getRecordComponents())
@@ -99,6 +99,7 @@ class PriceBookContractTest {
.contains("/api/platform/v1/fba-pricing/carrier-rates/price-books:")
.contains("/api/platform/v1/fba-pricing/carrier-rates/price-books/{versionId}:")
.contains("/api/platform/v1/fba-pricing/carrier-rates/price-books/{versionId}/publish:")
.contains("/api/platform/v1/fba-pricing/carrier-rates/price-books/{versionId}/void:")
.contains("/api/merchant/v1/first-leg/pricing/channels:")
.contains("/api/merchant/v1/first-leg/pricing/estimate:")
.contains("PriceBookStatus")
@@ -114,6 +115,8 @@ class PriceBookContractTest {
.contains("PriceBookParseIssue")
.contains("/api/platform/v1/fba-pricing/carrier-rates/price-books/{versionId}/source")
.contains("确认并立即生效")
.contains("PriceBookVoidRequest")
.contains("VOIDED")
.contains("SUPERSEDED");
String firstlegOpenapi = new ClassPathResource("openapi/firstleg-v1.yaml")
@@ -137,7 +137,30 @@ class PlatformPriceBookServiceTest {
assertThat(Arrays.stream(PlatformPriceBookService.class.getDeclaredMethods())
.filter(method -> java.lang.reflect.Modifier.isPublic(method.getModifiers()))
.map(java.lang.reflect.Method::getName).toList())
.containsOnly("list", "upload", "detail", "publish", "source");
.containsOnly("list", "upload", "detail", "publish", "voidPending", "source");
}
@Test
void voidsPendingVersionAndRetainsReasonForAudit() {
PriceBookVersionEntity pending = version(41L, PriceBookStatus.PENDING_CONFIRMATION);
when(repository.findVersion(41L)).thenReturn(pending);
org.mockito.Mockito.doAnswer(invocation -> {
PriceBookVersionEntity value = invocation.getArgument(0);
value.setStatus(PriceBookStatus.VOIDED.name());
value.setVoidedBy(7L);
value.setVoidReason(invocation.getArgument(3));
return null;
}).when(repository).voidPending(any(), any(), any(Long.class), any());
when(repository.listChannels(41L)).thenReturn(List.of());
when(repository.listRates(41L)).thenReturn(List.of());
var result = service.voidPending(41L, 7L, new PriceBookDtos.PriceBookVoidRequest(" 上传错误 "));
assertThat(result.version().status()).isEqualTo(PriceBookStatus.VOIDED);
assertThat(result.version().voidedBy()).isEqualTo(7L);
assertThat(result.version().voidReason()).isEqualTo("上传错误");
verify(repository).lockPlatformVersions();
verify(repository).voidPending(any(), any(), any(Long.class), org.mockito.ArgumentMatchers.eq("上传错误"));
}
@Test
@@ -284,6 +307,21 @@ class PlatformPriceBookServiceTest {
verify(repository, never()).activate(any(), any(), any(Long.class));
}
@Test
void olderPendingVersionCannotReplaceNewerActiveVersion() {
PriceBookVersionEntity pending = version(5L, PriceBookStatus.PENDING_CONFIRMATION);
PriceBookVersionEntity active = version(8L, PriceBookStatus.ACTIVE);
when(repository.findVersion(5L)).thenReturn(pending);
when(repository.listActiveForUpdate()).thenReturn(List.of(active));
assertThatThrownBy(() -> service.publish(5L, 7L, confirmation("CN-YIWU-01", 501L)))
.isInstanceOf(BizException.class)
.hasMessageContaining("早于当前生效版本");
verify(repository).lockPlatformVersions();
verify(repository, never()).activate(any(), any(), any(Long.class));
}
private static PriceBookVersionEntity version(long id, PriceBookStatus status) {
PriceBookVersionEntity value = new PriceBookVersionEntity();
value.setId(id);