package jnpf.dmsService; import com.fasterxml.jackson.databind.ObjectMapper; import jnpf.dmsMapper.DmsVersionPropertiesMapper; import jnpf.dmsEntity.storage.vo.DmsVersionProperties; import jnpf.exception.DataException; import org.junit.jupiter.api.Test; import java.util.UUID; import static org.junit.jupiter.api.Assertions.*; import static org.mockito.Mockito.*; class DmsVersionPropertiesServiceTest { DmsVersionPropertiesMapper mapper = mock(DmsVersionPropertiesMapper.class); DmsVersionPropertiesService service = new DmsVersionPropertiesService(mapper); ObjectMapper json = new ObjectMapper(); UUID version = UUID.randomUUID(); jnpf.dmsEntity.permission.entity.DmsFileVersionEntity row = new jnpf.dmsEntity.permission.entity.DmsFileVersionEntity(); @Test void insertsVersionWithSnapshotAndRejectsFailedPersistence() throws Exception { var value = json.readTree("{\"prepared_by_name\":\"张三\",\"reviewers\":[{\"user_id\":\"u\",\"name\":\"李四\"}]}"); when(mapper.insertVersion(row, value.toString())).thenReturn(1); service.insertVersion(row, value); verify(mapper).insertVersion(row, value.toString()); when(mapper.insertVersion(row, value.toString())).thenReturn(0); assertThrows(DataException.class, () -> service.insertVersion(row, value)); } @Test void retryComparesJsonSemanticallyAndNeverUpdatesStoredProperties() throws Exception { var saved = new DmsVersionProperties(); saved.setId(version); saved.setExtendedProperties(json.readTree("{\"prepared_by_name\":\"张三\",\"reviewers\":[]}")); when(mapper.find("t", version)).thenReturn(saved); service.verifyRetry("t", version, json.readTree("{\"reviewers\":[],\"prepared_by_name\":\"张三\"}")); assertThrows(DataException.class, () -> service.verifyRetry("t", version, json.readTree("{\"prepared_by_name\":\"修改姓名\"}"))); verify(mapper, never()).insertVersion(any(), nullable(String.class)); } @Test void omittedPropertiesRemainCompatibleWithLegacyVersionsAndCallers() { when(mapper.insertVersion(row, null)).thenReturn(1); service.insertVersion(row, null); verify(mapper).insertVersion(row, null); clearInvocations(mapper); service.verifyRetry("t", version, null); verifyNoInteractions(mapper); } @Test void rejectsMalformedKnownFieldsBeforeDatabaseWrite() throws Exception { for (String malformed : new String[]{"[]", "{\"reviewers\":\"人名\"}", "{\"reviewers\":[{\"name\":\"缺ID\"}]}", "{\"prepared_by_name\":12}"}) { var value = json.readTree(malformed); assertThrows(DataException.class, () -> service.insertVersion(row, value)); } verifyNoInteractions(mapper); } }