云
5 天以前 a82d847bbb39e2417d4c9773ebc4fc51fdb0b8fc
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
package cn.iocoder.yudao.module.crm.service.quotation;
 
import cn.iocoder.yudao.framework.common.exception.ServiceException;
import cn.iocoder.yudao.module.bpm.api.task.BpmProcessInstanceApi;
import cn.iocoder.yudao.module.crm.dal.dataobject.bidbond.CrmBidBondDO;
import cn.iocoder.yudao.module.crm.dal.dataobject.quotation.CrmSaleQuotationDO;
import cn.iocoder.yudao.module.crm.dal.mysql.bidbond.CrmBidBondMapper;
import cn.iocoder.yudao.module.crm.dal.mysql.quotation.CrmSaleQuotationMapper;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.springframework.test.util.ReflectionTestUtils;
 
import java.lang.reflect.Proxy;
import java.util.concurrent.atomic.AtomicReference;
 
import static cn.iocoder.yudao.module.crm.enums.ErrorCodeConstants.SALE_QUOTATION_VOID_FAIL_STATUS;
import static cn.iocoder.yudao.module.crm.enums.ErrorCodeConstants.SALE_QUOTATION_VOID_FAIL_WON;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertNotNull;
import static org.junit.jupiter.api.Assertions.assertThrows;
 
class CrmSaleQuotationVoidTest {
 
    private final CrmSaleQuotationServiceImpl service = new CrmSaleQuotationServiceImpl();
 
    @BeforeEach
    void setUp() {
        ReflectionTestUtils.setField(service, "expiryHelper", new CrmSaleQuotationExpiryHelper());
    }
 
    @Test
    void voidDraftQuotation() {
        CrmSaleQuotationDO quote = new CrmSaleQuotationDO().setId(1L).setNo("BJ1").setStatus(0);
        AtomicReference<CrmSaleQuotationDO> updated = new AtomicReference<>();
        ReflectionTestUtils.setField(service, "saleQuotationMapper", quoteMapper(quote, updated));
 
        service.voidSaleQuotation(1L, "  客户取消本次采购  ");
 
        assertNotNull(updated.get());
        assertEquals(5, updated.get().getStatus());
        assertEquals(1, updated.get().getVoidType());
        assertEquals("客户取消本次采购", updated.get().getVoidReason());
        assertNotNull(updated.get().getVoidTime());
    }
 
    @Test
    void voidWonQuotationRejected() {
        CrmSaleQuotationDO quote = new CrmSaleQuotationDO().setId(1L).setNo("BJ1").setStatus(2).setBidBondId(9L);
        ReflectionTestUtils.setField(service, "saleQuotationMapper", quoteMapper(quote, new AtomicReference<>()));
        ReflectionTestUtils.setField(service, "bidBondMapper", bondMapper(new CrmBidBondDO().setId(9L).setBidResult(1)));
 
        ServiceException ex = assertThrows(ServiceException.class,
                () -> service.voidSaleQuotation(1L, "不再参与"));
        assertEquals(SALE_QUOTATION_VOID_FAIL_WON.getCode(), ex.getCode());
    }
 
    @Test
    void voidConvertedQuotationRejected() {
        CrmSaleQuotationDO quote = new CrmSaleQuotationDO().setId(1L).setNo("BJ1").setStatus(10);
        ReflectionTestUtils.setField(service, "saleQuotationMapper", quoteMapper(quote, new AtomicReference<>()));
 
        ServiceException ex = assertThrows(ServiceException.class,
                () -> service.voidSaleQuotation(1L, "不再参与"));
        assertEquals(SALE_QUOTATION_VOID_FAIL_STATUS.getCode(), ex.getCode());
    }
 
    @Test
    void voidProcessingQuotationCancelsProcess() {
        CrmSaleQuotationDO quote = new CrmSaleQuotationDO().setId(1L).setNo("BJ1").setStatus(1)
                .setProcessInstanceId("proc-1");
        AtomicReference<CrmSaleQuotationDO> updated = new AtomicReference<>();
        ReflectionTestUtils.setField(service, "saleQuotationMapper", quoteMapper(quote, updated));
        AtomicReference<String[]> cancelled = new AtomicReference<>();
        ReflectionTestUtils.setField(service, "bpmProcessInstanceApi", stub(BpmProcessInstanceApi.class,
                (proxy, method, args) -> {
                    if ("cancelProcessInstanceByAdmin".equals(method.getName())) {
                        cancelled.set(new String[]{(String) args[1], (String) args[2]});
                        return null;
                    }
                    throw new AssertionError(method.getName());
                }));
 
        service.voidSaleQuotation(1L, "项目取消");
 
        assertEquals(5, updated.get().getStatus());
        assertNotNull(cancelled.get());
        assertEquals("proc-1", cancelled.get()[0]);
        assertEquals("项目取消", cancelled.get()[1]);
    }
 
    private CrmSaleQuotationMapper quoteMapper(CrmSaleQuotationDO quote, AtomicReference<CrmSaleQuotationDO> updated) {
        return stub(CrmSaleQuotationMapper.class, (proxy, method, args) -> switch (method.getName()) {
            case "selectById" -> quote;
            case "updateById" -> {
                updated.set((CrmSaleQuotationDO) args[0]);
                yield 1;
            }
            default -> throw new AssertionError(method.getName());
        });
    }
 
    private CrmBidBondMapper bondMapper(CrmBidBondDO bond) {
        return stub(CrmBidBondMapper.class, (proxy, method, args) -> {
            if ("selectById".equals(method.getName())) {
                return bond;
            }
            throw new AssertionError(method.getName());
        });
    }
 
    private static <T> T stub(Class<T> type, java.lang.reflect.InvocationHandler handler) {
        return type.cast(Proxy.newProxyInstance(type.getClassLoader(), new Class<?>[]{type}, handler));
    }
}