刘光辉
117 分钟以前 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
package jnpf.dmsService;
 
import jnpf.base.UserInfo;
import jnpf.dmsEntity.compare.DmsCompareRequest;
import jnpf.dmsEntity.compare.DmsCompareTicket;
import jnpf.dmsEntity.permission.entity.DmsFileVersionEntity;
import jnpf.dmsEntity.permission.enums.DmsPermissionAction;
import jnpf.dmsEntity.permission.enums.DmsResourceType;
import jnpf.dmsEntity.preview.form.DmsFilePreviewTicketRequest;
import jnpf.dmsEntity.preview.vo.DmsFilePreviewTicketVO;
import jnpf.dmsMapper.DmsFileVersionMapper;
import jnpf.dmsPermission.DmsCurrentIdentity;
import jnpf.exception.DataException;
import org.junit.jupiter.api.Test;
import org.mockito.ArgumentCaptor;
import java.util.Date;
import java.util.UUID;
import static org.junit.jupiter.api.Assertions.*;
import static org.mockito.ArgumentMatchers.*;
import static org.mockito.Mockito.*;
 
class DmsFileCompareServiceTest {
    private final UUID document = UUID.randomUUID();
    private final DmsFileVersionEntity current = version(3);
    private final DmsFileVersionEntity historical = version(1);
 
    @Test void acceptsOlderVersionOfTheSameDocument() {
        assertDoesNotThrow(() -> DmsFileCompareService.validatePair(request(), current, historical));
    }
 
    @Test void rejectsCrossDocumentOrNonHistoricalInput() {
        historical.setDocumentId(UUID.randomUUID());
        assertThrows(DataException.class, () -> DmsFileCompareService.validatePair(request(), current, historical));
        historical.setDocumentId(document);
        historical.setVersionNo(4L);
        assertThrows(DataException.class, () -> DmsFileCompareService.validatePair(request(), current, historical));
        assertThrows(DataException.class, () -> DmsFileCompareService.validatePair(request(), current, current));
    }
 
    @Test void rejectsStaleCurrentAndUnsupportedFiles() {
        assertThrows(DataException.class, () -> DmsFileCompareService.validatePair(request(), version(4), historical));
        historical.setFileName("scan.pdf");
        assertThrows(DataException.class, () -> DmsFileCompareService.validatePair(request(), current, historical));
    }
 
    @Test void authorizesBothSourcesBeforeIssuingBoundPair() {
        DmsCurrentIdentity identity = mock(DmsCurrentIdentity.class);
        DmsPermissionDecisionService permissions = mock(DmsPermissionDecisionService.class);
        DmsFileVersionMapper versions = mock(DmsFileVersionMapper.class);
        DmsFilePreviewService previews = mock(DmsFilePreviewService.class);
        DmsCompareTicketIssuer issuer = mock(DmsCompareTicketIssuer.class);
        UserInfo user = new UserInfo(); user.setUserId("u1");
        when(identity.requireUser()).thenReturn(user);
        when(identity.tenantId(user)).thenReturn("t1");
        when(versions.selectCurrentEffective("t1", document)).thenReturn(current);
        when(versions.selectReadableByTenantAndId("t1", historical.getId())).thenReturn(historical);
        when(previews.createTicket(any())).thenAnswer(invocation -> {
            DmsFilePreviewTicketRequest r = invocation.getArgument(0);
            DmsFilePreviewTicketVO source = new DmsFilePreviewTicketVO();
            source.setFileVersionId(r.getResourceId()); source.setExpiresAt(new Date(System.currentTimeMillis() + 300_000));
            return source;
        });
        when(issuer.issue(any(), anyLong())).thenReturn("pair-ticket");
        DmsFileCompareService service = new DmsFileCompareService(identity, permissions, versions, previews, issuer);
        assertEquals("pair-ticket", service.createTicket(request()));
        verify(permissions).requireAllowed(DmsResourceType.FILE_VERSION, current.getId(), DmsPermissionAction.READ);
        verify(permissions).requireAllowed(DmsResourceType.FILE_VERSION, historical.getId(), DmsPermissionAction.READ);
        ArgumentCaptor<DmsCompareTicket> pair = ArgumentCaptor.forClass(DmsCompareTicket.class);
        verify(issuer).issue(pair.capture(), anyLong());
        assertEquals(historical.getId(), pair.getValue().getHistorical().getFileVersionId());
        assertEquals(current.getId(), pair.getValue().getCurrent().getFileVersionId());
        assertEquals("t1", pair.getValue().getTenantId());
        assertEquals("u1", pair.getValue().getUserId());
        reset(previews, issuer);
        doThrow(new DataException("denied")).when(permissions).requireAllowed(DmsResourceType.FILE_VERSION, historical.getId(), DmsPermissionAction.READ);
        assertThrows(DataException.class, () -> service.createTicket(request()));
        verifyNoInteractions(previews, issuer);
    }
 
    private DmsCompareRequest request() {
        DmsCompareRequest r = new DmsCompareRequest(); r.setDocumentId(document);
        r.setCurrentVersionId(current.getId()); r.setHistoricalVersionId(historical.getId()); r.setOperationId(UUID.randomUUID());
        return r;
    }
 
    private DmsFileVersionEntity version(long number) {
        DmsFileVersionEntity v = new DmsFileVersionEntity(); v.setId(UUID.randomUUID());
        v.setDocumentId(document); v.setVersionNo(number); v.setFileName("procedure.docx"); return v;
    }
}