云
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
package cn.iocoder.yudao.module.crm.service.quotation;
 
import cn.iocoder.yudao.framework.common.exception.ServiceException;
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 static cn.iocoder.yudao.module.crm.enums.ErrorCodeConstants.SALE_QUOTATION_CONVERT_FAIL_BID_NOT_WON;
import static cn.iocoder.yudao.module.crm.enums.ErrorCodeConstants.SALE_QUOTATION_CONVERT_FAIL_BID_QUOTATION_MISMATCH;
import static cn.iocoder.yudao.module.crm.enums.ErrorCodeConstants.SALE_QUOTATION_CONVERT_FAIL_BID_REQUIRED;
import static cn.iocoder.yudao.module.crm.enums.ErrorCodeConstants.SALE_QUOTATION_CONVERT_FAIL_NOT_DRAFT;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertThrows;
 
class CrmSaleQuotationConvertGateTest {
 
    private final CrmSaleQuotationServiceImpl service = new CrmSaleQuotationServiceImpl();
 
    @BeforeEach
    void setUp() {
        ReflectionTestUtils.setField(service, "expiryHelper", new CrmSaleQuotationExpiryHelper());
    }
 
    @Test
    void needBidQuotationWithoutBondCannotConvert() {
        prepare(new CrmSaleQuotationDO().setId(1L).setNo("BJ1").setStatus(2).setNeedBid(true), null);
 
        ServiceException ex = assertThrows(ServiceException.class, () -> service.convertToContract(1L, 291L));
        assertEquals(SALE_QUOTATION_CONVERT_FAIL_BID_REQUIRED.getCode(), ex.getCode());
    }
 
    @Test
    void nullNeedBidTreatedAsRequired() {
        prepare(new CrmSaleQuotationDO().setId(1L).setNo("BJ1").setStatus(2), null);
 
        ServiceException ex = assertThrows(ServiceException.class, () -> service.convertToContract(1L, 291L));
        assertEquals(SALE_QUOTATION_CONVERT_FAIL_BID_REQUIRED.getCode(), ex.getCode());
    }
 
    @Test
    void notNeedBidQuotationUsesOriginalStatusRule() {
        prepare(new CrmSaleQuotationDO().setId(1L).setNo("BJ1").setStatus(1).setNeedBid(false), null);
 
        ServiceException ex = assertThrows(ServiceException.class, () -> service.convertToContract(1L, 291L));
        assertEquals(SALE_QUOTATION_CONVERT_FAIL_NOT_DRAFT.getCode(), ex.getCode());
    }
 
    @Test
    void boundQuotationRequiresWonBid() {
        prepare(new CrmSaleQuotationDO().setId(1L).setNo("BJ1").setStatus(2).setBidBondId(9L),
                new CrmBidBondDO().setId(9L).setNo("BZ9").setBidResult(2).setQuotationId(1L));
 
        ServiceException ex = assertThrows(ServiceException.class, () -> service.convertToContract(1L, 291L));
        assertEquals(SALE_QUOTATION_CONVERT_FAIL_BID_NOT_WON.getCode(), ex.getCode());
    }
 
    @Test
    void boundQuotationRequiresMatchingBid() {
        prepare(new CrmSaleQuotationDO().setId(1L).setNo("BJ1").setStatus(2).setBidBondId(9L),
                new CrmBidBondDO().setId(9L).setNo("BZ9").setBidResult(1).setQuotationId(8L));
 
        ServiceException ex = assertThrows(ServiceException.class, () -> service.convertToContract(1L, 291L));
        assertEquals(SALE_QUOTATION_CONVERT_FAIL_BID_QUOTATION_MISMATCH.getCode(), ex.getCode());
    }
 
    @Test
    void wonQuotationMustBeApproved() {
        prepare(new CrmSaleQuotationDO().setId(1L).setNo("BJ1").setStatus(0).setBidBondId(9L),
                new CrmBidBondDO().setId(9L).setNo("BZ9").setBidResult(1).setQuotationId(1L));
 
        ServiceException ex = assertThrows(ServiceException.class, () -> service.convertToContract(1L, 291L));
        assertEquals(SALE_QUOTATION_CONVERT_FAIL_NOT_DRAFT.getCode(), ex.getCode());
    }
 
    private void prepare(CrmSaleQuotationDO quote, CrmBidBondDO bond) {
        CrmSaleQuotationMapper quoteMapper = stub(CrmSaleQuotationMapper.class,
                (proxy, method, args) -> {
                    if ("selectById".equals(method.getName())) {
                        return quote;
                    }
                    throw new AssertionError(method.getName());
                });
        CrmBidBondMapper bondMapper = stub(CrmBidBondMapper.class,
                (proxy, method, args) -> {
                    if ("selectById".equals(method.getName())) {
                        return bond;
                    }
                    throw new AssertionError(method.getName());
                });
        ReflectionTestUtils.setField(service, "saleQuotationMapper", quoteMapper);
        ReflectionTestUtils.setField(service, "bidBondMapper", bondMapper);
    }
 
    private static <T> T stub(Class<T> type, java.lang.reflect.InvocationHandler handler) {
        return type.cast(Proxy.newProxyInstance(type.getClassLoader(), new Class<?>[]{type}, handler));
    }
}