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<Boolean> equal = new ActionResult<>(); equal.setCode(200); equal.setData(true);
|
ActionResult<Boolean> 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<MultipartFile, Object> 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);
|
}
|
}
|