刘光辉
3 小时以前 06f314545ac3514d7ce28939920866ae8188d31c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
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);
    }
}