优化
This commit is contained in:
@@ -45,7 +45,6 @@ public class OrderApplicationService {
|
||||
}
|
||||
|
||||
private Long createDraftInternal(long tenantId, long userId, OrderRequests.SaveRequest request) {
|
||||
eligibilityGuard.requireApproved(tenantId);
|
||||
validatePrototypeFields(request);
|
||||
var snapshots = masterDataGuard.validate(tenantId, request);
|
||||
OrderEntity order = new OrderEntity();
|
||||
@@ -61,7 +60,6 @@ public class OrderApplicationService {
|
||||
@Transactional
|
||||
public void updateDraft(long tenantId, long userId, long id, OrderRequests.SaveRequest request) {
|
||||
OrderEntity order = require(tenantId, id);
|
||||
eligibilityGuard.requireApproved(tenantId);
|
||||
validatePrototypeFields(request);
|
||||
var snapshots = masterDataGuard.validate(tenantId, request);
|
||||
if (order.getStatus() != OrderStatus.DRAFT && order.getStatus() != OrderStatus.REJECTED) {
|
||||
|
||||
@@ -1,6 +1,10 @@
|
||||
package com.baiyue.order.service;
|
||||
|
||||
import com.baiyue.common.core.api.ResultCode;
|
||||
import com.baiyue.common.core.exception.BizException;
|
||||
import com.baiyue.order.client.PartnerClient;
|
||||
import com.baiyue.order.client.WarehouseClient;
|
||||
import com.baiyue.order.dto.OrderRequests;
|
||||
import com.baiyue.order.entity.OrderEntity;
|
||||
import com.baiyue.order.entity.OrderStatus;
|
||||
import com.baiyue.order.repository.OrderRepository;
|
||||
@@ -8,11 +12,76 @@ import com.fasterxml.jackson.databind.ObjectMapper;
|
||||
import org.junit.jupiter.api.DisplayName;
|
||||
import org.junit.jupiter.api.Test;
|
||||
import org.springframework.test.util.ReflectionTestUtils;
|
||||
|
||||
import java.math.BigDecimal;
|
||||
import java.time.LocalTime;
|
||||
import java.util.List;
|
||||
|
||||
import static org.assertj.core.api.Assertions.*;
|
||||
import static org.mockito.Mockito.*;
|
||||
|
||||
@DisplayName("订单状态流转")
|
||||
class OrderApplicationServiceStateTest {
|
||||
@Test
|
||||
void unapprovedTenantCanCreateDraft() {
|
||||
OrderRepository repository = mock(OrderRepository.class);
|
||||
OrderEligibilityGuard eligibility = mock(OrderEligibilityGuard.class);
|
||||
OrderMasterDataGuard masterData = mock(OrderMasterDataGuard.class);
|
||||
OrderRequests.SaveRequest request = request();
|
||||
when(masterData.validate(10001L, request)).thenReturn(snapshots());
|
||||
when(repository.completeIdempotency(any(), anyLong())).thenReturn(1);
|
||||
|
||||
Long orderId = service(repository, eligibility, masterData)
|
||||
.createDraft(10001L, 2L, request, "draft-before-approval");
|
||||
|
||||
assertThat(orderId).isNotNull();
|
||||
verify(eligibility, never()).requireApproved(anyLong());
|
||||
verify(repository).insertOrder(argThat(order -> order.getStatus() == OrderStatus.DRAFT));
|
||||
}
|
||||
|
||||
@Test
|
||||
void unapprovedTenantCanUpdateDraft() {
|
||||
OrderRepository repository = mock(OrderRepository.class);
|
||||
OrderEligibilityGuard eligibility = mock(OrderEligibilityGuard.class);
|
||||
OrderMasterDataGuard masterData = mock(OrderMasterDataGuard.class);
|
||||
OrderRequests.SaveRequest request = request();
|
||||
OrderEntity order = new OrderEntity();
|
||||
order.setId(1L);
|
||||
order.setTenantId(10001L);
|
||||
order.setStatus(OrderStatus.DRAFT);
|
||||
when(repository.findOwned(10001L, 1L)).thenReturn(order);
|
||||
when(masterData.validate(10001L, request)).thenReturn(snapshots());
|
||||
when(repository.saveOrder(order)).thenReturn(1);
|
||||
|
||||
service(repository, eligibility, masterData).updateDraft(10001L, 2L, 1L, request);
|
||||
|
||||
verify(eligibility, never()).requireApproved(anyLong());
|
||||
verify(repository).replaceDraftChildren(10001L, 1L);
|
||||
verify(repository).saveOrder(argThat(saved -> saved.getStatus() == OrderStatus.DRAFT));
|
||||
}
|
||||
|
||||
@Test
|
||||
void unapprovedTenantStillCannotSubmitDraft() {
|
||||
OrderRepository repository = mock(OrderRepository.class);
|
||||
OrderEligibilityGuard eligibility = mock(OrderEligibilityGuard.class);
|
||||
OrderEntity order = new OrderEntity();
|
||||
order.setId(1L);
|
||||
order.setTenantId(10001L);
|
||||
order.setStatus(OrderStatus.DRAFT);
|
||||
when(repository.findOwned(10001L, 1L)).thenReturn(order);
|
||||
doThrow(new BizException(ResultCode.FORBIDDEN, "企业尚未通过审核"))
|
||||
.when(eligibility).requireApproved(10001L);
|
||||
|
||||
assertThatThrownBy(() -> service(repository, eligibility, mock(OrderMasterDataGuard.class))
|
||||
.submit(10001L, 2L, "u", 1L, "submit-before-approval"))
|
||||
.isInstanceOf(BizException.class)
|
||||
.extracting(exception -> ((BizException) exception).getResultCode())
|
||||
.isEqualTo(ResultCode.FORBIDDEN);
|
||||
|
||||
verify(eligibility).requireApproved(10001L);
|
||||
verify(repository, never()).saveOrder(any());
|
||||
}
|
||||
|
||||
@Test
|
||||
void repeatedSubmissionReturnsConflictWithoutDuplicatePersistence() {
|
||||
OrderRepository repository=mock(OrderRepository.class);
|
||||
@@ -28,4 +97,36 @@ class OrderApplicationServiceStateTest {
|
||||
.isInstanceOf(BizException.class).hasMessageContaining("重复提交");
|
||||
verify(repository,never()).saveOrder(any());
|
||||
}
|
||||
|
||||
private OrderApplicationService service(OrderRepository repository, OrderEligibilityGuard eligibility,
|
||||
OrderMasterDataGuard masterData) {
|
||||
OrderApplicationService service = new OrderApplicationService();
|
||||
ReflectionTestUtils.setField(service, "repository", repository);
|
||||
ReflectionTestUtils.setField(service, "eligibilityGuard", eligibility);
|
||||
ReflectionTestUtils.setField(service, "masterDataGuard", masterData);
|
||||
ReflectionTestUtils.setField(service, "json", new ObjectMapper());
|
||||
return service;
|
||||
}
|
||||
|
||||
private OrderRequests.SaveRequest request() {
|
||||
var party = new OrderRequests.Party(
|
||||
"公司", "联系人", "13800138000", null, "CN", null, "深圳", null, "地址", null);
|
||||
var cargo = new OrderRequests.Cargo(
|
||||
"货物", null, "CARTON", 1, BigDecimal.ONE, BigDecimal.ONE,
|
||||
null, null, null, null, null, false, null, null, null, null,
|
||||
null, null, null, null, null, null, null, null, null);
|
||||
return new OrderRequests.SaveRequest(
|
||||
7L, "客户", "SEA", null, "US", null, "目的仓", null, null,
|
||||
party, party, List.of(cargo), "PICKUP", 8L, "收货仓", "CH", "渠道",
|
||||
"BUY_DECLARATION", "LCL", false, "OVERSEAS", null, null, null);
|
||||
}
|
||||
|
||||
private OrderMasterDataGuard.Snapshots snapshots() {
|
||||
var partner = new PartnerClient.Partner(7L, 10001L, "客户", "ACTIVE", "SHIPPER", List.of("SHIPPER"));
|
||||
var warehouse = new WarehouseClient.Warehouse(8L, 10001L, "收货仓", "ACTIVE");
|
||||
var address = new WarehouseClient.Address("CN", "广东", "深圳", "南山", "518000", "测试路1号", null);
|
||||
var capability = new WarehouseClient.Capability("RECEIVING", true, LocalTime.of(16, 0));
|
||||
var receiving = new WarehouseClient.Detail(warehouse, List.of(address), List.of(capability));
|
||||
return new OrderMasterDataGuard.Snapshots(partner, receiving, null);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user