刘光辉
3 小时以前 06f314545ac3514d7ce28939920866ae8188d31c
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
115
116
package jnpf.dmsService;
 
import jnpf.base.UserInfo;
import jnpf.dmsEntity.fenfa.DmsWenjianDayinFasongEntity;
import jnpf.dmsEntity.fenfa.DmsWenjianDayinQuerenEntity;
import jnpf.dmsEntity.fenfa.DmsWenjianDayinRenwuEntity;
import jnpf.dmsEntity.fenfa.form.DmsWenjianDayinQuerenForm;
import jnpf.dmsMapper.DmsWenjianDayinQuerenMapper;
import jnpf.dmsMapper.DmsWenjianFenfaMapper;
import jnpf.dmsPermission.DmsCurrentIdentity;
import jnpf.exception.DataException;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.mockito.ArgumentCaptor;
import java.util.*;
import static org.junit.jupiter.api.Assertions.*;
import static org.mockito.Mockito.*;
 
class DmsWenjianDayinQuerenServiceTest {
    final DmsWenjianDayinHaomaService numbers = mock(DmsWenjianDayinHaomaService.class);
    private final DmsCurrentIdentity identity = mock(DmsCurrentIdentity.class);
    private final DmsWenjianFenfaMapper tasks = mock(DmsWenjianFenfaMapper.class);
    private final DmsWenjianDayinQuerenMapper receipts = mock(DmsWenjianDayinQuerenMapper.class);
    private final DmsWenjianDayinTaizhangService ledger = mock(DmsWenjianDayinTaizhangService.class);
    private final DmsWenjianFenfaService distribution = mock(DmsWenjianFenfaService.class);
    private final DmsWenjianDayinQuerenService service = new DmsWenjianDayinQuerenService(identity, tasks, receipts, ledger, distribution, numbers);
    private final DmsWenjianDayinQuerenForm form = new DmsWenjianDayinQuerenForm();
    private DmsWenjianDayinFasongEntity attempt;
    @BeforeEach
    void setup() throws Exception {
        UserInfo user = new UserInfo(); user.setUserId("user");
        when(identity.requireUser()).thenReturn(user);
        when(identity.tenantId(user)).thenReturn("tenant");
        form.setRequestId(UUID.randomUUID().toString()); form.setTaskId("task");
        form.setFileVersionId("version"); form.setCopies(3); form.setClientResult("SUBMITTED");
        DmsWenjianDayinRenwuEntity task = new DmsWenjianDayinRenwuEntity(); task.setDayinFenshu(3);
        when(tasks.selectPrintTaskForUpdate("tenant", "task")).thenReturn(task);
        when(ledger.list(any(), isNull(), eq("f_id"), eq("task"))).thenReturn(List.of(Map.of("f_id", "task")));
        DmsWenjianDayinQuerenEntity version = new DmsWenjianDayinQuerenEntity(); version.setFileVersionId("version");
        when(receipts.selectTaskVersion("tenant", "task")).thenReturn(version);
        when(distribution.printReserved(eq("task"), eq(3), anyList())).thenReturn(Collections.emptyList());
        when(receipts.insertConfirmation(any())).thenReturn(1);
        attempt = new DmsWenjianDayinFasongEntity();
        attempt.setId(form.getRequestId()); attempt.setTenantId("tenant"); attempt.setTaskId("task");
        attempt.setFileVersionId("version"); attempt.setUserId("user"); attempt.setCopies(3); attempt.setState("OPEN");
        attempt.setNumbersJson("[]");
        attempt.setBatchesJson("[{\"id\":\"batch\",\"state\":\"SUBMITTED\"}]");
        when(receipts.selectAttempt("tenant", form.getRequestId())).thenReturn(attempt);
        when(receipts.updateAttempt(any())).thenReturn(1);
    }
    @Test
    void missingOrUnknownAttemptCannotCreateRecords() {
        attempt.setNumbersJson("[]");
        attempt.setBatchesJson("[{\"id\":\"batch\",\"state\":\"SENDING\"}]");
        assertThrows(DataException.class, () -> service.confirm(form));
        when(receipts.selectAttempt("tenant", form.getRequestId())).thenReturn(null);
        assertThrows(DataException.class, () -> service.confirm(form));
        verifyNoInteractions(distribution);
    }
    @Test
    void onlySuccessfulClientResultMayWrite() {
        for (String result : Arrays.asList(null, "FAILED", "UNKNOWN", "SENDING")) {
            form.setClientResult(result);
            assertThrows(DataException.class, () -> service.confirm(form));
        }
        verifyNoInteractions(distribution, tasks, receipts);
    }
    @Test
    void responseLossCanBeRetriedWithoutSecondPrint() throws Exception {
        service.confirm(form);
        ArgumentCaptor<DmsWenjianDayinQuerenEntity> captor = ArgumentCaptor.forClass(DmsWenjianDayinQuerenEntity.class);
        verify(receipts).insertConfirmation(captor.capture());
        when(receipts.selectConfirmation("tenant", form.getRequestId())).thenReturn(captor.getValue());
        assertEquals(Collections.emptyList(), service.confirm(form));
        verify(distribution, times(1)).printReserved(eq("task"), eq(3), anyList());
        verify(receipts, times(1)).insertConfirmation(any());
        verify(ledger, times(1)).list(any(), isNull(), eq("f_id"), eq("task"));
    }
    @Test
    void conflictingIdCannotReuseReceipt() throws Exception {
        service.confirm(form);
        ArgumentCaptor<DmsWenjianDayinQuerenEntity> captor = ArgumentCaptor.forClass(DmsWenjianDayinQuerenEntity.class);
        verify(receipts).insertConfirmation(captor.capture());
        when(receipts.selectConfirmation("tenant", form.getRequestId())).thenReturn(captor.getValue());
        form.setCopies(2);
        assertThrows(DataException.class, () -> service.confirm(form));
        verify(distribution, times(1)).printReserved(eq("task"), eq(3), anyList());
    }
    @Test
    void partialConfirmationAcceptsRemainingAndRejectsExcess() throws Exception {
        when(tasks.countConsumedPrints("tenant", "task")).thenReturn(1);
        form.setCopies(3);
        assertThrows(DataException.class, () -> service.confirm(form));
        form.setCopies(2);
        attempt.setCopies(2);
        service.confirm(form);
        verify(distribution).printReserved(eq("task"), eq(2), anyList());
    }
    @Test
    void versionCopiesAndPermissionMustMatch() {
        form.setFileVersionId("wrong");
        assertThrows(DataException.class, () -> service.confirm(form));
        form.setFileVersionId("version"); form.setCopies(4);
        assertThrows(DataException.class, () -> service.confirm(form));
        form.setCopies(3);
        when(ledger.list(any(), isNull(), eq("f_id"), eq("task"))).thenReturn(Collections.emptyList());
        assertThrows(DataException.class, () -> service.confirm(form));
        verifyNoInteractions(distribution);
        verify(receipts, never()).insertConfirmation(any());
    }
    @Test
    void receiptFailurePropagatesForTransactionRollback() {
        when(receipts.insertConfirmation(any())).thenReturn(0);
        assertThrows(DataException.class, () -> service.confirm(form));
    }
}