刘光辉
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
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
package jnpf.dmsIntegration.audit;
 
import jnpf.audit.model.AuditEventDTO;
import jnpf.audit.sdk.*;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.ObjectProvider;
import org.springframework.mock.web.MockHttpServletRequest;
import org.springframework.transaction.support.TransactionSynchronization;
import org.springframework.transaction.support.TransactionSynchronizationManager;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import java.util.Date;
import java.util.UUID;
import static jnpf.dmsIntegration.audit.DmsBusinessChangeAudit.values;
import static org.junit.jupiter.api.Assertions.*;
import static org.mockito.Mockito.*;
 
class DmsBusinessChangeAuditTest {
    final AuditEventPublisher publisher = mock(AuditEventPublisher.class);
    final DmsSystemAudit system = mock(DmsSystemAudit.class);
    final ObjectProvider<AuditClient> clients = mock(ObjectProvider.class);
    final AuditClient client = new AuditClient(new AuditContextCollector("jnpf-dms") {
        @Override public AuditEventDTO fill(AuditEventDTO event) {
            event.setClientEventId(UUID.randomUUID().toString()); event.setEventTime(new Date()); return event;
        }
    }, publisher, true);
    final DmsBusinessChangeAudit audit = new DmsBusinessChangeAudit(clients, system);
 
    void request() {
        RequestContextHolder.setRequestAttributes(new ServletRequestAttributes(new MockHttpServletRequest()));
        doAnswer(call -> { ((java.util.function.Consumer<AuditClient>)call.getArgument(0)).accept(client); return null; })
                .when(clients).ifAvailable(any());
    }
    void record() {
        audit.record("tenant", "CHANGE", "状态变更", "dms_version_states", "version",
                values("lifecycle_status", "PENDING_EFFECTIVE"), values("lifecycle_status", "EFFECTIVE"),
                "批准文件按日期生效", values("document_id", "document", "biz_sign", "signature"));
    }
    @AfterEach void clear() {
        if (TransactionSynchronizationManager.isSynchronizationActive()) {
            for (var sync : TransactionSynchronizationManager.getSynchronizations())
                sync.afterCompletion(TransactionSynchronization.STATUS_ROLLED_BACK);
            TransactionSynchronizationManager.clearSynchronization();
        }
        TransactionSynchronizationManager.setActualTransactionActive(false);
        RequestContextHolder.resetRequestAttributes();
        org.slf4j.MDC.clear();
    }
    @Test void successfulCommitPublishesFrozenDiffAndSignatureOnlyAfterCommit() {
        request(); TransactionSynchronizationManager.setActualTransactionActive(true);
        TransactionSynchronizationManager.initSynchronization();
        record(); verifyNoInteractions(publisher);
        for (var sync : TransactionSynchronizationManager.getSynchronizations()) sync.afterCommit();
        org.mockito.ArgumentCaptor<java.util.List<AuditEventDTO>> captor =
                org.mockito.ArgumentCaptor.forClass(java.util.List.class);
        verify(publisher).publishAsync(captor.capture());
        assertEquals(1, captor.getValue().size());
        var event = captor.getValue().getFirst();
        assertEquals("tenant", event.getTenantId()); assertEquals("dms_version_states", event.getTargetTable());
        assertTrue(event.getFieldDiffs().contains("PENDING_EFFECTIVE"));
        assertTrue(event.getFieldDiffs().contains("EFFECTIVE"));
        assertEquals("signature", event.getRelatedSigns().getFirst().getSignId());
        verifyNoInteractions(system);
    }
    @Test void rollbackDoesNotPublish() {
        request(); TransactionSynchronizationManager.setActualTransactionActive(true);
        TransactionSynchronizationManager.initSynchronization();
        record(); clear(); verifyNoInteractions(publisher, system);
    }
    @Test void noChangeDoesNotCreateAnEvent() {
        audit.record("tenant", "CHANGE", "状态变更", "dms_documents", "record",
                values("main_document_id", "main"), values("main_document_id", "main"), null, values());
        verifyNoInteractions(clients, publisher, system);
    }
    @Test void backgroundExecutionUsesSystemIdentityAndExplicitTenant() {
        record(); verify(system).record(argThat(event -> "0".equals(event.getOperatorId())
                && "tenant".equals(event.getTenantId()) && event.getReason() != null));
        verifyNoInteractions(clients, publisher);
    }
}