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
package cn.iocoder.yudao.module.mes.service.safety;
 
import cn.iocoder.yudao.module.hrm.api.employee.dto.HrmEmployeeSimpleDTO;
import cn.iocoder.yudao.module.mes.controller.admin.safety.vo.hazard.SafetyHazardAssignReqVO;
import cn.iocoder.yudao.module.mes.dal.dataobject.safety.SafetyHazardDO;
import cn.iocoder.yudao.module.mes.dal.mysql.safety.SafetyHazardMapper;
import cn.iocoder.yudao.module.system.api.notify.NotifyMessageSendApi;
import org.junit.jupiter.api.Test;
import org.springframework.test.util.ReflectionTestUtils;
import static org.junit.jupiter.api.Assertions.assertThrows;
import static org.mockito.ArgumentMatchers.*;
import static org.mockito.Mockito.*;
import org.mockito.ArgumentCaptor;
import cn.iocoder.yudao.module.system.api.notify.dto.NotifySendSingleToUserReqDTO;
import cn.iocoder.yudao.module.system.service.user.AdminUserService;
import java.util.List;
 
class SafetyHazardNoticeTest {
    @Test void unlinkedEmployeeCanUseExplicitNotificationAccount() {
        var service = new SafetyHazardService();
        var mapper = mock(SafetyHazardMapper.class);
        var resolver = mock(SafetyRefResolver.class);
        var notify = mock(NotifyMessageSendApi.class);
        var users = mock(AdminUserService.class);
        ReflectionTestUtils.setField(service, "hazardMapper", mapper);
        ReflectionTestUtils.setField(service, "refResolver", resolver);
        ReflectionTestUtils.setField(service, "notifyMessageSendApi", notify);
        ReflectionTestUtils.setField(service, "adminUserService", users);
        var hazard = new SafetyHazardDO(); hazard.setId(1L); hazard.setStatus("REPORTED"); hazard.setCode("HZ1"); hazard.setTitle("测试隐患");
        when(mapper.selectByIdForUpdate(1L)).thenReturn(hazard);
        var employee = new HrmEmployeeSimpleDTO(); employee.setId(2L); employee.setName("责任人");
        when(resolver.requireEmployee(eq(2L), any())).thenReturn(employee);
        when(notify.sendSingleMessageToAdmin(any())).thenReturn(9L);
        var req = new SafetyHazardAssignReqVO(); req.setId(1L); req.setAssigneeId(2L); req.setNotifyUserId(3L);
        service.assignHazard(req);
        var captor = ArgumentCaptor.forClass(NotifySendSingleToUserReqDTO.class);
        verify(notify).sendSingleMessageToAdmin(captor.capture());
        org.junit.jupiter.api.Assertions.assertEquals(3L, captor.getValue().getUserId());
        verify(users).validateUserList(List.of(3L));
    }
    @Test
    void disabledTemplateFailsAssignment() {
        var service = new SafetyHazardService();
        var mapper = mock(SafetyHazardMapper.class);
        var resolver = mock(SafetyRefResolver.class);
        var notify = mock(NotifyMessageSendApi.class);
        ReflectionTestUtils.setField(service, "hazardMapper", mapper);
        ReflectionTestUtils.setField(service, "refResolver", resolver);
        ReflectionTestUtils.setField(service, "notifyMessageSendApi", notify);
        ReflectionTestUtils.setField(service, "adminUserService", mock(AdminUserService.class));
        var hazard = new SafetyHazardDO(); hazard.setId(1L); hazard.setStatus("REPORTED"); hazard.setCode("HZ1"); hazard.setTitle("测试隐患");
        when(mapper.selectByIdForUpdate(1L)).thenReturn(hazard);
        var employee = new HrmEmployeeSimpleDTO(); employee.setId(2L); employee.setUserId(3L); employee.setName("责任人");
        when(resolver.requireEmployee(eq(2L), any())).thenReturn(employee);
        when(notify.sendSingleMessageToAdmin(any())).thenReturn(null);
        var req = new SafetyHazardAssignReqVO(); req.setId(1L); req.setAssigneeId(2L);
        assertThrows(RuntimeException.class, () -> service.assignHazard(req));
    }
    @Test
    void assignmentSendsNoticeToLinkedAccount() {
        var service = new SafetyHazardService();
        var mapper = mock(SafetyHazardMapper.class);
        var resolver = mock(SafetyRefResolver.class);
        var notify = mock(NotifyMessageSendApi.class);
        ReflectionTestUtils.setField(service, "hazardMapper", mapper);
        ReflectionTestUtils.setField(service, "refResolver", resolver);
        ReflectionTestUtils.setField(service, "notifyMessageSendApi", notify);
        ReflectionTestUtils.setField(service, "adminUserService", mock(AdminUserService.class));
        var hazard = new SafetyHazardDO(); hazard.setId(1L); hazard.setStatus("REPORTED"); hazard.setCode("HZ1"); hazard.setTitle("测试隐患");
        when(mapper.selectByIdForUpdate(1L)).thenReturn(hazard);
        var employee = new HrmEmployeeSimpleDTO(); employee.setId(2L); employee.setUserId(3L); employee.setName("责任人");
        when(resolver.requireEmployee(eq(2L), any())).thenReturn(employee);
        when(notify.sendSingleMessageToAdmin(any())).thenReturn(9L);
        when(mapper.updateById(any(SafetyHazardDO.class))).thenReturn(1);
        var req = new SafetyHazardAssignReqVO(); req.setId(1L); req.setAssigneeId(2L);
        service.assignHazard(req);
        var sent = ArgumentCaptor.forClass(NotifySendSingleToUserReqDTO.class);
        verify(notify).sendSingleMessageToAdmin(sent.capture());
        org.junit.jupiter.api.Assertions.assertEquals(3L, sent.getValue().getUserId());
        org.junit.jupiter.api.Assertions.assertEquals("HZ1", sent.getValue().getTemplateParams().get("code"));
    }
    @Test
    void rejectAssignmentWhenResponsibleEmployeeHasNoAccount() {
        var service = new SafetyHazardService();
        var mapper = mock(SafetyHazardMapper.class);
        var resolver = mock(SafetyRefResolver.class);
        var notify = mock(NotifyMessageSendApi.class);
        ReflectionTestUtils.setField(service, "hazardMapper", mapper);
        ReflectionTestUtils.setField(service, "refResolver", resolver);
        ReflectionTestUtils.setField(service, "notifyMessageSendApi", notify);
        var hazard = new SafetyHazardDO(); hazard.setId(1L); hazard.setStatus("REPORTED");
        when(mapper.selectByIdForUpdate(1L)).thenReturn(hazard);
        var employee = new HrmEmployeeSimpleDTO(); employee.setId(2L); employee.setName("责任人");
        when(resolver.requireEmployee(eq(2L), any())).thenReturn(employee);
        var req = new SafetyHazardAssignReqVO(); req.setId(1L); req.setAssigneeId(2L);
        assertThrows(RuntimeException.class, () -> service.assignHazard(req));
        verify(notify, never()).sendSingleMessageToAdmin(any());
        verify(mapper, never()).updateById(any(SafetyHazardDO.class));
    }
}