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); } }