刘光辉
4 小时以前 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
package jnpf.dmsService;
 
import jnpf.dmsEntity.center.DmsCenterActivation;
import jnpf.dmsEntity.permission.entity.DmsDocumentEntity;
import jnpf.dmsEntity.permission.entity.DmsFileVersionEntity;
import jnpf.dmsMapper.*;
import jnpf.dmsService.center.DmsCenterActivationService;
import jnpf.dmsService.search.DmsSearchIndexJobService;
import jnpf.exception.DataException;
import org.junit.jupiter.api.Test;
import java.util.*;
import static org.junit.jupiter.api.Assertions.*;
import static org.mockito.Mockito.*;
 
class DmsCenterActivationServiceTest {
    final DmsDocumentMapper documents = mock(DmsDocumentMapper.class);
    final DmsFileVersionMapper versions = mock(DmsFileVersionMapper.class);
    final DmsVersionStateMapper states = mock(DmsVersionStateMapper.class);
    final DmsSearchIndexJobService search = mock(DmsSearchIndexJobService.class);
    final jnpf.dmsIntegration.audit.DmsBusinessChangeAudit businessAudit = mock(jnpf.dmsIntegration.audit.DmsBusinessChangeAudit.class);
    final DmsCenterActivationService service = new DmsCenterActivationService(businessAudit, documents, versions, states, search);
    final UUID main = UUID.randomUUID(), record = UUID.randomUUID(), mainVersion = UUID.randomUUID(), recordVersion = UUID.randomUUID();
    final DmsDocumentEntity recordDocument = new DmsDocumentEntity();
    final DmsCenterActivation reuse = new DmsCenterActivation(main, mainVersion, mainVersion, "REUSE", null);
    final DmsCenterActivation retire = new DmsCenterActivation(record, recordVersion, recordVersion, "RETIRE", null);
    void arrange() {
        when(documents.selectByTenantAndIdForUpdate("tenant", main)).thenReturn(new DmsDocumentEntity());
        recordDocument.setMainDocumentId(main);
        when(documents.selectByTenantAndIdForUpdate("tenant", record)).thenReturn(recordDocument);
        DmsFileVersionEntity m = new DmsFileVersionEntity(); m.setId(mainVersion);
        DmsFileVersionEntity r = new DmsFileVersionEntity(); r.setId(recordVersion);
        when(versions.selectCurrentEffective("tenant", main)).thenReturn(m);
        when(versions.selectCurrentEffective("tenant", record)).thenReturn(r);
    }
    @Test void removesOnlyApprovedRecordFromCurrentAndKeepsMainAndPhysicalContent() {
        arrange(); when(states.retireCurrent("tenant", record, recordVersion, "actor")).thenReturn(1);
        var before = new jnpf.dmsIntegration.audit.DmsVersionStateAuditRow(); before.setLifecycleStatus("EFFECTIVE");
        var after = new jnpf.dmsIntegration.audit.DmsVersionStateAuditRow(); after.setLifecycleStatus("SUPERSEDED");
        after.setStatusReason("修订移除记录,保留历史");
        when(states.selectAuditState("tenant", recordVersion)).thenReturn(before, after);
        service.activate("tenant", "actor", List.of(reuse, retire));
        verify(states).retireCurrent("tenant", record, recordVersion, "actor");
        verify(states, times(2)).selectAuditState("tenant", recordVersion);
        verify(businessAudit).record(eq("tenant"), eq("DMS_VERSION_STATE_CHANGED"), anyString(), eq("dms_version_states"),
                eq(recordVersion.toString()), argThat(m -> "EFFECTIVE".equals(m.get("lifecycle_status"))),
                argThat(m -> "SUPERSEDED".equals(m.get("lifecycle_status"))), anyString(),
                argThat(m -> record.equals(m.get("document_id"))));
        verifyNoMoreInteractions(states, businessAudit);
        verifyNoInteractions(search);
        verify(documents, never()).bindMainDocument(any(), any(), any());
    }
    @Test void cannotRetireMainOrRecordFromDifferentDirectory() {
        arrange(); recordDocument.setMainDocumentId(null);
        assertThrows(DataException.class, () -> service.activate("tenant", "actor", List.of(reuse, retire)));
        recordDocument.setMainDocumentId(UUID.randomUUID());
        assertThrows(DataException.class, () -> service.activate("tenant", "actor", List.of(reuse, retire)));
        verifyNoInteractions(states, search);
    }
    @Test void staleRecordVersionCannotBeRetired() {
        arrange();
        DmsFileVersionEntity changed = new DmsFileVersionEntity(); changed.setId(UUID.randomUUID());
        when(versions.selectCurrentEffective("tenant", record)).thenReturn(changed);
        assertThrows(DataException.class, () -> service.activate("tenant", "actor", List.of(reuse, retire)));
        verifyNoInteractions(states, search);
    }
}