package jnpf.dmsService; import com.fasterxml.jackson.databind.ObjectMapper; import jnpf.permission.UserApi; import jnpf.permission.entity.UserEntity; 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.*; import static org.mockito.ArgumentMatchers.*; class DmsApprovedVersionPropertiesServiceTest { UserApi users = mock(UserApi.class); DmsApprovedVersionPropertiesService service = new DmsApprovedVersionPropertiesService(users, new ObjectMapper()); @Test void snapshotsOnlyPersistedReviewersAndDeduplicatesWithoutLosingOrder() { when(users.getUserName(anyList())).thenReturn(List.of(user("author", "制定人"), user("a", "审核甲"), user("b", "审核乙"))); var value = service.create("author", "[\"a\",\"b\",\"a\"]"); assertEquals("制定人", value.path("prepared_by_name").asText()); assertEquals(2, value.path("reviewers").size()); assertEquals("a", value.path("reviewers").get(0).path("user_id").asText()); assertEquals("审核乙", value.path("reviewers").get(1).path("name").asText()); verify(users).getUserName(List.of("a", "b", "author")); } @Test void scalarWorkflowOperatorBecomesOneReviewerWithoutNumericConversion() { String id = "878193794397329605"; when(users.getUserName(anyList())).thenReturn(List.of(user(id, "审核人"))); var value = service.create("author", id); assertEquals(1, value.path("reviewers").size()); assertEquals(id, value.path("reviewers").get(0).path("user_id").asText()); assertEquals("审核人", value.path("reviewers").get(0).path("name").asText()); verify(users).getUserName(List.of(id, "author")); } @Test void scalarAndArrayInputsProduceTheSamePublicSnapshot() { when(users.getUserName(anyList())).thenReturn(List.of(user("user-a", "审核人"))); assertEquals(service.create("author", "user-a"), service.create("author", "[\"user-a\"]")); } @Test void emptyFieldDoesNotInventAReviewer() { when(users.getUserName(anyList())).thenReturn(List.of(user("author", "制定人"))); for (String empty : Arrays.asList(null, "", " ", "[]")) { assertTrue(service.create("author", empty).path("reviewers").isEmpty()); } } @Test void missingDirectoryUserRetainsIdentityWithoutInventingName() { when(users.getUserName(anyList())).thenReturn(List.of()); var reviewer = service.create("author", "[\"deleted\"]").path("reviewers").get(0); assertEquals("deleted", reviewer.path("user_id").asText()); assertEquals("", reviewer.path("name").asText()); } @Test void malformedMappingsFailInsteadOfSilentlyDroppingReviewers() { for (String invalid : List.of("a,b", "{}", "null", "[null]", "[1]", "[\"\"]", "[{\"id\":\"a\"}]")) { assertThrows(DataException.class, () -> service.create("author", invalid), invalid); } verifyNoInteractions(users); } @Test void nullDirectoryResponsePreservesReviewerIdentity() { when(users.getUserName(anyList())).thenReturn(null); var value = assertDoesNotThrow(() -> service.create("author", "a")); assertEquals("", value.path("prepared_by_name").asText()); assertEquals("a", value.path("reviewers").get(0).path("user_id").asText()); assertEquals("", value.path("reviewers").get(0).path("name").asText()); } @Test void directoryExceptionDoesNotBlockSnapshotCreationOrLoseReviewerIds() { when(users.getUserName(anyList())).thenThrow(new IllegalStateException("directory unavailable")); var value = assertDoesNotThrow(() -> service.create("author", "[\"a\",\"b\"]")); assertEquals("", value.path("prepared_by_name").asText()); assertEquals(2, value.path("reviewers").size()); assertEquals("a", value.path("reviewers").get(0).path("user_id").asText()); assertEquals("b", value.path("reviewers").get(1).path("user_id").asText()); assertEquals("", value.path("reviewers").get(0).path("name").asText()); assertEquals("", value.path("reviewers").get(1).path("name").asText()); } @Test void partialDirectoryResponseKeepsNamesFoundAndIdsWithoutNames() { when(users.getUserName(anyList())).thenReturn(List.of(user("author", "制定人"), user("a", "审核甲"))); var value = service.create("author", "[\"a\",\"b\"]"); assertEquals("制定人", value.path("prepared_by_name").asText()); assertEquals("审核甲", value.path("reviewers").get(0).path("name").asText()); assertEquals("b", value.path("reviewers").get(1).path("user_id").asText()); assertEquals("", value.path("reviewers").get(1).path("name").asText()); } UserEntity user(String id, String name) { var u = new UserEntity(); u.setId(id); u.setRealName(name); return u; } }