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
package cn.iocoder.yudao.module.mes.service.pd.knowledge;
 
import cn.iocoder.yudao.module.mes.dal.dataobject.pd.knowledge.KnowledgeDO;
import cn.iocoder.yudao.module.mes.dal.mysql.pd.knowledge.KnowledgeMapper;
import cn.iocoder.yudao.module.mes.dal.mysql.pd.knowledge.KnowledgeStandardMapper;
import cn.iocoder.yudao.module.mes.dal.dataobject.md.item.MesMdProductBomDO;
import cn.iocoder.yudao.module.mes.service.md.item.MesMdItemService;
import cn.iocoder.yudao.module.mes.service.md.item.MesMdProductBomService;
import org.junit.jupiter.api.Test;
import org.springframework.test.util.ReflectionTestUtils;
import java.util.List;
import static org.junit.jupiter.api.Assertions.assertThrows;
import static org.mockito.Mockito.*;
 
class KnowledgeWriteServiceTest {
    @Test
    void bomMustBelongToSelectedProduct() {
        var mapper = mock(KnowledgeMapper.class);
        var items = mock(MesMdItemService.class);
        var boms = mock(MesMdProductBomService.class);
        when(boms.getProductBomListByItemId(42L)).thenReturn(java.util.List.of(new MesMdProductBomDO().setId(8L).setItemId(99L).setBomItemId(7L).setStatus(0)));
        var service = new KnowledgeWriteService();
        ReflectionTestUtils.setField(service, "knowledgeMapper", mapper);
        ReflectionTestUtils.setField(service, "itemService", items);
        ReflectionTestUtils.setField(service, "bomService", boms);
        var input = new KnowledgeWriteService.SaveRequest(); input.setCode("KN-BOM"); input.setName("测试");
        input.setMarket("ALL"); input.setProductItemId(42L); input.setBomId(7L);
        assertThrows(RuntimeException.class, () -> service.create(input));
        verifyNoInteractions(mapper);
    }
 
    @Test
    void referenceRequiresBothKnowledgeAndRoute() {
        var mapper = mock(KnowledgeMapper.class);
        var service = new KnowledgeWriteService();
        ReflectionTestUtils.setField(service, "knowledgeMapper", mapper);
        assertThrows(RuntimeException.class, () -> service.referenceRoute(1L, null));
        verifyNoInteractions(mapper);
    }
 
    @Test
    void emptyResourceCapabilityIsRejectedBeforeWriting() {
        var mapper = mock(KnowledgeMapper.class);
        var service = new KnowledgeWriteService();
        ReflectionTestUtils.setField(service, "knowledgeMapper", mapper);
        var input = new KnowledgeWriteService.SaveRequest();
        input.setCode("KN-2"); input.setName("测试知识"); input.setMarket("ALL");
        var resource = new KnowledgeWriteService.ResourceInput(); resource.setResourceType("OTHER");
        resource.setCapabilityDescription(" "); input.setResources(List.of(resource));
        assertThrows(RuntimeException.class, () -> service.create(input));
        verifyNoInteractions(mapper);
    }
 
    @Test
    void revisionRequiresPublishedSource() {
        var mapper = mock(KnowledgeMapper.class);
        var draft = new KnowledgeDO(); draft.setId(7L); draft.setStatus(0);
        when(mapper.selectById(7L)).thenReturn(draft);
        var service = new KnowledgeWriteService();
        ReflectionTestUtils.setField(service, "knowledgeMapper", mapper);
        assertThrows(RuntimeException.class, () -> service.revise(7L));
        verify(mapper, never()).insert(any(KnowledgeDO.class));
    }
 
    @Test
    void invalidMarketIsRejectedBeforeWriting() {
        var mapper = mock(KnowledgeMapper.class);
        var service = new KnowledgeWriteService();
        ReflectionTestUtils.setField(service, "knowledgeMapper", mapper);
        var input = new KnowledgeWriteService.SaveRequest();
        input.setCode("KN-1"); input.setName("测试知识");
        assertThrows(RuntimeException.class, () -> service.create(input));
        verifyNoInteractions(mapper);
    }
 
    @Test
    void publishedVersionCannotBeEdited() {
        var mapper = mock(KnowledgeMapper.class);
        var standards = mock(KnowledgeStandardMapper.class);
        var existing = new KnowledgeDO(); existing.setId(9L); existing.setStatus(1);
        when(mapper.selectById(9L)).thenReturn(existing);
        var service = new KnowledgeWriteService();
        ReflectionTestUtils.setField(service, "knowledgeMapper", mapper);
        ReflectionTestUtils.setField(service, "standardMapper", standards);
        var input = new KnowledgeWriteService.SaveRequest();
        input.setId(9L);
        assertThrows(RuntimeException.class, () -> service.update(input));
        verifyNoInteractions(standards);
    }
}