package jnpf.fileStorage.dms; import com.fasterxml.jackson.databind.ObjectMapper; import jnpf.base.ActionResult; import jnpf.exception.DataException; import jnpf.file.FileContentApi; import jnpf.file.FileContentEquality; import jnpf.model.filecontent.FileContentComparisonForm; import org.junit.Test; import org.springframework.mock.web.MockMultipartFile; import org.springframework.web.multipart.MultipartFile; import java.util.function.Function; import static org.junit.Assert.*; import static org.mockito.Mockito.*; import static org.mockito.ArgumentMatchers.*; public class FileContentEqualityTest { private static String file(String id, String extra) { return "[{\"fileId\":\""+id+"\",\"url\":\"/api/file/Image/annex/"+id+"\""+extra+"}]"; } @Test public void sameImmutableSourceIgnoresDisplayMetadataAndReceipts() { FileContentApi api = mock(FileContentApi.class); assertTrue(FileContentEquality.same(file("A", ""), file("A", ",\"name\":\"new name\",\"revisionEditReceipt\":\"temporary\""), api)); verifyNoInteractions(api); } @Test public void differentObjectsRequireTrustedBytesAndCannotUseClientChecksum() { FileContentApi api = mock(FileContentApi.class); ActionResult equal = new ActionResult<>(); equal.setCode(200); equal.setData(true); ActionResult different = new ActionResult<>(); different.setCode(200); different.setData(false); when(api.sameContent(eq("jnpf-dms"), any())).thenReturn(equal, different); assertTrue(FileContentEquality.same(file("A", ""), file("B", ""), api)); assertFalse(FileContentEquality.same(file("A", ",\"checksum\":\"forged\""), file("B", ",\"checksum\":\"forged\""), api)); } @Test public void missingDuplicateOrDifferentCountsCannotBeUnchanged() { FileContentApi api = mock(FileContentApi.class); for (String invalid : new String[]{"[]", "null", "broken", "[{\"fileId\":\"A\"}]", "[{\"fileId\":\"A\",\"url\":\"/A\"},{\"fileId\":\"A\",\"url\":\"/A\"}]"}) assertFalse(FileContentEquality.same(file("A", ""), invalid, api)); verifyNoInteractions(api); } @Test public void unavailableHashServiceDoesNotApproveContent() { assertThrows(DataException.class, () -> FileContentEquality.same(file("A", ""), file("B", ""), mock(FileContentApi.class))); } @Test public void serverReadsBytesWithoutPublishingOrTransformingFiles() { DmsCommonFileReader reader = mock(DmsCommonFileReader.class); DmsFileStorageService storage = mock(DmsFileStorageService.class); when(reader.withFile(anyString(), any(), anyString(), any())).thenAnswer(call -> { String url = call.getArgument(0); Function operation = call.getArgument(3); return operation.apply(new MockMultipartFile("file", "document.docx", "application/octet-stream", (url.endsWith("C") ? "changed bytes" : "identical bytes").getBytes(java.nio.charset.StandardCharsets.UTF_8))); }); FileContentImportService service = new FileContentImportService(reader, storage, mock(DmsApprovalPageMergeService.class), mock(DmsQianpiyeDocxWriter.class), mock(DmsDocxCommentCleaner.class), new ObjectMapper()); FileContentComparisonForm form = new FileContentComparisonForm(); form.setOriginal(file("A", "")); form.setCandidate(file("B", "")); assertTrue(service.sameContent(form)); form.setCandidate(file("C", "")); assertFalse(service.sameContent(form)); verifyNoInteractions(storage); } }