Merge branch 'test' into dev

This commit is contained in:
2026-09-03 21:30:08 +08:00
25 changed files with 949 additions and 58 deletions
@@ -0,0 +1,37 @@
package com.baiyue.order.controller;
import com.baiyue.common.core.api.PageResult;
import com.baiyue.common.core.exception.BizException;
import com.baiyue.order.dto.PendingReviewOrderDtos;
import com.baiyue.order.service.PendingReviewOrderQueryService;
import jakarta.annotation.Resource;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.mock.mockito.MockBean;
import org.springframework.test.context.TestPropertySource;
import org.springframework.test.context.junit.jupiter.SpringJUnitConfig;
import java.util.List;
import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.assertThatThrownBy;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
@SpringJUnitConfig(InternalPendingReviewOrderController.class)
@TestPropertySource(properties = "baiyue.security.internal-service-token=0123456789abcdef0123456789abcdef")
class InternalPendingReviewOrderControllerTest {
@MockBean private PendingReviewOrderQueryService service;
@Resource private InternalPendingReviewOrderController controller;
@Test
void acceptsOnlyTheConfiguredInternalServiceToken() {
var query = new PendingReviewOrderDtos.Query(List.of("SEA-US"), null, null, null, null, null, 1, 20);
var page = new PageResult<PendingReviewOrderDtos.Row>(List.of(), 1, 20, 0, 0);
when(service.page(query)).thenReturn(page);
assertThatThrownBy(() -> controller.page(null, query)).isInstanceOf(BizException.class);
assertThatThrownBy(() -> controller.page("wrong", query)).isInstanceOf(BizException.class);
assertThat(controller.page("0123456789abcdef0123456789abcdef", query).data()).isSameAs(page);
verify(service).page(query);
}
}
@@ -0,0 +1,24 @@
package com.baiyue.order.controller;
import org.junit.jupiter.api.Test;
import java.nio.file.Files;
import java.nio.file.Path;
import static org.assertj.core.api.Assertions.assertThat;
class PendingReviewOrderOpenApiContractTest {
@Test
void documentsInternalPendingReviewPageAndStringIds() throws Exception {
String yaml = Files.readString(Path.of("src/main/resources/openapi/order-v1.yaml"));
assertThat(yaml)
.contains("/internal/order/v1/pending-review-orders:")
.contains("channelCodes")
.contains("createdStart")
.contains("createdEnd")
.contains("PendingReviewOrderRow:")
.contains("mainStatus: {type: string, enum: [PENDING_REVIEW]}")
.contains("orderId: {type: string, pattern: '^[1-9][0-9]*$'}")
.contains("warehouseId: {type: string, pattern: '^[1-9][0-9]*$'}");
}
}
@@ -0,0 +1,59 @@
package com.baiyue.order.repository;
import com.baiyue.order.entity.OrderEntity;
import com.baiyue.order.mapper.*;
import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import jakarta.annotation.Resource;
import org.junit.jupiter.api.Test;
import org.mockito.ArgumentCaptor;
import org.springframework.boot.test.mock.mockito.MockBean;
import org.springframework.test.context.junit.jupiter.SpringJUnitConfig;
import java.time.LocalDateTime;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.List;
import static org.assertj.core.api.Assertions.assertThat;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
@SpringJUnitConfig(OrderRepository.class)
class PendingReviewOrderRepositoryTest {
@MockBean private OrderMapper orderMapper;
@MockBean private OrderCargoMapper cargoMapper;
@MockBean private OrderPartyMapper partyMapper;
@MockBean private OrderInternalNoteMapper noteMapper;
@MockBean private OrderStatusHistoryMapper historyMapper;
@MockBean private OutboxEventMapper outboxMapper;
@MockBean private OrderChildPurgeMapper childPurgeMapper;
@MockBean private OrderIdempotencyRecordMapper idempotencyMapper;
@MockBean private InboundCodeSequenceMapper inboundCodeSequenceMapper;
@Resource private OrderRepository repository;
@Test
@SuppressWarnings({"rawtypes", "unchecked"})
void buildsSubmittedOnlyStablePageWithEverySupportedFilter() throws Exception {
when(orderMapper.selectPage(any(Page.class), any(Wrapper.class))).thenReturn(new Page<>());
repository.pendingReviewPage(List.of("SEA-US", "AIR-US"), 11L, 22L, "RK-1",
LocalDateTime.of(2026, 9, 1, 0, 0), LocalDateTime.of(2026, 9, 4, 0, 0), 3, 40);
ArgumentCaptor<Page<OrderEntity>> page = ArgumentCaptor.forClass(Page.class);
ArgumentCaptor<Wrapper<OrderEntity>> wrapper = ArgumentCaptor.forClass(Wrapper.class);
verify(orderMapper).selectPage(page.capture(), wrapper.capture());
assertThat(page.getValue().getCurrent()).isEqualTo(3);
assertThat(page.getValue().getSize()).isEqualTo(40);
assertThat(wrapper.getValue().getExpression().getNormal()).hasSizeGreaterThanOrEqualTo(15);
assertThat(wrapper.getValue().getExpression().getOrderBy()).hasSize(2);
String source = Files.readString(Path.of("src/main/java/com/baiyue/order/repository/OrderRepository.java"));
assertThat(source)
.contains(".eq(OrderEntity::getDeleted, false)")
.contains(".eq(OrderEntity::getStatus, OrderStatus.SUBMITTED)")
.contains(".in(channelCodes != null && !channelCodes.isEmpty(), OrderEntity::getChannelCode, channelCodes)")
.contains(".lt(createdBefore != null, OrderEntity::getCreatedAt, createdBefore)")
.contains(".orderByDesc(OrderEntity::getCreatedAt)")
.contains(".orderByDesc(OrderEntity::getId)");
}
}
@@ -0,0 +1,88 @@
package com.baiyue.order.service;
import com.baiyue.common.core.api.PageResult;
import com.baiyue.common.core.exception.BizException;
import com.baiyue.order.dto.PendingReviewOrderDtos;
import com.baiyue.order.entity.OrderCargoEntity;
import com.baiyue.order.entity.OrderEntity;
import com.baiyue.order.repository.OrderRepository;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.mockito.ArgumentCaptor;
import org.springframework.test.util.ReflectionTestUtils;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.List;
import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.assertThatThrownBy;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anyLong;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
class PendingReviewOrderQueryServiceTest {
private final OrderRepository repository = mock(OrderRepository.class);
private PendingReviewOrderQueryService service;
@BeforeEach
void setUp() {
service = new PendingReviewOrderQueryService();
ReflectionTestUtils.setField(service, "orders", repository);
}
@Test
void convertsShanghaiNaturalDatesToClosedDayRangeAndNormalizesFilters() {
when(repository.pendingReviewPage(any(), any(), any(), any(), any(), any(), anyLong(), anyLong()))
.thenReturn(new PageResult<>(List.of(), 2, 20, 0, 0));
service.page(new PendingReviewOrderDtos.Query(List.of(" SEA-US ", "SEA-US"), 11L, 22L,
" RK-1 ", LocalDate.of(2026, 9, 1), LocalDate.of(2026, 9, 3), 2, 20));
@SuppressWarnings("unchecked") ArgumentCaptor<List<String>> channels = ArgumentCaptor.forClass(List.class);
verify(repository).pendingReviewPage(channels.capture(), eq(11L), eq(22L), eq("RK-1"),
eq(LocalDateTime.of(2026, 9, 1, 0, 0)),
eq(LocalDateTime.of(2026, 9, 4, 0, 0)), eq(2L), eq(20L));
assertThat(channels.getValue()).containsExactly("SEA-US");
}
@Test
void mapsAuthoritativeOrderFieldsAndSumsPackageCounts() {
OrderEntity order = new OrderEntity();
order.setId(101L); order.setOrderNo("FL101"); order.setInboundCode("RK101");
order.setCustomerId(22L); order.setCustomerName("测试客户"); order.setReceivingWarehouseId(33L);
order.setChannelCode("SEA-US"); order.setChannelName("美线");
order.setCreatedAt(LocalDateTime.of(2026, 9, 3, 10, 30));
OrderCargoEntity first = cargo(101L, 2);
OrderCargoEntity second = cargo(101L, 3);
when(repository.pendingReviewPage(any(), any(), any(), any(), any(), any(), anyLong(), anyLong()))
.thenReturn(new PageResult<>(List.of(order), 1, 20, 1, 1));
when(repository.findCargoByOrderIds(null, List.of(101L))).thenReturn(List.of(first, second));
var result = service.page(new PendingReviewOrderDtos.Query(null, null, null, " ", null, null, 1, 20));
assertThat(result.records()).singleElement().satisfies(row -> {
assertThat(row.orderId()).isEqualTo(101L);
assertThat(row.warehouseId()).isEqualTo(33L);
assertThat(row.totalPackageCount()).isEqualTo(5);
assertThat(row.mainStatus()).isEqualTo("PENDING_REVIEW");
});
}
@Test
void rejectsReversedDatesAndBlankChannelValues() {
assertThatThrownBy(() -> service.page(new PendingReviewOrderDtos.Query(null, null, null, null,
LocalDate.of(2026, 9, 4), LocalDate.of(2026, 9, 3), 1, 20))).isInstanceOf(BizException.class);
assertThatThrownBy(() -> service.page(new PendingReviewOrderDtos.Query(List.of(" "), null, null,
null, null, null, 1, 20))).isInstanceOf(BizException.class);
}
private static OrderCargoEntity cargo(long orderId, int packageCount) {
OrderCargoEntity cargo = new OrderCargoEntity();
cargo.setOrderId(orderId); cargo.setPackageCount(packageCount);
return cargo;
}
}